AI-powered resume analysis and job matching platform built with a React + Vite frontend and an Express + MongoDB backend.
JobFit AI helps users:
- Upload resumes (PDF)
- Get ATS scoring with deterministic + AI-assisted evaluation
- Extract technical and soft skills
- Generate AI-improved resume content
- Match resumes against a jobs dataset
- Identify role-specific skill gaps
- Authentication with JWT (
signup,login,me) - Resume upload + text extraction (
multer+pdf-parse) - AI analysis with provider fallback (Gemini first, Groq fallback)
- ATS breakdown and normalized scoring
- Job search and skill-based match scoring
- Skill-gap analysis with learning path suggestions
- Responsive, animated frontend (Tailwind + Framer Motion)
Frontend (client):
- React 18
- Vite 4
- Tailwind CSS
- Framer Motion
- React Router DOM
Backend (server):
- Node.js + Express
- MongoDB + Mongoose
- JWT + bcryptjs
- Multer + pdf-parse
- Google Gemini + Groq SDK
JobFit AI/
|- client/
| |- src/
| | |- components/
| | |- context/
| | |- hooks/
| | |- pages/
| | |- services/
| | |- styles/
| | |- utils/
| | |- App.jsx
| | |- main.jsx
| |- package.json
|- server/
| |- controllers/
| |- middleware/
| |- models/
| |- routes/
| |- services/
| |- uploads/
| |- utils/
| |- server.js
| |- package.json
|- README.md
- Node.js 18+
- npm 9+
- MongoDB database (local or Atlas)
- Gemini API key (recommended)
- Optional: Groq API key (fallback)
cd server
npm install
cd ../client
npm installCreate server/.env:
PORT=5000
NODE_ENV=development
MONGO_URI=mongodb://localhost:27017/jobfit-ai
JWT_SECRET=change_this_to_a_long_random_secret
CORS_ORIGIN=http://localhost:5173
GEMINI_API_KEY=your_gemini_api_key
GROQ_API_KEY=your_groq_api_key_optional
GROQ_MODELS=llama-3.3-70b-versatile,llama-3.1-8b-instantCreate client/.env:
VITE_API_URL=http://localhost:5000/apiTerminal 1:
cd server
npm run devTerminal 2:
cd client
npm run devOpen http://localhost:5173
Server (server/package.json):
npm run dev- Start API with nodemonnpm start- Start API with node
Client (client/package.json):
npm run dev- Start Vite dev servernpm run build- Build production bundlenpm run preview- Preview production buildnpm run lint- Run ESLint
Base URL: http://localhost:5000/api
Health:
GET /health
Auth:
POST /auth/signupPOST /auth/loginGET /auth/me(protected)
Resume:
POST /resume/upload(protected,multipart/form-data, field:resume)GET /resume(protected)GET /resume/:id(protected)DELETE /resume/:id(protected)
Analysis:
POST /analysis/analyze(protected, body:{ "resumeId": "..." })POST /analysis/improve(protected, body:{ "resumeId": "..." })POST /analysis/skill-gap(protected, body:{ "resumeId": "...", "jobId": "..." })
Jobs:
GET /jobs(protected)GET /jobs/:id(protected)POST /jobs/match(protected, body:{ "skills": ["..."] })
- User signs up/logs in and gets JWT.
- User uploads a PDF resume.
- Backend extracts text and stores a resume record.
- Analysis endpoint runs AI analysis with provider fallback.
- ATS scoring and job matching are computed and returned.
- User can run improvement and skill-gap analysis endpoints.
