: RESUMEAI :
A portfolio-grade full-stack application that ingests a PDF resume and a job description, runs them through an AI pipeline (Google Gemini 1.5 Flash + embeddings), and returns a match score, skill gap analysis, AI-powered insights, and an auto-improved resume with diff view.
| Feature | Description |
|---|---|
| Match Score | Composite score: 60% semantic (embeddings) + 40% keyword coverage |
| Skill Gap Analysis | Exact skills you're missing vs. skills you have |
| Radar Chart | Visual comparison across 5 dimensions |
| AI Insights | Gemini-powered strengths, suggestions, assessment |
| Resume Rewrite | ATS-optimised rewrite tailored to the job |
| Diff View | Side-by-side word-level diff of original vs improved |
frontend/ → React + Vite (port 5173)
backend/ → Node.js + Express (port 5000)
PostgreSQL → Optional (pgvector for embeddings) — in-memory fallback if not set
Gemini API → Gemini 1.5 Flash + text-embedding-004
- Node.js 18+
- A Google Gemini API key
- (Optional) PostgreSQL with pgvector
git clone <repo-url>
cd ai-resume-analysercd backend
cp .env.example .env
# Edit .env — add your GEMINI_API_KEY
npm install
npm run dev
# Server starts on http://localhost:5000cd frontend
npm install
npm run dev
# App opens on http://localhost:5173If you want persistent storage:
- Create a PostgreSQL database (local or Neon)
- Install pgvector:
CREATE EXTENSION vector; - Run the schema:
psql $DATABASE_URL -f backend/src/db/schema.sql - Set
DATABASE_URLinbackend/.env
| Variable | Required | Default | Description |
|---|---|---|---|
GEMINI_API_KEY |
✅ Yes | — | Your Gemini API key |
GEMINI_MODEL |
No | gemini-1.5-flash |
Generative model |
GEMINI_EMBEDDING_MODEL |
No | text-embedding-004 |
Embedding model |
PORT |
No | 5000 |
Backend port |
CLIENT_ORIGIN |
No | http://localhost:5173 |
Frontend URL (for CORS) |
DATABASE_URL |
No | — | PostgreSQL connection string |
| Method | Endpoint | Description |
|---|---|---|
GET |
/health |
Health check |
POST |
/api/resume/upload |
Upload PDF resume (multipart/form-data) |
POST |
/api/resume/improve |
Generate improved resume |
POST |
/api/job/submit |
Submit job description text |
POST |
/api/analysis/match |
Run match analysis |
ai-resume-analyser/
├── backend/
│ ├── src/
│ │ ├── app.js # Express app
│ │ ├── server.js # Entry point
│ │ ├── config/env.js # Env config
│ │ ├── routes/ # API routes
│ │ ├── controllers/ # Request handlers
│ │ ├── services/
│ │ │ ├── pdfParser.js # PDF text extraction
│ │ │ ├── llm.js # OpenAI prompts
│ │ │ ├── embeddings.js # Embedding generation
│ │ │ └── matcher.js # Cosine similarity + scoring
│ │ ├── db/
│ │ │ ├── index.js # PostgreSQL pool
│ │ │ └── schema.sql # DB schema (pgvector)
│ │ └── utils/ # Logger, errorHandler
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── pages/ # Home, Analyze, Results
│ │ ├── components/ # UploadResume, JobInput, etc.
│ │ ├── hooks/useApi.js # Axios hook
│ │ └── utils/formatters.js # Score utilities
│ └── package.json
└── README.md
Backend → Render
- Connect repo → New Web Service
- Root directory:
backend - Start command:
npm start - Add environment variables in Render dashboard
Frontend → Vercel
- Connect repo → New Project
- Root directory:
frontend - Build command:
npm run build - Set
VITE_API_URLto your Render backend URL
Database → Neon
- Create a Neon project (free tier available)
- Enable pgvector:
CREATE EXTENSION vector; - Run
backend/src/db/schema.sql - Set
DATABASE_URLin Render env vars
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, React Router, Recharts, react-diff-viewer |
| Backend | Node.js, Express, Multer, pdf-parse |
| AI | Google Gemini 1.5 Flash, text-embedding-004 |
| Database | PostgreSQL + pgvector (optional) |
| Styling | Vanilla CSS (design system with CSS variables) |
MIT