AI-powered ATS Resume Checker built with React + Express + MongoDB + Gemini.
+--------------------+ HTTP (REST) +-------------------------+
| React (Vite) | <----------------------> | Node.js + Express API |
| frontend | | backend/server.js |
+--------------------+ +-----------+-------------+
|
Mongoose |
v
+-------------------+
| MongoDB Atlas |
| resume analyses |
+-------------------+
|
| SDK call
v
+-------------------+
| Google Gemini API |
+-------------------+
backend/
├── server.js
├── package.json
├── .env
├── config/
│ └── db.js
├── models/
│ └── ResumeAnalysis.js
├── routes/
│ └── resume.routes.js
├── controllers/
│ └── resume.controller.js
├── services/
│ └── resume.service.js
└── middleware/
├── upload.middleware.js
└── error.middleware.js
- Upload resume in PDF / DOCX / TXT (up to 10MB)
- ATS analysis against optional job description
- Keyword match and missing-keyword detection
- ATS score + feedback + suggestions
- ATS-optimized resume generation
- Resume analysis history with server-side limit support
- Automatic in-memory fallback when MongoDB is unavailable
Base URL: http://localhost:5000/api/resume
POST /analyzemultipart/form-data- fields:
file(required)jobDescription(optional)
POST /generate-ats- JSON body:
{ "resumeText": "...", "jobDescription": "..." }
- JSON body:
GET /history- query params:
limit(optional,1-100, default25)includeText(optional,1/true/yesto include extracted resume text)
- query params:
GET /health- returns service status, uptime, storage mode, and MongoDB connection state
const ResumeAnalysisSchema = new mongoose.Schema({
filename: String,
resumeText: String,
jobDescription: String,
atsScore: Number,
matchedKeywords: [String],
missingKeywords: [String],
feedback: String,
suggestions: [String],
optimizedResume: String,
createdAt: { type: Date, default: Date.now }
});PORT=5000
MONGODB_URI=your_mongodb_atlas_connection_string
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=gemini-1.5-flashVITE_API_URL=http://localhost:5000
VITE_ADMIN_EMAIL=
VITE_API_TIMEOUT_MS=20000VITE_ADMIN_EMAIL is optional and only used to show/hide the admin dashboard link.
VITE_API_TIMEOUT_MS is optional and controls frontend API timeout in milliseconds.
If VITE_ADMIN_EMAIL is not set, the first registered account becomes the local owner/admin by default.
cd backend
npm install
npm run devBackend runs on http://localhost:5000.
cd frontend
npm install
npm run devFrontend runs on http://localhost:5173.
curl http://localhost:5000/healthcurl "http://localhost:5000/api/resume/history?limit=10"/upload-> upload resume + analyze/result-> ATS score, keywords, suggestions, optimized resume download/history-> past analysis records from MongoDB/admin-> admin dashboard (owner/admin only)
- Frontend: React, Vite
- Backend: Node.js, Express
- Database: MongoDB Atlas + Mongoose
- File Parsing:
pdf-parse,mammoth,multer - AI:
@google/generative-ai(Gemini)