A small full-stack app that analyzes a resume (pasted text or uploaded file) and returns scores + structured feedback as JSON.
- Frontend (Vite + React) collects either:
- Pasted resume text, or
- A file upload (PDF / JPG / PNG / WEBP)
- Frontend sends a request to the backend:
- Text mode: JSON body
{ resumeText, targetRole } - File mode:
multipart/form-datawithfileandtargetRole
- Text mode: JSON body
- Backend (Express):
- Extracts text from PDF (PDF.js) or runs OCR on images (Tesseract)
- Classifies whether the document looks like a resume (LLM)
- If it is a resume, asks an LLM to produce JSON-only feedback:
relevanceScore,atsScore,toneScore,readabilityScoremissingKeywords,overallFeedback,suggestions,strengths,weaknesses
- Frontend renders the returned JSON into a UI (score rings, sections, keyword tags).
frontend/: React UI (Vite dev server)backend/: Express API that extracts/ocr’s text and calls the model
cd backend
npm install
npm run startBackend runs on http://localhost:3000 by default.
Open a second terminal:
cd frontend
npm install
npm run devFrontend runs on http://localhost:5173 by default.
This repo uses .env files in backend/ and frontend/.
- Backend: see
backend/README.mdfor required variables. - Frontend: see
frontend/README.mdfor variables and backend URL wiring.
Important: keep secrets (API keys) out of git history. Don’t paste real keys into documentation.
POST /analyze- Text mode: send JSON
{ "resumeText": "...", "targetRole": "..." } - File mode: send
multipart/form-datawithfile=<pdf|image>and optionaltargetRole
- Text mode: send JSON
If the uploaded file is not recognized as a resume, the backend responds 400 with a message and a short reason.