This is a submission for the
Gemma 4 Challenge: Build with Gemma 4
What I Built
I built Ghost Job Detector, a simple web app that helps job seekers analyze suspicious job postings before they apply.
The idea came from a real frustration: many job posts look legitimate at first glance, but they can be vague, recycled, misleading, or even scams. Job seekers often spend time tailoring resumes and applying before realizing the opportunity may not be real.
Ghost Job Detector lets a user paste any job description and get a structured AI report that classifies the post as:
Legit job
Ghost job
Scam
Suspicious job posting
The app also explains why it reached that verdict, highlights red flags, translates coded HR language into plain English, and recommends who should or should not apply.
For example:
"Fast-paced environment" becomes "Expect pressure, shifting priorities, and possible overtime."
"Wear many hats" becomes "You may be covering multiple roles without matching compensation."
"Self-starter" becomes "There may be little onboarding, structure, or management support."
The goal is not to replace human judgment. The goal is to give job seekers a fast, practical second opinion before they share personal information or invest time in a questionable listing.
https://ghost-job-detector-rlcx.vercel.app/
The app flow is simple:
Paste a job description.
Click Analyze Job.
Review the verdict, confidence score, red flags, HR translation, and candidate-fit advice.
Key sections in the result:
Verdict: legit, ghost job, scam, or suspicious
Risk Signals: red flags and reasoning
HR Reality Translator: corporate phrases decoded into real meaning
Who Should Apply: inferred seniority, recommended roles, apply-if guidance, and do-not-apply-if guidance
Code
GitHub repository:
https://github.com/aliabdm/Ghost-Job-Detector
Tech stack:
Next.js App Router
TypeScript
Vanilla CSS
OpenRouter API
Gemma 4 models
Vercel deployment
Vercel Analytics
Optional Docker setup for local development
How I Used Gemma 4
Gemma 4 is the reasoning engine at the center of this project.
I used:
google/gemma-4-26b-a4b-it:free as the primary model
google/gemma-4-31b-it:free as the fallback model
I chose the 26B MoE Gemma 4 model as the primary model because this project needs more than basic classification. The model has to read a messy job description, reason about intent, identify weak hiring signals, decode HR language, and return a consistent structured JSON response.
The app asks Gemma 4 to return this normalized structure:
{
"verdict": "legit | ghost_job | scam | suspicious",
"confidence": 0.8,
"reasons": [],
"red_flags": [],
"summary": "",
"advice": "",
"hr_translation": [
{
"original": "",
"meaning": ""
}
],
"who_should_apply": {
"recommended_roles": [],
"skill_level": "",
"apply_if": [],
"do_not_apply_if": []
}
}
Gemma 4 powers these parts of the product:
Detecting ghost-job and scam signals
Classifying the post with a clear verdict
Explaining the reasoning in plain language
Translating vague HR phrases into practical meaning
Inferring the real seniority level behind the role
Recommending who should apply and who should avoid the post
I also added resilience around the model calls. If the primary Gemma 4 model is rate-limited or temporarily unavailable, the API silently retries once and then falls back to the Gemma 4 31B Dense model. If all Gemma 4 options are busy, the user gets a clean message instead of a broken UI.
That model choice was intentional: the 26B MoE model gives the app strong practical reasoning for user-facing analysis, while the 31B Dense model provides a stronger fallback path while keeping the whole project inside the Gemma 4 ecosystem.
What I Learned
The most interesting part of this build was designing the prompt and response handling.
A useful AI app needs more than a clever prompt. It needs:
A strict schema
Defensive JSON parsing
Fallback behavior
Clear UX when the model is busy
A result format that normal users can understand quickly
Gemma 4 was especially useful because the task depends on nuance. A suspicious job post is rarely suspicious because of one keyword. It is usually a combination of vague language, missing details, unrealistic requirements, odd application instructions, and implied working conditions.
That made this a good fit for a reasoning model instead of a simple rules engine.
Final Thoughts
Ghost Job Detector is a small project, but it solves a real problem: helping job seekers protect their time, attention, and personal information.
The job market is noisy. Gemma 4 made it possible to turn unstructured job descriptions into clear, actionable guidance.

Top comments (0)