Skip to content

kadapalanikith/AI-Driven-Technical-Interview-Simulation-and-Performance-Analytics-Platform

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

5 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ€– AI-Driven Technical Interview Simulation & Performance Analytics Platform

An intelligent full-stack platform that simulates real-world technical interviews using AI, evaluates candidate responses in real time, and delivers rich performance analytics and personalized feedback.


πŸ“Œ Table of Contents


🧠 Overview

This platform provides a fully AI-powered mock interview experience β€” from resume parsing and dynamic question generation to speech-to-text answer capture, automated evaluation, and actionable performance reports.

Candidates can:

  • Upload their resume to generate role-specific questions
  • Speak or type their answers during a live interview session
  • Receive instant AI-scored feedback with detailed analytics
  • Review their complete interview history over time

✨ Features

Feature Description
πŸ” Auth System JWT-based register/login with bcrypt password hashing
πŸ“„ Resume Parsing Upload PDF resume β†’ AI extracts skills, experience, and projects
🎯 Dynamic Question Generation Google Gemini generates tailored interview questions per role and skill level
🎀 Speech-to-Text AssemblyAI transcribes spoken answers in real time
πŸ€– AI Evaluation Gemini scores each answer on accuracy, depth, and communication
πŸ“Š Performance Analytics Per-question scores, overall rating, strengths, and improvement areas
πŸ“ Interview History Past sessions stored in MongoDB; browseable from the dashboard
πŸ’» Code Editor Monaco Editor integration for coding round questions
πŸ”” Toast Notifications Real-time feedback with react-hot-toast

πŸ›  Tech Stack

Frontend

Technology Purpose
React 19 + Vite 6 UI framework and build tool
React Router v7 Client-side routing
Axios HTTP client for API calls
Monaco Editor (@monaco-editor/react) In-browser code editor for coding questions
Web Speech API Browser-native speech recognition (ConversationalMic)
MediaRecorder API Browser-native audio recording (VoiceRecorder)
React Icons Icon library
React Hot Toast Notification system

Backend

Technology Purpose
Node.js v18+ + Express 5 REST API server
MongoDB Atlas + Mongoose 9 Cloud database and ODM
JSON Web Tokens (JWT) Stateless authentication
bcryptjs Password hashing
Multer (memory storage) File uploads β€” PDF resume & audio
pdfjs-dist (legacy build) PDF text extraction in Node.js
@google/genai Google Gemini 2.5 Flash AI integration
AssemblyAI SDK Speech-to-text transcription (speech_model: universal)
Murf AI REST API Text-to-speech β€” Natalie voice (MP3, 24kHz)
dotenv Environment variable management

πŸ— Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     CLIENT (React 19 + Vite 6)                    β”‚
β”‚                                                                    β”‚
β”‚  LoginPage ──► HomePage ──► InterviewSetupPage                   β”‚
β”‚                                    β”‚                              β”‚
β”‚                              InterviewPage                        β”‚
β”‚                         (VoiceRecorder / CodeEditor)              β”‚
β”‚                                    β”‚                              β”‚
β”‚                         FeedbackPage ◄── HistoryPage             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚  REST API over HTTP (Axios)
                           β”‚  Authorization: Bearer <JWT>
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      SERVER (Express 5 / Node.js)                 β”‚
β”‚                                                                    β”‚
β”‚  POST /api/auth/register|login   GET /api/auth/me                β”‚
β”‚  POST /api/resume/upload         GET  /api/resume                β”‚
β”‚  POST /api/interview/start                                        β”‚
β”‚  POST /api/interview/:id/answer|answer-audio|code|end            β”‚
β”‚  GET  /api/interview/:id                                          β”‚
β”‚  GET|DELETE /api/history[/:id]                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
       β–Ό                 β–Ό                  β–Ό                β–Ό
  MongoDB Atlas    Google Gemini       AssemblyAI         Murf AI
  (Users, Inter-   2.5 Flash           (Speech β†’          (Text β†’
   views, Resume)  (Questions &         Text)              Speech
                   Evaluation)                             MP3)

πŸ“ Project Structure

