๐ Building an AI-Powered Resume Optimizer with Angular, Node.js & Gemini
Struggling to tailor your resume for specific job postings? I built an AI-powered Resume Optimizer that helps you analyze your resume against any job description using Google Gemini. Here’s how I built it using the MEAN stack (MongoDB-free) with Angular standalone components, Tailwind CSS, and Googleโs Generative AI API.
๐ก Why I Built This
Every job role has unique expectations, but most resumes stay generic. I wanted to automate the process of matching resumes with job descriptions, highlighting what’s missing, and suggesting improvementsโall with the power of AI.
๐ Tech Stack
Layer | Stack |
---|---|
Frontend | Angular 20, Standalone Components, Tailwind CSS, Signals, Reactive Forms |
Backend | Node.js, Express, Multer |
AI Engine | Google Gemini via @google/genai
|
Parsing |
pdf-parse and mammoth for file extraction |
๐ง Features
- โ Upload Resume (PDF or DOCX)
- โ Upload or Paste Job Description
-
โ Get AI analysis:
- Match Score
- Missing Keywords
- Tailored Suggestions
-
๐ Dark Mode Support
-
๐ฑ Fully Responsive UI
๐งฉ System Architecture
[Angular UI] --> [Express API] --> [Gemini API]
|
[PDF/DOCX Parser]
๐ฅ๏ธ Frontend Highlights
- Standalone Angular Components
- Signals for local state (
resumeFile
,jdFile
, etc.) - Native control flow (
@if
,@else
) over structural directives - Reactive Forms for input validation
- Markdown rendering using
ngx-markdown
for AI response formatting
const form = fb.nonNullable.group({ jdText: '' });
const resumeFile = signal<File | null>(null);
const result = signal<string | null>(null);
๐ง Backend Highlights
- File parsing using
pdf-parse
(PDF) andmammoth
(DOCX) - Gemini prompt format:
Compare the following resume and job description. Provide:
- Match score (0-100)
- Missing keywords
- Suggested improvements
- AI integration via
@google/genai
:
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const response = await ai.models.generateContent({ model: 'gemini-2.5-flash', contents: prompt });
๐ How to Run It Locally
๐ Clone the Project
git clone https://github.com/manthanank/resume-optimizer.git
cd resume-optimizer
โ๏ธ Backend Setup
cd backend
npm install
cp .env.example .env
# Add your GEMINI_API_KEY
npm run dev
๐ Frontend Setup
cd frontend
npm install
ng serve
๐ Hosted Live (Demo)
- Frontend: https://resume-optimizer-app.vercel.app
- Backend API: https://resume-optimizer-api.vercel.app
๐ฆ Future Improvements
- ๐ Auth for saving resume history
- ๐ Editable resume templates
- ๐ PDF download of feedback
- ๐ Multi-language support
๐ License
MIT โ Free to use and modify. Contributions welcome!
โจ Final Thoughts
This project taught me how to combine real-time file processing with AI content generation in a full-stack TypeScript environment. Whether you’re building something for HR, job seekers, or just love AIโthis app is a perfect side project to learn from.
๐ Want to try it?
๐ GitHub Repo
๐ Live Demo