Visa-aware job intelligence platform with H-1B data, live jobs, salary insights, company comparison, and prediction tools.
Ghosted combines public H-1B/LCA data with salary records, company enrichment, and live hiring signals in a Dockerized full-stack app. The product is built around six public workflows: company discovery, live jobs, H-1B intelligence, salary insights, company comparison, and prediction tools for compensation and sponsorship odds.
Current tracked release: v0.6.5
Ghosted exists to answer a practical question for international candidates: which companies are likely to sponsor, how strong is the salary signal, and where are there active hiring opportunities right now?
The stack currently includes:
- Backend: Django, Django REST Framework, Celery, PostgreSQL, Redis
- Frontend: React 19, TypeScript, Vite, Tailwind CSS, React Query
- Infra: Docker Compose
Core product capabilities:
- Sponsorship-focused company discovery with visa-fair scoring
- Live jobs browsing with 10+ filter dimensions and auto-discovery on zero results
- H-1B applications table with FY2025 data, lottery statistics, and country-cap status
- Offer browsing with trust metadata and responsive pagination
- Domain and logo enrichment with graceful fallback rendering
- Automated ATS sync and discovery from supported public job boards
- Temporary resume-to-shortlist matching with a shared tailored PDF output
- Side-by-side company comparison
- Salary prediction and sponsorship-odds tools
- H-1B lottery calculator with country-specific odds
For the default local setup, install:
- Docker Desktop with Docker Compose
For manual development instead of Docker, also install:
- Python 3.12+
- Node.js 20+
- npm
docker compose up --buildThis starts the frontend, backend API, database, cache, Celery worker, Celery Beat scheduler, and the supporting local services defined in docker-compose.yml.
The Compose stack now defaults the backend to PostgreSQL whenever a database host is configured, so the API does not silently fall back to SQLite inside the container runtime.
Backend:
cd backend
pip install -r requirements.txt
python manage.py migrate
python manage.py runserverFrontend:
cd frontend
npm install
npm run devOnce the app is running, the public product surface centers on six areas:
Companies: browse sponsorship-friendly employers, visa scores, trust signals, and company detail pagesJobs: search live ATS roles with 10+ filter dimensions (workplace type, employment type, degree level, max experience, ATS source, visa support, date, salary), debounced search, and auto-discovery when no results are foundH1B Data: explore FY2025 H-1B applications with company/city/state normalization, lottery statistics across 5 fiscal years, and country-cap status with cap-type indicatorsOffers: explore salary records with source metadata, filters, and paginationCompare: evaluate two companies side by side on sponsorship strength, salary coverage, and live jobsPredictions: estimate salary expectations and sponsorship odds; calculate H-1B lottery chances with country-specific rates and masters cap advantage
Useful local verification commands:
docker compose exec frontend npm run build
docker compose exec backend python manage.py checkRaw source files are intentionally not committed. Put them in backend/data/ and follow backend/data/README.md when you want to seed or refresh local data.
For fuller company-logo coverage, add a Logo.dev publishable key to frontend/.env:
VITE_LOGO_DEV_PUBLISHABLE_KEY=your_key_hereWithout that key, the UI falls back to favicon-based branding when a known company domain is available.
Run import and enrichment commands from backend/:
python manage.py import_h1b_directory ./data --skip-existing --recalculate-scores
python manage.py enrich_company_branding --limit 10000
python manage.py sync_job_postings --limit 100These commands are useful when you want to:
- load multiple DOL disclosure files from a directory
- enrich company domains and branding metadata
- discover and refresh jobs from supported Greenhouse, Lever, and Ashby boards
- let the app infer public job boards from company websites and careers pages
After deployment, recurring job discovery and refresh are scheduled through Celery Beat so the jobs surface can keep itself fresh without manual reruns.
ghosted/
├── backend/
│ ├── ghosted/ # Django project settings, urls, wsgi
│ ├── companies/ # Company models, views, job syncing, services
│ ├── h1b_data/ # H-1B application models, serializers, import commands
│ ├── offers/ # Salary offer models and views
│ ├── predictions/ # Salary/lottery prediction models and services
│ ├── users/ # Custom user model, auth views
│ └── data/ # Raw CSV import directory (gitignored)
├── frontend/ # React + TypeScript + Vite application
│ ├── src/pages/ # 12 page components
│ ├── src/components/ # Shared UI components
│ └── src/api/ # Axios client and API hooks
├── docs/ # Plans, status notes, verification assets
├── assets/ # Banner and screenshot images
├── LICENSE # MIT license
└── docker-compose.yml # Local multi-service setup
Issues and focused pull requests are welcome. When proposing a change:
- keep the README aligned with the actual code changes
- include the relevant verification steps or results
- avoid documenting features that are not implemented yet
This project is licensed under the MIT License. See LICENSE.