AI-Driven-Technical-Interview-Simulation/
β”‚
β”œβ”€β”€ client/                               # React + Vite frontend
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ AudioPlayer/              # Plays Murf TTS audio (base64 MP3)
β”‚   β”‚   β”‚   β”œβ”€β”€ CodeEditor/               # Monaco Editor wrapper
β”‚   β”‚   β”‚   β”œβ”€β”€ ConversationalMic/        # Web Speech API live transcription
β”‚   β”‚   β”‚   β”œβ”€β”€ InterviewCard/            # History card component
β”‚   β”‚   β”‚   β”œβ”€β”€ Navbar/                   # Top navigation bar
β”‚   β”‚   β”‚   β”œβ”€β”€ ProtectedRoute/           # JWT route guard
β”‚   β”‚   β”‚   β”œβ”€β”€ ScoreCard/               # Category score display
β”‚   β”‚   β”‚   └── VoiceRecorder/            # MediaRecorder audio recording
β”‚   β”‚   β”œβ”€β”€ constants/
β”‚   β”‚   β”‚   β”œβ”€β”€ difficulty.js             # Difficulty levels + question counts
β”‚   β”‚   β”‚   β”œβ”€β”€ roles.js                  # Interview role definitions
β”‚   β”‚   β”‚   └── scoreColors.js            # Score-to-color mapping
β”‚   β”‚   β”œβ”€β”€ context/
β”‚   β”‚   β”‚   └── AuthContext.jsx           # Global auth state (login/logout/user)
β”‚   β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”‚   β”œβ”€β”€ LoginPage/                # Hero + Sign In / Create Account
β”‚   β”‚   β”‚   β”œβ”€β”€ HomePage/                 # Dashboard with stats + recent history
β”‚   β”‚   β”‚   β”œβ”€β”€ InterviewSetupPage/       # 3-step wizard: role β†’ difficulty β†’ resume
β”‚   β”‚   β”‚   β”œβ”€β”€ InterviewPage/            # Live interview (voice/text/code)
β”‚   β”‚   β”‚   β”œβ”€β”€ FeedbackPage/             # Detailed AI feedback + category scores
β”‚   β”‚   β”‚   └── HistoryPage/              # Paginated interview history
β”‚   β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”‚   β”œβ”€β”€ api.js                    # Axios instance with JWT interceptor
β”‚   β”‚   β”‚   β”œβ”€β”€ authService.js            # register, login, getMe, logout
β”‚   β”‚   β”‚   β”œβ”€β”€ historyService.js         # getHistory, deleteHistoryItem, clearHistory
β”‚   β”‚   β”‚   └── interviewService.js       # upload, start, answer, code, end, get
β”‚   β”‚   β”œβ”€β”€ App.jsx                       # Route definitions
β”‚   β”‚   β”œβ”€β”€ App.css                       # Global styles
β”‚   β”‚   └── main.jsx                      # React entry point
β”‚   β”œβ”€β”€ index.html
β”‚   β”œβ”€β”€ vite.config.js
β”‚   β”œβ”€β”€ .env.example
β”‚   └── package.json
β”‚
β”œβ”€β”€ server/                               # Node.js + Express backend
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ config/
β”‚   β”‚   β”‚   β”œβ”€β”€ db.config.js              # MongoDB Atlas connection
β”‚   β”‚   β”‚   └── gemini.config.js          # Google GenAI client (Gemini 2.5 Flash)
β”‚   β”‚   β”œβ”€β”€ constants/
β”‚   β”‚   β”‚   └── prompts.js                # All AI prompt templates
β”‚   β”‚   β”œβ”€β”€ controllers/
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.controller.js
β”‚   β”‚   β”‚   β”œβ”€β”€ resume.controller.js
β”‚   β”‚   β”‚   β”œβ”€β”€ interview.controller.js   # text/voice/code answer + TTS stream
β”‚   β”‚   β”‚   └── history.controller.js
β”‚   β”‚   β”œβ”€β”€ middleware/
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.middleware.js        # JWT verification β†’ req.user
β”‚   β”‚   β”‚   β”œβ”€β”€ error.middleware.js       # 404 + global error handler
β”‚   β”‚   β”‚   └── upload.middleware.js      # Multer: PDF (10MB) + audio (25MB)
β”‚   β”‚   β”œβ”€β”€ models/
β”‚   β”‚   β”‚   β”œβ”€β”€ User.model.js
β”‚   β”‚   β”‚   β”œβ”€β”€ Interview.model.js        # questions, messages, codeSubmissions, feedback
β”‚   β”‚   β”‚   └── Resume.model.js
β”‚   β”‚   β”œβ”€β”€ routes/
β”‚   β”‚   β”‚   β”œβ”€β”€ index.js
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.routes.js
β”‚   β”‚   β”‚   β”œβ”€β”€ resume.routes.js
β”‚   β”‚   β”‚   β”œβ”€β”€ interview.routes.js
β”‚   β”‚   β”‚   └── history.routes.js
β”‚   β”‚   β”œβ”€β”€ services/
β”‚   β”‚   β”‚   β”œβ”€β”€ auth.service.js
β”‚   β”‚   β”‚   β”œβ”€β”€ gemini.service.js         # askGemini() wrapper
β”‚   β”‚   β”‚   β”œβ”€β”€ assemblyai.service.js     # transcribeAudio() via temp file
β”‚   β”‚   β”‚   β”œβ”€β”€ murf.service.js           # generateAudio() + streamAudio()
β”‚   β”‚   β”‚   β”œβ”€β”€ interview.service.js      # full interview state machine
β”‚   β”‚   β”‚   β”œβ”€β”€ resume.service.js         # PDF parse + upsert to DB
β”‚   β”‚   β”‚   └── history.service.js        # paginated history CRUD
β”‚   β”‚   └── utils/
β”‚   β”‚       β”œβ”€β”€ jwt.utils.js              # generateToken, verifyToken
β”‚   β”‚       └── prompts.utils.js          # parseGeminiJSON()
β”‚   β”œβ”€β”€ server.js                         # Entry point
β”‚   β”œβ”€β”€ .env.example
β”‚   β”œβ”€β”€ .gitignore
β”‚   └── package.json
β”‚
β”œβ”€β”€ .gitignore
└── README.md

