Most job posts today are unclear, exaggerated, or completely misleading.
Candidates often waste hours applying to roles that are:
- not actively hiring
- poorly defined
- designed to collect applications without real intent
Ghost Job Detector uses AI to decode job posts and reveal what companies actually mean behind corporate language.
Ghost Job Detector is a web app that analyzes job descriptions and classifies them as:
- Legit
- Ghost Job
- Scam
- Suspicious
But it goes beyond classification.
It explains WHY a job post is risky, translates corporate HR language into real meaning, and estimates who should actually apply.
- AI-powered job post classification
- Ghost job detection
- HR language translation into real meaning
- Candidate fit analysis
- Confidence scoring
- Structured JSON reasoning output
- Real-time fallback model system
- Fully responsive UI
- Paste a job description
- Click Analyze
- AI returns:
- Verdict (legit / ghost / scam / suspicious)
- Reasons
- Red flags
- HR translation
- Who should apply
The AI translates corporate phrases like:
- "Fast-paced environment" → Expect overwork and pressure
- "Wear many hats" → Multiple roles without proper compensation
- "Self-starter required" → Little guidance or onboarding
This project uses Google Gemma 4 as the reasoning engine:
google/gemma-4-26b-a4b-it:free(primary model)google/gemma-4-31b-it:free(fallback model)
Gemma is responsible for:
- interpreting job descriptions
- detecting deception signals
- translating HR language
- generating structured JSON output
The system enforces strict JSON output to ensure:
- consistent UI rendering
- safe parsing
- predictable AI behavior
- reliable fallback handling
This tool helps job seekers avoid wasting time on misleading job posts and improves decision-making before applying.
-
Next.js
-
TypeScript
-
Vanilla CSS
-
OpenRouter API
-
Gemma 4 Models
-
Vercel Deployment
-
Docker for optional local containerized runs
-
Vercel-ready deployment
The app uses OpenRouter with Gemma models only.
Primary model:
google/gemma-4-26b-a4b-it:free
Fallback order:
google/gemma-4-26b-a4b-it:free
google/gemma-4-31b-it:free
If a model is rate-limited or fails, the API silently retries once after 2 seconds, then moves to the next Gemma 4 model. If all Gemma 4 models fail, the user sees a clean busy message.
Create .env.local for local development:
OPENROUTER_KEY=sk-or-v1-your-key-hereFor Vercel, add the same variable in:
Project Settings > Environment Variables
Never commit .env.local.
Install dependencies:
npm installStart the dev server:
npm run devOpen:
http://localhost:3000
Production build:
npm run build
npm run startBuild the image:
docker build -t ghost-job-detector .Run using .env.local:
docker run --rm -p 3000:3000 --env-file .env.local ghost-job-detectorRun by passing the key directly:
docker run --rm -p 3000:3000 -e OPENROUTER_KEY=sk-or-v1-your-key-here ghost-job-detectorOpen:
http://localhost:3000
PowerShell:
$env:OPENROUTER_KEY="sk-or-v1-your-key-here"
docker compose up --buildBash:
OPENROUTER_KEY=sk-or-v1-your-key-here docker compose up --buildStop Docker Compose:
docker compose downIf an old container is already using port 3000, check running containers:
docker psStop the current app container:
docker stop ghost-job-detector-liveRebuild and run the latest code:
docker build -t ghost-job-detector .
docker run --rm -d --name ghost-job-detector-live -p 3000:3000 --env-file .env.local ghost-job-detectorView logs:
docker logs -f ghost-job-detector-liveStop it:
docker stop ghost-job-detector-liveThen rebuild and restart Docker:
docker stop ghost-job-detector-live
docker build -t ghost-job-detector .
docker run --rm -d --name ghost-job-detector-live -p 3000:3000 --env-file .env.local ghost-job-detectorThis project is part of the Gemma 4 Challenge submission.
