Voice-first AI mock interviews that feel real, with actionable feedback to improve both technical and communication performance.
InterviewMate is an AI-powered mock interview platform that lets users practice realistic interviews through live voice conversations, then receive structured feedback and performance analysis after the session ends.
The platform is designed to solve a simple but important problem: most interview prep tools are static, generic, and disconnected from how real interviews actually feel. InterviewMate makes the experience more realistic by combining a voice-based AI interviewer, dynamic interview setup, transcript capture, and asynchronous analysis. The codebase uses a MERN architecture with custom JWT authentication, Vapi for live voice interactions, OpenRouter for LLM routing, Google Gemini for evaluation, and React 19 + Vite on the frontend.
Interview preparation usually fails in one of three ways:
- It is too shallow and only gives question lists.
- It is too expensive to practice consistently with a human coach.
- It gives vague feedback instead of clear, actionable improvement points.
That creates a bad outcome: candidates go into interviews underprepared, anxious, and blind to their weak spots.
InterviewMate solves this by giving users:
- a real-time voice interview experience
- interview setup based on role, level, type, and context
- live transcript capture
- asynchronous AI evaluation after the interview ends
- per-question feedback and overall scoring
- interview history and progress tracking
The important architecture decision is that the interview session and the analysis pipeline are separated. The interview stays responsive, while the AI analysis runs after the session is complete. That avoids blocking the user while the AI is thinking.
Live link : https://interviewmate-xi.vercel.app/
This project is strong for portfolio and hiring purposes because it shows more than just CRUD or UI work.
It demonstrates:
- full-stack architecture
- real-time user flows
- authentication and protected routes
- asynchronous processing
- long-running AI jobs
- transcript handling
- reliability and recovery thinking
- analytics-driven product design
That combination is especially relevant for YC-backed companies, remote startups, and AI product teams.
Users can speak to an AI interviewer in a live interview session powered by Vapi.
Users select:
- role
- experience level
- interview type
- interviewer persona
- resume or job description context
The full conversation is streamed, normalized, and saved for later analysis.
After the interview ends, the transcript is sent to OpenRouter and evaluated by Gemini models.
If one model fails or rate-limits, the system falls back to the next one.
The app uses custom JWT auth with protected routes and session restoration.
Users can revisit past interviews, view reports, and track progress.
The dashboard shows trends and feedback across multiple sessions.
- React 19
- Vite
- Tailwind CSS
- Recharts
- Node.js
- Express.js
- Mongoose
- MongoDB
- Vapi
- OpenRouter
- Google Gemini
- Custom JWT
- HTTP-only session handling on protected routes
- Docker
- Async utilities
- Custom error handling
- API route organization
This matches the actual codebase, which uses React + Vite on the frontend, Express + Mongoose on the backend, custom JWT auth, Vapi for voice sessions, and OpenRouter → Gemini for analysis.
Caption: Interview execution flow from session creation through voice interaction, transcript persistence, asynchronous AI evaluation, and final report generation.
The live interview must stay responsive. AI evaluation is expensive and slow, so it runs after the interview ends.
The transcript is stored and reused for report generation. That makes the analysis step deterministic and recoverable.
If one Gemini endpoint fails or rate-limits, the system can move to the next model instead of breaking the workflow.
The codebase uses custom JWT-based auth rather than a hosted auth provider, which gives you full control over route protection and session restoration.
The project keeps the React frontend and Express backend as independent applications in the same codebase. That is a sensible structure for a solo-built product.
- User signs up or logs in.
- User configures an interview.
- User starts a live voice interview.
- Vapi runs the conversation.
- Transcript is captured and saved.
- Backend sends transcript to OpenRouter.
- Gemini generates structured feedback.
- Report is saved in MongoDB.
- User reviews the result in the dashboard.
- User checks interview history and progress.
interviewmate/
├── backend/
│ ├── config/
│ ├── controllers/
│ ├── middleware/
│ ├── models/
│ ├── routes/
│ ├── services/
│ └── utils/
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ ├── context/
│ │ ├── constants/
│ │ ├── layout/
│ │ └── pages/
│ └── public/
├── .env.example
└── README.md
This matches the actual codebase layout, which includes backend route/controller/service layers and a Vite-based React frontend with pages for sign-in, interview setup, live sessions, results, and history.
- Home
- Sign In
- Sign Up
- Dashboard Overview
- Create Interview
- Interview Session
- Interview Result
- Past Interviews
It gives the user a clear journey:
- enter
- configure
- interview
- analyze
- improve
That is the product loop.
POST /api/auth/registerPOST /api/auth/loginGET /api/auth/me
POST /api/vapi-interview/startGET /api/vapi-interview/report/:sessionIdPOST /api/vapi-interview/report-from-transcriptPOST /api/vapi-interview/retry-analysisGET /api/vapi-interview/user
NODE_ENV=development
PORT=5000
MONGODB_URI=your_mongodb_connection_string
JWT_SECRET=your_secure_jwt_secret
JWT_EXPIRES_IN=7d
VAPI_PUBLIC_KEY=your_vapi_public_key
OPENROUTER_API_KEY=your_openrouter_api_keyVITE_BACKEND_URL=http://localhost:5000
VITE_VAPI_PUBLIC_KEY=your_vapi_public_keygit clone https://github.com/sultanxdev/interviewmate.git
cd interviewmatecd backend && npm install
cd ../frontend && npm installCreate .env files in both backend and frontend using the values above.
cd backend
npm run devcd frontend
npm run devhttp://localhost:5173- Building live voice interview sessions
- Capturing partial and final transcript updates
- Preventing blocked UI during AI analysis
- Handling rate limits and fallback logic
- Designing a clean interview session lifecycle
- Showing actionable report data instead of generic text
- Keeping authentication and route protection stable
- Voice AI systems need strong state management.
- Long-running AI jobs should be decoupled from the user interaction path.
- Transcript structure matters more than raw audio.
- AI output is only useful when it is parsed into structured feedback.
- Product design matters as much as model quality.
- Good architecture makes the app easier to extend later.
- Deepgram STT integration
- ElevenLabs TTS integration
- Real-time interruption handling
- Resume-aware interviews
- Company-specific interview tracks
- Adaptive follow-up questioning
- Historical score tracking
- Skill trend analysis
- Personalized improvement plans
- PDF report exports
- Team dashboards
- Subscription management