πŸš€ Getting Started

Prerequisites

Make sure you have the following installed:


Installation

  1. Clone the repository

    git clone https://github.com/kadapalanikith/AI-Driven-Technical-Interview-Simulation-and-Performance-Analytics-Platform.git
    cd AI-Driven-Technical-Interview-Simulation-and-Performance-Analytics-Platform
  2. Install server dependencies

    cd server
    npm install
  3. Install client dependencies

    cd ../client
    npm install

Environment Variables

Server (server/.env)

Copy the template and fill in your values:

cp server/.env.example server/.env
Variable Description
PORT Port the Express server runs on (default: 5000)
NODE_ENV development or production
MONGODB_URI MongoDB Atlas connection string
JWT_SECRET Secret key for signing JWT tokens
JWT_EXPIRES_IN Token expiry duration (e.g. 7d)
GEMINI_API_KEY Google Gemini API key
MURF_API_KEY Murf AI text-to-speech key
ASSEMBLYAI_API_KEY AssemblyAI speech-to-text key
CLIENT_URL Frontend origin for CORS (e.g. http://localhost:5173)

Client (client/.env)

cp client/.env.example client/.env
Variable Description
VITE_API_URL Base URL of the Express API (e.g. http://localhost:5000)

Running the App

Start the backend server:

cd server
npm run dev

Server starts at http://localhost:5000

Start the frontend (in a new terminal):

cd client
npm run dev

App opens at http://localhost:5173


πŸ“‘ API Reference

All API routes are prefixed with /api.

Auth β€” /api/auth

Method Endpoint Auth Description
POST /auth/register ❌ Create a new account
POST /auth/login ❌ Login and get JWT
GET /auth/me βœ… Fetch authenticated user profile

Resume β€” /api/resume

Method Endpoint Auth Description
POST /resume/upload βœ… Upload and parse a PDF resume

Interview β€” /api/interview

Method Endpoint Auth Description
POST /interview/start βœ… Start a new interview session
POST /interview/:id/answer βœ… Submit an answer; get AI feedback
POST /interview/:id/end βœ… End session and generate final report
GET /interview/:id βœ… Fetch a specific interview session

History β€” /api/history

Method Endpoint Auth Description
GET /history βœ… List all past interviews for the user
GET /history/:id βœ… Get detailed results of a past interview

Auth header format: Authorization: Bearer <token>


🀝 Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the repository
  2. Create a new branch: git checkout -b feature/your-feature-name
  3. Make your changes and commit: git commit -m "feat: add your feature"
  4. Push to your branch: git push origin feature/your-feature-name
  5. Open a Pull Request

Please follow the Conventional Commits standard for commit messages.


πŸ“„ License

This project is licensed under the MIT License.
Feel free to use, modify, and distribute it.


Built with ❀️ using React, Node.js, and Google Gemini AI

About

Built an end-to-end AI-powered platform that simulates real technical interviews using voice-based interaction and live coding environments, generates personalized questions from resumes, and delivers real-time, multi-dimensional performance analytics to improve candidate interview readiness.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors