Skip to content

Latest commit

History

27 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

📄 ResumeForge

An AI-powered resume analyser and HR outreach tool — built as a full-stack portfolio project demonstrating AI integration, file handling, and automated email delivery.

Node.jsReactGroqBrevoRender

Live:https://resumeforge-1-c1t9.onrender.com


✨ Features

  • 📤 PDF Resume Upload — Multer memoryStorage — file stored in buffer, never written to disk
  • 🤖 AI-Powered Analysis — section-wise resume scoring against a target job role using Groq's LLaMA 3.3 70B
  • 📊 Structured Feedback — overall score (0–100), section scores (0–10), top strengths, critical gaps, missing ATS keywords, and side-by-side suggested rewrites
  • 📧 AI-Generated HR Email — personalised cover email generated by AI and delivered via Brevo REST API with resume attached as PDF
  • 🎨 Dark / Light Theme — CSS custom property system with data-theme toggle, persisted in localStorage
  • 🔁 Stateless Architecture — no database, no auth, no stored files. Resume processed in-memory and discarded after response

🛠️ Tech Stack

LayerTechnology
BackendNode.js + Express.js (ES Modules)
FrontendReact.js (Vite) + Tailwind CSS + DaisyUI
AIGroq SDK — llama-3.3-70b-versatile
EmailBrevo REST API (HTTP-based, no SMTP)
PDF Parsepdf2json with safeDecode wrapper
File UploadMulter with memoryStorage()
HTTP ClientAxios with centralized API layer
RoutingReact Router v6
DeploymentRender (free tier)

📁 Project Structure

resumeforge/
├── backend/
│ ├── src/
│ │ ├── controller/
│ │ │ ├── resume.controller.js ← POST /api/resume/analyse
│ │ │ └── email.controller.js ← POST /api/email/send
│ │ ├── middleware/
│ │ │ └── upload.middleware.js ← Multer (memoryStorage, PDF-only, 5MB)
│ │ ├── routes/
│ │ │ ├── resume.route.js
│ │ │ └── email.route.js
│ │ ├── services/
│ │ │ ├── ai.service.js ← Groq API + prompt engineering + JSON parsing
│ │ │ ├── pdf.service.js ← pdf2json text extraction
│ │ │ └── email.service.js ← Brevo API email delivery
│ │ └── utils/
│ │ └── env.js ← destructured process.env exports
│ └── app.js ← Express setup, CORS, route registration
│
└── frontend/
└── src/
├── components/
│ ├── Navbar.jsx
│ └── ResumeUpload.jsx
├── context/
│ └── ThemeContext.jsx ← dark/light theme via Context API
├── lib/
│ └── api.js ← centralized Axios instance
├── pages/
│ ├── Home.jsx
│ ├── Analysis.jsx
│ ├── EmailPreview.jsx
│ └── Success.jsx
└── App.jsx

🔄 How It Works

User fills form → Name, Target Job Role, HR Email, PDF Upload
↓
POST /api/resume/analyse (multipart/form-data)
↓
Multer → PDF stored in req.file.buffer (never hits disk)
↓
pdf2json → extracts raw text from buffer
↓
Groq API (LLaMA 3.3 70B) → receives resumeText + jobRole
↓
AI returns strict JSON → { email: {subject, body}, analysis: {...} }
↓
Backend validates → strips markdown fences → parses JSON → checks required fields
↓
Frontend → /analysis page (data passed via React Router state)
↓
User reviews → clicks "Preview & Send Email"
↓
POST /api/email/send → re-runs extraction + AI → Brevo sends email with PDF attachment
↓
/email-preview → user confirms → /success

🚀 Getting Started

Prerequisites

  • Node.js v18+
  • Groq API key (free tier available)
  • Brevo account + API key (300 emails/day free)

1. Clone

git clone https://github.com/coder-Rishi05/ResumeForge.git
cd ResumeForge

2. Backend

cd backend
npm install

Create .env:

PORT=3000API_KEY=your_groq_api_keyBREVO_API_KEY=your_brevo_api_keyEMAIL_USER=your_verified_sender@email.com
npm run dev

3. Frontend

cd frontend
npm install
npm run dev

Frontend: http://localhost:5173 | Backend: http://localhost:3000


🔌 API Reference

POST /api/resume/analyse

Analyse a resume against a target job role.

Requestmultipart/form-data

FieldTypeDescription
resumeFilePDF resume (max 5MB)
jobRoleStringTarget job role

Response

{
"success": true,
"email": { "subject": "...", "body": "..." },
"analysis": {
"overall_score": 72,
"overall_summary": "...",
"top_strengths": ["..."],
"critical_gaps": ["..."],
"keywords_to_add": ["..."],
"sections": {
"technical_skills": {
"score": 8,
"summary": "...",
"strengths": ["..."],
"suggestions": [{ "text": "...", "priority": "High" }],
"suggested_rewrites": [{ "current": "...", "improved": "..." }]
},
"projects": { "...": "..." },
"experience": { "...": "..." },
"education": { "...": "..." }
}
},
"meta": { "jobRole": "...", "fileSize": "120.5 KB", "fileName": "resume.pdf" }
}

POST /api/email/send

Generate AI cover email and send via Brevo with resume attached.

Requestmultipart/form-data

FieldTypeDescription
resumeFilePDF resume
toStringHR's email address
jobRoleStringTarget job role
applicantNameStringApplicant's full name

Response

{
"success": true,
"message": "Email successfully sent to hr@company.com",
"analysis": { "...": "..." },
"meta": {
"recipient": "hr@company.com",
"subject": "Application for Backend Developer — Rishabh Singh",
"jobRole": "Backend Developer",
"attachedFile": "resume.pdf",
"fileSize": "120.5 KB"
}
}

🧠 Key Technical Decisions

ProblemDecision
Render free tier blocks SMTP ports (25, 465, 587)Switched from Nodemailer/Gmail SMTP → Brevo HTTP REST API
pdf-parse ES Module import errorsSwitched to pdf2json with custom safeDecode for URL-encoded characters
LLaMA sometimes returns markdown-wrapped JSONPost-process: strip ```json fences → regex extract {...} → validate required fields
Ephemeral filesystem on RenderMulter memoryStorage — PDF lives only in req.file.buffer, no disk writes, no cleanup needed
Linear 4-step flow needs no global stateReact Router navigate(path, { state }) — clean, no Redux overhead

⚙️ Environment Variables

VariableRequiredDescription
PORTNoServer port (default: 3000)
API_KEYYesGroq API key
BREVO_API_KEYYesBrevo transactional email API key
EMAIL_USERYesVerified sender email in Brevo

🚢 Deployment (Render)

  1. Push backend to GitHub
  2. Create Web Service on Render
  3. Build Command: npm install | Start Command: node app.js
  4. Add environment variables in Render dashboard
  5. Deploy — auto-deploys on push to main

Note: Render free tier blocks SMTP. Brevo's HTTP REST API bypasses this completely.


📌 Roadmap

  • Resume score history (localStorage)
  • Support for .docx uploads
  • Improved section-level prompt tuning
  • UI polish pass with proper Tailwind utilities

📜 License

MIT


Built by Rishabh Singh · GitHub · LinkedIn

About

ResumeForge — AI-Powered Resume Analyser & Smart HR Outreach Tool

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages