RAG & AI-powered interview preparation platform β upload your resume, paste the job description, and get a personalized interview report, predicted questions, skill gap analysis, and a tailored resume PDF in seconds.
- π JWT Authentication System
- π Resume Upload and PDF Parsing
- π§ RAG-Powered Resume Matching Pipeline
- π€ AI Interview Report Generation (Gemini + Zod schema)
- π€ AI Interview Report Generation (Zod schema)
- π Match Score Normalization and Skill Gap Analysis
- π¬ Technical and Behavioral Questions with intent and answer guidance
- π Personalized Preparation Roadmap
- π₯ ATS-Friendly Resume PDF Generator
- πͺ Windows-safe PDF generation fallback (local Chrome/Edge support)
- π Interview Report History
- π³ Dockerized Full Stack Application
- βοΈ GitHub Actions CI/CD Pipeline
- π§ͺ Automated API Testing with Jest and Supertest
| Technology | Purpose |
|---|---|
| Node.js + Express | REST API server |
| MongoDB + Mongoose | Database |
| JWT + bcryptjs | Authentication |
| Google Gemini AI via @google/genai | Interview report and resume HTML generation |
| Local RAG service | Resume chunking, embedding, retrieval |
| Puppeteer Core + Chromium | HTML to PDF conversion |
| Multer | Resume upload handling |
| pdf-parse | PDF text extraction |
| Zod + zod-to-json-schema | AI output schema enforcement |
| Jest + Supertest | API tests |
| Technology | Purpose |
|---|---|
| React 19 + Vite | Frontend framework |
| React Router v7 | Routing |
| Axios | API requests |
| SASS | Styling |
| Technology | Purpose |
|---|---|
| Docker | Containerization |
| Docker Compose | Multi-container orchestration |
| GitHub Actions | CI/CD automation |
| Nginx | Frontend production server |
| Render | Deployment platform |
- Node.js >= 18
- Docker and Docker Compose
- MongoDB Atlas account or local MongoDB
- Google Gemini API key
- Pinecone account and API key
git clone https://github.com/Akshay4754/GapWiseAI.git
cd GapWiseAIcd Backend
npm installCreate .env inside Backend/
PORT=3000
MONGO_URI=your_mongodb_connection_string
JWT_SECRET=your_jwt_secret
GOOGLE_GENAI_API_KEY=your_gemini_api_key
PINECONE_API_KEY=your_pinecone_api_key
PINECONE_INDEX_NAME=gapwise-ai-rag-google
GOOGLE_EMBEDDING_MODEL=gemini-embedding-001
GOOGLE_EMBEDDING_DIMENSIONS=768
FRONTEND_ORIGIN=http://localhost:5173,http://localhost:5174Run backend
npm run devIf npm run dev has trouble with nodemon, run:
npm startcd Frontend
npm installCreate .env inside Frontend/
VITE_API_URL=http://localhost:3000Run frontend
npm run devFrontend runs at
http://localhost:5173docker-compose up --buildContainers expose
- Frontend on http://localhost:3000
- Backend on http://localhost:5000
- MongoDB on localhost:27017
Backend
docker build -t gapwise-backend ./BackendFrontend
docker build -t gapwise-frontend ./FrontendGitHub Actions workflow in .github/workflows/ci.yml automatically
- β Installs backend and frontend dependencies
- β Runs Jest + Supertest tests
- β Builds Docker images
- β Pushes Docker images on push to main, only if tests pass
Go to GitHub Repository β Settings β Secrets and variables β Actions
Add
DOCKER_USERNAME
DOCKER_PASSWORD
MONGO_URI_TEST
GEMINI_API_KEYGapWiseAI/
βββ .github/
β βββ workflows/
β βββ ci.yml # GitHub Actions CI/CD pipeline
β
βββ docker-compose.yml # Multi-container orchestration
β
βββ Backend/
β βββ Dockerfile # Backend container setup
β βββ env.example # Environment variables template
β βββ package.json
β βββ server.js # Backend entry point
β βββ tests/
β β βββ api.test.js # Jest + Supertest tests
β β
β βββ src/
β βββ app.js # Express app configuration
β βββ config/ # MongoDB configuration
β βββ controllers/ # Route handlers
β βββ middlewares/ # Auth + file middleware
β βββ models/ # Mongoose models
β βββ routes/ # Express routes
β βββ services/
β βββ ai.service.js # Gemini integration + PDF generation
β βββ rag.service.js # Resume chunking, embedding, retrieval
β
βββ Frontend/
β βββ Dockerfile # Frontend container setup
β βββ nginx.conf # Nginx production config
β βββ package.json
β βββ public/
β β βββ _redirects # SPA routing fix
β βββ src/
β βββ app.routes.jsx # React routes
β βββ features/
β βββ auth/ # Authentication feature
β βββ interview/ # Interview dashboard and API services
β
βββ README.md| Setting | Value |
|---|---|
| Root Directory | Backend |
| Build Command | npm install |
| Start Command | npm start |
Environment Variables
MONGO_URI
JWT_SECRET
GOOGLE_GENAI_API_KEY
PINECONE_API_KEY
PINECONE_INDEX_NAME=gapwise-ai-rag-google
GOOGLE_EMBEDDING_MODEL=gemini-embedding-001
GOOGLE_EMBEDDING_DIMENSIONS=768
FRONTEND_ORIGIN=https://your-frontend-url.onrender.com| Setting | Value |
|---|---|
| Root Directory | Frontend |
| Build Command | npm install && npm run build |
| Publish Directory | dist |
Environment Variables
VITE_API_URL=https://your-backend-url.onrender.comCreate a plain dense Pinecone index for the RAG pipeline with:
Index name: gapwise-ai-rag-google
Vector type: Dense
Dimensions: 768
Metric: Cosine
Region: us-east-1
Notes:
- Do not use an integrated embedding index for this project.
- The backend generates embeddings itself using Google Gemini embeddings.
- The Pinecone index dimension must match
GOOGLE_EMBEDDING_DIMENSIONS=768.
From Backend/
npm testUses
- Jest
- Supertest
Test location
Backend/tests/api.test.js| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/register | Register user |
| POST | /api/auth/login | Login user |
| GET | /api/auth/logout | Logout user |
| GET | /api/auth/get-me | Current user |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/interview/ | Generate interview report |
| GET | /api/interview/ | Fetch all reports |
| GET | /api/interview/report/:id | Fetch single report |
| POST | /api/interview/resume/pdf/:id | Generate and download resume PDF |
- User submits job description and either resume PDF, self-description, or both
- Resume PDF is parsed to text
- RAG service chunks resume text, generates local embeddings, and stores a per-user collection
- Job description is embedded and used to retrieve top relevant resume chunks
- Retrieved chunks are sent to Gemini for structured report generation
- Match score is normalized to 0 to 100 before persistence and UI rendering
- Interview report is saved with ragMetadata fields used and chunksRetrieved
- For resume download, Gemini generates resume HTML, then Puppeteer renders ATS-friendly PDF
- PDF generation falls back to local Chrome/Edge binaries when needed for reliability
4971bbfe600b7393b581d5e744459f64c6a1cf07