AI-powered interview preparation app built with React, Vite, Express, MongoDB, and LLM integrations. Users can sign up, upload a resume or add a self-description, paste a job description, and get a personalized interview report with:
- Match score
- Technical interview questions
- Behavioral interview questions
- Skill gap analysis
- Day-wise preparation plan
- AI-generated resume PDF tailored to the target role
The frontend is intended to be deployed on Netlify and the backend on Render.
- React 19
- React Router
- Axios
- Sass
- Lottie animations
- Vite
- Node.js
- Express
- MongoDB with Mongoose
- JWT cookie authentication
- Multer for file uploads
pdf-parsefor resume text extraction
- Groq for primary structured generation
- Google Gemini as fallback
- html2pdf.app for resume PDF generation
GenAI/
+-- backend/
| +-- server.js
| +-- package.json
| `-- src/
| +-- app.js
| +-- config/
| +-- controllers/
| +-- middlewares/
| +-- models/
| +-- routes/
| `-- services/
`-- frontend/
+-- package.json
+-- vite.config.js
+-- public/
`-- src/
+-- features/
+-- app.routes.jsx
+-- App.jsx
`-- main.jsx
- Register and login with email/password
- JWT stored in an HTTP-only cookie
- Protected routes on the frontend
- Logout support with token blacklisting
- User submits a job description.
- User uploads a resume PDF or writes a self-description.
- Backend extracts resume text and sends the profile + JD to AI.
- AI returns a structured interview report.
- Report is stored in MongoDB and shown in the dashboard.
- A saved interview report can be converted into an AI-tailored resume PDF.
- The backend generates structured HTML first, then converts it to PDF using
html2pdf.app.
- Paste job description
- Upload resume
- Optionally add self-description
- Generate a new interview plan
- View previously generated reports
- See match score
- Review technical questions
- Review behavioral questions
- Review skill gaps
- Follow the preparation roadmap
- Download generated resume as PDF
POST /api/auth/registerPOST /api/auth/loginGET /api/auth/logoutGET /api/auth/get-me
POST /api/interview/GET /api/interview/GET /api/interview/report/:interviewIdPOST /api/interview/resume/pdf/:interviewReportId
Create backend/.env with:
MONGO_URI=your_mongodb_connection_string
JWT_SECRET=your_jwt_secret
GOOGLE_GENAI_API_KEY=your_google_genai_api_key
GROQ_API_KEY=your_groq_api_key
CLIENT_URL=http://localhost:5173
HTML2PDF_API_KEY=your_html2pdf_api_key
PORT=3000Create frontend/.env with:
VITE_API_URL=http://localhost:3000cd backend
npm install
cd ../frontend
npm installcd backend
npm run devcd frontend
npm run devFrontend default URL:
http://localhost:5173
- Root directory:
frontend - Build command:
npm run build - Publish directory:
dist - Environment variable:
VITE_API_URL=https://your-render-backend-url.onrender.com
- Root directory:
backend - Build command:
npm install - Start command:
npm start - Environment variables:
MONGO_URIJWT_SECRETGOOGLE_GENAI_API_KEYGROQ_API_KEYHTML2PDF_API_KEYCLIENT_URL=https://your-netlify-site.netlify.appPORT=10000or Render default
Because the app uses cookie-based auth across Netlify and Render:
- backend CORS must allow the Netlify frontend URL
- frontend requests must use
withCredentials: true - cookies are configured as
httpOnly,secure, andsameSite: "none"
usernameemailpassword
titlejobDescriptionresumeselfDescriptionmatchScoretechnicalQuestions[]behavioralQuestions[]skillGaps[]preparationPlan[]user- timestamps
- Resume uploads are handled in memory using Multer.
- The backend currently parses resume content from PDF files.
- Groq is used first for faster responses; Gemini is used as a fallback.
- The repository still contains the default Vite README inside
frontend/README.md.
Real secrets are present in the current local backend/.env. Those values should not be shared publicly, and if they have been exposed anywhere outside your machine, they should be rotated.