InterviewAI is a full-stack web application that helps candidates prepare for interviews using AI.
Users can upload a resume, add their self-description and a target job description, and receive:
- A job match score
- Technical and behavioral interview questions with guidance
- Skill gap analysis
- A day-wise preparation plan
- A tailored resume PDF
- Cookie-based authentication with JWT
- Secure protected routes
- Resume upload and text extraction from PDF
- AI-generated interview preparation report
- Report history and detailed report pages
- AI-generated, downloadable resume PDF
- Neumorphism-inspired frontend design system
- Clear, structured feedback instead of generic chat answers
- Practice sessions with scoring to reveal weak dimensions
- Actionable next steps via skill gaps, prep plans, and roadmaps
- Resume-to-report workflow reduces setup time
- End-to-end flow from practice to improvement plan
- Use a specific job description to sharpen the report context
- Keep your self-description honest and focused on real experience
- Run mock sessions weekly and compare trends over time
- Review the question bank and rate yourself right after each session
- Generate roadmaps from your latest report and complete tasks in order
- Revisit reports after every major resume or skill update
- AI-first workflows with JSON schema validation for stable outputs
- Idempotent session flows to safely handle retries and disconnects
- Spaced repetition scheduling for question bank reviews
- Adaptive follow-up questions based on weak score dimensions
- Role-based report generation from resume and job description
- Neumorphic UI design system for consistent visuals
- Cookie-based auth with JWT and token blacklisting
- React 19
- Vite 7
- React Router DOM
- Redux Toolkit + Redux Persist
- Tailwind CSS 4
- Node.js + Express 5
- MongoDB + Mongoose
- Google GenAI SDK (Gemini)
- Puppeteer (PDF generation)
- Multer (file upload)
- bcryptjs + jsonwebtoken
interviewAI/
backend/
server.js
package.json
src/
app.js
config/
controllers/
middleware/
model/
routes/
service/
frontend/
package.json
src/
components/
pages/
services/
store/
docs/
api-overview.md
controllers/
- Node.js 20+ recommended
- npm 10+ recommended
- MongoDB (local or Atlas)
- Gemini API key
Create a .env file inside backend/.
MONGO_URI=your_mongodb_connection_string
JWT_SECRET=your_jwt_secret
GEMINI_API_KEY=your_gemini_api_keyOptional frontend env in frontend/.env:
VITE_API_BASE_URL=http://localhost:3000From the project root:
cd backend
npm install
cd ../frontend
npm installIn one terminal:
cd backend
npm run devBackend runs on http://localhost:3000.
In a second terminal:
cd frontend
npm run devFrontend runs on http://localhost:5173.
npm run dev- Run backend with nodemonnpm test- Placeholder test script (currently not implemented)
npm run dev- Start Vite dev servernpm run build- Build production bundlenpm run preview- Preview production buildnpm run lint- Run ESLint
- Auth uses an HTTP cookie named
token - JWT token is generated on register/login
- Logout clears cookie and stores token in a blacklist collection
- Protected routes validate token and blacklist status
Frontend requests must include credentials:
- Fetch:
credentials: "include"
Base URL: http://localhost:3000
POST /api/auth/register- Register userPOST /api/auth/login- Login userGET /api/auth/logout- Logout userGET /api/auth/get-me- Get current logged-in user
POST /api/interview- Create interview reportGET /api/interview- Get all reports for logged-in userGET /api/interview/report/:interviewId- Get one report by idGET /api/interview/resume/pdf/:interviewReportId- Download generated resume PDF
POST /api/interview expects multipart/form-data:
resume(PDF file, max 3 MB)selfDescription(string)jobDescription(string)
- username (unique)
- email (unique)
- password (hashed)
- title
- jobDescription
- resume
- selfDescription
- matchScore (0-100)
- technicalQuestions[]
- behavioralQuestions[]
- skillGaps[]
- preparationPlan[]
- user (ObjectId)
- timestamps
- token
- timestamps
- User registers or logs in
- User creates a new report from dashboard
- User uploads resume + self-description + job description
- Backend parses resume PDF and calls Gemini
- AI response is validated and saved in MongoDB
- User views detailed report
- User can download tailored resume as PDF
- Backend CORS origin is set to
http://localhost:5173 - Cookie auth requires frontend and backend to run on configured local ports
- Cross-origin requests must include credentials
- Check
MONGO_URI - Ensure MongoDB service/Atlas cluster is reachable
- Make sure frontend sends credentials
- Login again to refresh cookie
- Confirm token has not been blacklisted after logout
- Confirm file is a PDF
- Confirm file size is under 3 MB
- Check
GEMINI_API_KEY - Ensure API key has access to Gemini model used in the backend
- No automated tests configured yet
- Limited central error handling around AI calls
- No queue/retry mechanism for long AI/PDF operations
- No rate limiting on auth/report endpoints
Additional docs are available in:
docs/api-overview.mddocs/controllers/auth.controllers.md
- Fork the repo
- Create a feature branch
- Make focused changes
- Run frontend lint and verify backend startup
- Open a pull request with clear description
- Add test coverage (unit + integration)
- Add request validation and global error handling
- Add rate limiting and hardening for production
- Add report generation jobs/queue for scale
- Add password reset and email verification
Copyright (c) 2026 Manthan Licensed under the MIT License. You are free to use, copy, and modify this software, provided this notice is included.