A full-stack, personalized AI interview platform. From resume upload to offer letter.
JobPilot is a proof-of-concept for a next-gen AI interview agent that personalizes every question to the candidate's background and the target role — adapting tone in real time, coaching live, and scoring with hallucination checks.
Live demo credentials (pre-loaded with sample data):
Email: demo@jobpilot.ai
Password: Demo1234
- Python 3.11+ and Node.js 18+
- A free Groq API key → console.groq.com
git clone <repo-url>
cd jobpilot
cp backend/.env.example backend/.env
# Open backend/.env and set: GROQ_API_KEY=gsk_...cd backend
pip install -r requirements.txt
python seed.py # loads demo user + sample data
uvicorn app.main:app --reload --port 8000# new terminal
cd frontend
npm install
npm run devOpen http://localhost:5173 — log in with the demo credentials above.
cd backend
pytest tests/ -v┌─────────────────────────────────────────────────────────────────────┐
│ React 18 Frontend │
│ │
│ Dashboard │ Resume Analyzer │ Interview Room │ Video │ Job Tracker │
│ │
│ ┌─────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Zustand Store │ │ React Query │ │ react-hot-toast │ │
│ │ (interview, │ │ (server state) │ │ (notifications) │ │
│ │ auth state) │ └──────────────────┘ └──────────────────┘ │
│ └─────────────────┘ │
└──────────────────────────────┬──────────────────────────────────────┘
│ REST + SSE streaming
┌──────────────────────────────▼──────────────────────────────────────┐
│ FastAPI Backend │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ LangGraph Agent Layer │ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │
│ │ │ Resume Agent │ │ JD Analyzer │ │Interview Conductor│ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ PDF parsing │ │ Skill gap │ │ State machine: │ │ │
│ │ │ Skill extract│ │ Question bank│ │ INTRO→CORE→DONE │ │ │
│ │ │ Bullet rewrite│ │ Role-specific│ │ Adaptive tone │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │
│ │ │ Video Agent │ │ Evaluator │ │ Voice Agent │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ MediaPipe │ │ STAR scoring │ │ Whisper STT │ │ │
│ │ │ Eye contact │ │ Hallucination│ │ OpenAI TTS │ │ │
│ │ │ Confidence │ │ check │ │ ElevenLabs TTS │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ SQLite (dev) / PostgreSQL (prod) Redis (session checkpointing) │
└─────────────────────────────────────────────────────────────────────┘
The core differentiator — every interview is unique to the candidate:
Resume Upload
│
▼
┌─────────────────────────────────────────┐
│ Candidate Profile │
│ - Level: junior/mid/senior/staff │
│ - Skills: [Python, AWS, ...] │
│ - Weak areas: [ML, Mobile, ...] │
│ - Work history + bullet analysis │
└──────────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ JD Analysis │
│ - Required skills │
│ - Interview focus areas │
│ - Culture signals │
│ - Seniority level │
└──────────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Personalized Question Bank │
│ - Role-specific questions │
│ - Difficulty scaled to candidate level │
│ - Topics weighted by JD requirements │
│ - Skips topics candidate clearly knows │
└──────────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Adaptive Interview Loop │
│ │
│ Answer quality → tone adjustment │
│ Shallow answer → follow-up question │
│ Stress signals → supportive mode │
│ Strong answers → challenging mode │
│ Real-time coaching hints │
└─────────────────────────────────────────┘
- Resume Analyzer — Parse PDF/TXT, extract skills, score against JD, suggest STAR-method bullet rewrites
- AI Interview Conductor — LangGraph stateful agent with adaptive questioning, tone adjustment, and follow-up generation
- Real-Time Coaching — Live tips during the interview (STAR method reminders, metric suggestions)
- Post-Interview Report — Detailed scorecard with radar chart, per-question breakdown, improvement suggestions
- Job Tracker — Kanban board (Wishlist → Applied → Interviewing → Offer)
- Interview History — Browse all past sessions with search and filters
- Interview Replay — Replay any session with playback controls and per-message scoring
- Voice Mode — Speak your answers via Web Speech API, transcribed by OpenAI Whisper
- TTS Playback — Interviewer speaks questions aloud (OpenAI TTS / ElevenLabs)
- Video Screening — Record video answers, analyzed for eye contact, confidence, and engagement via MediaPipe
- Hallucination Check — Verifies the AI never asks about skills not on the resume
- Consistency Score — Measures how consistent the AI's scoring is across runs
- Score Trend — Dashboard shows improvement over multiple sessions
- Soft Skills Analysis — Confidence, specificity, executive presence, storytelling scores
- Peer Benchmarking — Percentile ranking against other candidates
- Create shareable interview templates
- Collect candidate submissions with pass/fail thresholds
- View full reports for each candidate
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Tailwind CSS, Zustand, React Query |
| Backend | Python 3.11+, FastAPI, LangGraph, LangChain |
| LLM | Groq (Llama 3.3) · OpenAI GPT-4o · Anthropic Claude |
| Voice | OpenAI Whisper (STT) + OpenAI TTS / ElevenLabs |
| Video | MediaPipe FaceMesh, OpenCV |
| Database | SQLite (dev) / PostgreSQL (prod) |
| Rate Limiting | SlowAPI |
| Deploy | Docker Compose + Nginx (HTTPS) |
Interactive docs at http://localhost:8000/docs
POST /api/auth/register Register new user
POST /api/auth/login Login
POST /api/resume/upload Parse resume (PDF/TXT)
GET /api/resume/user/{id} List user's resumes
POST /api/resume/{id}/match-jd Score resume vs job description
POST /api/resume/{id}/rewrite-bullets AI bullet rewrites
POST /api/interview/sessions Create interview session
POST /api/interview/sessions/{id}/message Send answer
GET /api/interview/sessions/{id}/stream-message SSE streaming
GET /api/interview/sessions/user/{id} List all sessions
POST /api/evaluation/sessions/{id}/evaluate Generate report
GET /api/evaluation/sessions/{id}/report Get report
GET /api/evaluation/users/{id}/insights Cross-session insights
POST /api/video/sessions/{id}/upload Upload video answer
GET /api/video/{id} Get analysis results
POST /api/voice/transcribe STT (Whisper)
POST /api/voice/synthesize TTS
See backend/.env.example for the full list. Only GROQ_API_KEY is required.
# Minimum to run everything
GROQ_API_KEY=gsk_...
# Optional — enables voice features
OPENAI_API_KEY=sk-...# Standard HTTP
docker-compose up
# HTTPS (required for video/microphone in production)
./nginx/gen-cert.sh
docker-compose -f docker-compose.https.yml up| Feature | Existing Tools | JobPilot |
|---|---|---|
| Scope | Interview only | Full job search funnel |
| Personalization | Generic questions | Resume + JD + behavior-aware |
| Feedback | Post-session only | Real-time coaching |
| Voice | Rare | Built-in Whisper STT + TTS |
| Video | None | Eye contact + confidence scoring |
| Job tracking | Separate tool | Integrated Kanban |
| Tone adaptation | None | Stress-aware (3 modes, automatic) |
| Hallucination check | None | Built-in consistency scoring |
| Recruiter tooling | None | Template creation + candidate tracking |
MIT