A live, role-calibrated technical interview simulator powered by Groq + LLaMA.
Pick a candidate profile, answer questions across five AI/ML domains in a real-time chat, and receive a structured evaluation report at the end β all in ~6 minutes, no sign-up required.
π Live Demo: https://aiinterviewr.netlify.app
π» GitHub: https://github.com/prashant371/InterviewAI
InterviewAI simulates a complete technical interview for modern AI/ML roles. A language model acts as the interviewer β asking one calibrated question at a time, following up on weak answers, and adapting its vocabulary and depth to the candidate's experience level and role. At the end, it produces a structured feedback report with strengths, gaps, and concrete next steps.
The project was built during an AI & Cloud Computing internship at Jain (Deemed-to-be University) (June 2026).
Technical interviews often feel arbitrary β candidates have no way to benchmark their readiness against role-calibrated AI/ML questions before the real thing. InterviewAI fills that gap: a realistic, adaptive simulator that covers the exact domains (RAG, embeddings, prompt engineering, agentic workflows, production deployment) increasingly asked in AI engineering roles, accessible to anyone with a browser.
- 8 role-calibrated candidate profiles β from CS Intern to Distinguished Engineer, plus non-technical roles like Business Analyst and Marketing Manager. Each profile automatically calibrates question depth and vocabulary.
- Live adaptive interviewing β one question at a time, with follow-up questions on weak answers, conducted by a real LLM in real time.
- 5 structured interview domains covered in sequence:
- Embeddings & Vector Databases
- RAG Architecture
- Prompt Engineering
- Agentic Workflows & MCP
- Deployment & Production Readiness
- Mission progress bar β visual indicator of which domain is active/complete.
- Structured evaluation report β summary, strengths, gaps, and concrete next steps. Exportable via copy button.
- Offline fallback bank β if the live LLM is unavailable, the interview continues on a deterministic, role-calibrated question bank with keyword-based answer evaluation. The app never silently breaks.
- Honest error handling β a real API error shows a specific message with Retry live AI / Continue offline instead buttons. No silent mode-switching.
- API key never reaches the browser β the Groq API key is read only on the server side inside a Netlify Function.
- No build step, no framework, no sign-up required β a single
index.htmlwith vanilla JS. Works as a pure static site + one serverless function.
Browser (index.html)
β POST /api/interview { system, messages }
βΌ
Netlify redirect (netlify.toml: /api/* β /.netlify/functions/:splat)
βΌ
netlify/functions/interview.js
β reads GROQ_API_KEY / GROQ_MODEL from env (server-side only)
βΌ
Groq API (OpenAI-compatible /v1/chat/completions)
βΌ
Structured JSON response back to browser
- User selects a candidate profile (sets role, experience, education).
- The frontend builds a detailed system prompt β including calibration rules, domain order, exact output JSON schema β and sends it with the conversation history to
/api/interview. - The Netlify Function proxies the request to Groq's chat completions API with a 30-second timeout.
- The model returns strict JSON:
{ reply, currentMission, missionAdvance, done, feedback }. - The frontend renders the reply, updates the mission bar, and β when
done: trueβ renders the evaluation report. - If any API call fails, an error banner appears with retry and offline-continue options. No silent degradation.
| Layer | Technology |
|---|---|
| Frontend | Vanilla HTML + CSS + JavaScript (single index.html, no build step) |
| Backend | Netlify Functions (Node.js serverless, ESM) |
| AI / LLM | Groq API β OpenAI-compatible chat completions |
| Deployment | Netlify (static hosting + serverless functions) |
| Fonts | Space Grotesk Β· Inter Β· JetBrains Mono (Google Fonts) |
| Routing | Client-side view switching (no router library) |
| Canvas | HTML5 Canvas β animated particle graph background |
The system prompt is built dynamically per session and includes:
- The candidate's exact profile (name, role, years of experience, education)
- Ordered domain list with sub-topics for each
- Calibration rules: vocabulary depth per role, question pacing, follow-up logic
- Strict output schema enforcement: the model must respond with a specific JSON object on every turn
{
"reply": "string β the interviewer's message",
"currentMission": "integer 0β4 β active domain index",
"missionAdvance": "boolean β true only when moving to a new domain",
"done": "boolean β true when all domains are covered or candidate ends early",
"feedback": null | {
"summary": "string",
"strengths": ["string", ...],
"gaps": ["string", ...],
"next": ["string", ...]
}
}The function includes JSON extraction with fallback (strips code fences and stray text the model occasionally adds despite instructions).
A role-calibrated deterministic question bank (fallbackQuestionBank) provides questions for each domain. Per-domain keyword sets (DOMAIN_KEYWORDS) provide lightweight answer evaluation β checking whether answers engage with core vocabulary. The fallback report explicitly notes it is heuristic, not a substitute for the live adaptive interview.
GROQ_API_KEYis stored as a Netlify environment variable- It is read only inside
netlify/functions/interview.jsviaprocess.env - The key is never returned in responses, never logged, never sent to the browser
- A
/api/healthendpoint reports whether the key is configured, never its value
prashant371/InterviewAI
βββ index.html # Entire frontend β UI, state, AI calls, offline fallback
βββ netlify.toml # Build config + /api/* redirect to Netlify Functions
βββ netlify/
β βββ functions/
β βββ interview.js # POST /api/interview β proxies to Groq API
β βββ health.js # GET /api/health β key-configured check
βββ PROMPTS.md # Development log of AI prompts used to build the project
βββ README.md
Landing page with live chat preview Β· Candidate profile selector Β· Evaluation report
π https://aiinterviewr.netlify.app
No sign-up required. Works in any modern browser. Takes approximately 6 minutes.
This is a static site + one serverless function β no build step required.
- Node.js (v18+)
- Netlify CLI:
npm install -g netlify-cli - A Groq API key (free tier available)
# 1. Clone the repository
git clone https://github.com/prashant371/InterviewAI.git
cd InterviewAI
# 2. Create a local environment file
cp .env.example .env.local
# Then edit .env.local and add your GROQ_API_KEY
# 3. Start the local dev server (serves static files + Netlify Functions)
netlify devThe app will be available at http://localhost:8888.
| Variable | Required | Description |
|---|---|---|
GROQ_API_KEY |
β Yes | Your Groq API key β never committed to git |
GROQ_MODEL |
Optional | Model name (defaults to a Groq-hosted LLaMA model if unset) |
Set in production: Netlify Dashboard β Site Settings β Environment Variables
Never commit API keys. The .env.local file should be in .gitignore.
index.html
β
βββ <style> CSS design system β tokens, layout, components, responsive
βββ <canvas> Animated particle graph background (HTML5 Canvas)
βββ DATA MISSIONS[], CANDIDATES[] β 8 role-calibrated profiles
βββ STATE Session state object β candidate, missionIndex, apiHistory, fallback flags
β
βββ PARTICLE FIELD Node drift animation + nearest-neighbor edge drawing
βββ TYPEWRITER Rotating domain phrases with cursor blink
βββ VIEW ROUTING goTo() β client-side view switching (landing/select/interview/report)
βββ HERO PREVIEW Static sample exchange rendered on landing page
βββ CANDIDATE GRID renderCandidateGrid() β dynamic card grid from CANDIDATES[]
β
βββ INTERVIEW ENGINE (LIVE)
β βββ buildSystemPrompt() Constructs the role-calibrated system prompt per session
β βββ callModel() POST /api/interview, handles JSON extraction + error types
β βββ beginInterview() Sends START_INTERVIEW sentinel to open the session
β βββ submitTurn() Sends candidate answer, routes live vs. fallback
β βββ applyModelTurn() Applies model JSON: renders reply, updates mission bar
β βββ showLiveErrorBanner() Shows retry/offline-continue options on API failure
β βββ requestEnd() Sends END_INTERVIEW_NOW to trigger early report
β
βββ OFFLINE FALLBACK BANK
β βββ fallbackQuestionBank() Role-calibrated deterministic questions (deep/plain/intern)
β βββ DOMAIN_KEYWORDS{} Per-domain keyword sets for answer evaluation
β βββ evaluateFallbackAnswer() Keyword hit check + brevity check
β βββ runFallbackTurn() Drives the fallback interview session
β βββ fallbackFeedback() Generates the offline evaluation report
β
βββ REPORT
βββ showReport() Renders feedback JSON into the report view
βββ copyReport() Clipboard export of the full report as plain text
- Voice input / text-to-speech mode for a more realistic interview feel
- Session persistence β save and resume incomplete interviews
- Expanded domain coverage (System Design, DSA, Behavioral)
- Scoring metrics and historical progress tracking
- Shareable report links
- Additional candidate profiles (ML Engineer, Product Manager, Security Engineer)
MIT