An AI-powered mock interview platform focused on Computer Science & Engineering (CSE) subjects — OOP, DSA, DBMS, OS, Networks, System Design, Programming languages, and CS Fundamentals — plus resume deep-dives, project grilling, rapid-fire screening, and behavioral/STAR practice.
Stack: Spring Boot 3 (Java 21, Maven) · React 18 + TypeScript + Vite · SQLite · Groq API (free tier: LLM + Whisper STT) · Browser SpeechSynthesis TTS · Docker + GitHub Actions CI.
- 7 interview modes — Subject (CSE topics), Resume Deep-Dive, Project Grill, Rapid Fire, Behavioral/STAR, System Design, JD Match.
- 110-question curated CSE bank with expected concepts per question; bank-first selection keeps most turns off the LLM (free-tier friendly), and the app works fully without an API key (heuristic fallback scoring).
- Adaptive interviews — LLM follow-ups when answers are shallow, difficulty up/down per answer, no repeated questions per session.
- Voice in, voice out — answers recorded in the browser, transcribed via Groq's
whisper-large-v3-turbo; questions spoken via the browser's built-in SpeechSynthesis (auto-speak toggle). - Voice delivery analytics — WPM, filler words, long pauses, with actionable coaching per answer.
- Server-side time enforcement — sessions with time limits are marked "answered late" (overtime) and factored into evaluation.
- Analytics — per-session radar (clarity/structure/depth), timeline replay, knowledge gaps, recommendations.
- Progress dashboard — cross-session score/WPM/filler trends, recurring weak CSE topics, per-subject breakdown.
- Reports — downloadable PDF per session and unguessable read-only share links.
- Multi-user ready — register/login with per-user data isolation (
SINGLE_USER_MODE=1keeps a local demo login-free). - Production hardening — CSRF protection, upload validation (size caps, extension allowlists, PDF magic bytes), per-IP rate limiting on LLM-heavy endpoints, uniform JSON error contract, structured logging.
Browser (React SPA, browser TTS)
│ /api (JSON + CSRF cookie)
▼
Spring Boot (port 8080)
├── web/ controllers + uniform { error } handling
├── service/ interview flow, Groq LLM/STT clients, question bank,
│ audio analytics, summary/progress, PDF reports
├── security/ session auth, CSRF, rate limiting
└── repository/ Spring Data JPA → SQLite (single file, volume-friendly)
│
▼
Groq API (OpenAI-compatible): llama-3.3-70b-versatile (chat)
whisper-large-v3-turbo (STT)
No GPU, no local model files, no Ollama install. To switch providers (e.g. xAI Grok), change LLM_BASE_URL, LLM_MODEL, and the API key in .env — no code changes.
- Get a free Groq API key at console.groq.com (no credit card; ~30 req/min, ~1k req/day) and put it in
.env:GROQ_API_KEY=gsk_... - Backend (JDK 21+ and Maven required):
cd server mvn spring-boot:run - Frontend (Node 18+):
Open http://localhost:5173 —
cd frontend-react npm install npm run dev/apiis proxied to the backend on port 8080.
cd server && mvn test # 32 hermetic tests, fully offline (Groq mocked)
cd frontend-react && npm run lint && npm run build
docker compose up --build
Serves the full app (SPA + API) on http://localhost:8080 with SQLite persisted to a named volume. Set SINGLE_USER_MODE=0 in .env before deploying publicly so login is required.
| Variable | Default | Purpose |
|---|---|---|
GROQ_API_KEY |
(empty) | Free key for LLM + STT. App stays usable without it (degraded mode). |
LLM_BASE_URL |
https://api.groq.com/openai/v1 |
OpenAI-compatible base URL. |
LLM_MODEL |
llama-3.3-70b-versatile |
Chat model. |
STT_MODEL |
whisper-large-v3-turbo |
Transcription model. |
LLM_TIMEOUT |
60 |
Seconds per LLM call (retry once on 429/5xx). |
SQLITE_PATH |
./interview.db |
Database file (mounted at /data in Docker). |
SINGLE_USER_MODE |
1 |
1 = local demo, no login. 0 = require accounts + ownership. |
ALLOWED_ORIGINS |
(empty) | Comma-separated CORS origins if hosting the SPA separately. |
RATE_LIMIT_*_PER_HOUR |
10/20/120 |
Per-IP hourly caps for profile/start/answer. |
- Any VPS:
docker compose up -dbehind your reverse proxy (Caddy/Nginx) with TLS — voice recording requires HTTPS outside localhost. - Render/Railway: use the Dockerfile; free tiers have ephemeral disks, so attach a persistent disk (or accept demo data resetting) for SQLite.
- Health probe:
GET /api/healthreports db status,llm_configured, and active engines.
Next rounds, in rough priority order:
- Email verification + password reset (django-allauth equivalent via Spring Mail).
- Postgres when concurrency grows; async queue (RabbitMQ/Redis) for report generation.
- Coding rounds — in-browser editor with execution via Piston/Judge0 for DSA mode.
- Company-specific packs (TCS NQT / Amazon-style) and topic-wise drills.
- Spaced-repetition weak-topic practice + streaks/gamification.
- More domains — ML/AI, Cloud/DevOps, ECE — the bank + prompt pattern generalizes.
- Regional language support, PWA/mobile app, recruiter-facing shared reports.
- Billing (Stripe) for free-tier quota protection at scale.
docs/legacy-spec.md preserves the original pre-Spring design spec for reference.