Full-Stack AI-Powered Resume Optimization Tool
Built with FastAPI, LLM (OpenAI/Gemini), Vector Search, and Modern Web Stack
This is a production-ready, recruiter-impressive ATS (Applicant Tracking System) resume generator that:
- Extracts job-specific keywords from job descriptions using LLMs (OpenAI/Gemini)
- Generates ATS-optimized resumes in Word (.docx) format with intelligent keyword injection
- Provides a modern web UI for recruiters and job seekers
- Uses vector embeddings to match candidate experience with job requirements (RAG)
- Maintains 1-page C3 resume format for maximum ATS compatibility
Perfect for showcasing: Full-Stack Development, ML/LLM Engineering, and Production-Ready Software Architecture.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client Layer β
β ββββββββββββββββ ββββββββββββββββ βββββββββββββββββββββββ β
β β Web Browser β β Mobile UI β β API Client β β
β β (HTML/JS) β β (Future) β β (cURL/Postman) β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββββββ¬βββββββββββ β
βββββββββββΌβββββββββββββββββββΌβββββββββββββββββββββββΌβββββββββββββ
β β β
β HTTP/REST β β
ββββββββββββββββββββΌβββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββ
β FastAPI Application Layer β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β FastAPI Server (Uvicorn) β β
β β βββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β Routes β β Middleware β β Auth/JWT β β β
β β β /generate β β (CORS, β β (Future) β β β
β β β /download β β Logging) β β β β β
β β β /health β β β β β β β
β β ββββββββ¬βββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β β
β βββββββββββΌββββββββββββββββββΌβββββββββββββββββββΌβββββββββββ β
ββββββββββββββΌββββββββββββββββββΌβββββββββββββββββββΌββββββββββββββ
β β β
ββββββββββββββΌββββββββββββββββββΌβββββββββββββββββββΌββββββββββββββ
β βββββββββΌββββββββ ββββββββΌββββββββ ββββββββΌβββββββ β
β β Business β β LLM Client β β Vector β β
β β Logic β β (OpenAI/ β β Search β β
β β Layer β β Gemini) β β (RAG) β β
β β β β β β β β
β β β’ Resume β β β’ Keyword β β β’ Embed β β
β β Generator β β Extract β β JD β β
β β β’ Template β β β’ Bullet β β β’ Match β β
β β Engine β β Rewrite β β Exp. β β
β β β’ Formatting β β β’ STAR β β β’ Retrieve β β
β βββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬βββββββ β
β β β β β
ββββββββββββββΌβββββββββββββββββββΌββββββββββββββββββΌββββββββββββββ
β βββββββββΌβββββββββ ββββββββΌβββββββ ββββββββΌβββββββ β
β β Data Layer β β Storage β β External β β
β β β β β β Services β β
β β β’ PostgreSQL β β β’ Vector β β β β
β β (Future) β β DB β β β’ OpenAI β β
β β β’ Pydantic β β (Chroma/ β β API β β
β β Models β β Qdrant) β β β’ Gemini β β
β β β’ File System β β β β API β β
β ββββββββββββββββββ βββββββββββββββ βββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER INPUT β
β 1. Paste Job Description (JD) β
β 2. Optionally: Upload existing resume / experience data β
ββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 1: JOB DESCRIPTION PROCESSING β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Validate JD format (Pydantic) β β
β β β’ Preprocess text (clean, normalize) β β
β β β’ Extract metadata (title, company, location) β β
β ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 2: LLM KEYWORD EXTRACTION β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β OpenAI/Gemini API Call: β β
β β β’ Prompt: "Extract 20-40 skills/keywords from JD" β β
β β β’ Model: gpt-4o-mini / gemini-pro β β
β β β’ Output: JSON array of keywords β β
β ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 3: VECTOR SEARCH (RAG) - OPTIONAL β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β IF user has uploaded experience data: β β
β β β’ Embed JD keywords using sentence-transformers β β
β β β’ Query vector DB for matching experience bullets β β
β β β’ Retrieve top 5-10 most relevant experience items β β
β ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 4: RESUME GENERATION β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β’ Load template (c3_template.docx) or create new β β
β β β’ Inject keywords into "Key Skills" section β β
β β β’ Format with python-docx (1-page limit) β β
β β β’ Apply ATS-friendly formatting β β
β ββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 5: OUTPUT β
β β’ Save DOCX to outputs/ directory β
β β’ Return file download link or direct file response β
β β’ Log generation metadata (for analytics) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Layer | Technology | Purpose |
|---|---|---|
| Web Framework | FastAPI | High-performance async API + auto-generated docs |
| LLM Provider | OpenAI / Google Gemini | Keyword extraction, bullet rewriting, STAR formatting |
| Document Generation | python-docx | Word (.docx) resume creation with precise formatting |
| Vector Search | sentence-transformers + Chroma/Qdrant | RAG for matching experience with job requirements |
| Validation | Pydantic v2 | Type-safe API request/response validation |
| Templating | Jinja2 | Dynamic HTML generation for web UI |
| Technology | Purpose |
|---|---|
| HTML5 + Tailwind CSS | Modern, responsive web UI |
| Vanilla JS / Alpine.js | Lightweight interactivity (no heavy frameworks) |
| Fetch API | Async API calls to FastAPI backend |
| Technology | Purpose |
|---|---|
| Docker | Containerization for portable deployment |
| Docker Compose | Multi-service orchestration (app + DB + vector DB) |
| GitHub Actions | CI/CD pipeline (tests β build β deploy) |
| PostgreSQL (Future) | Persistent storage for user accounts, job history |
| Prometheus / Grafana (Future) | Metrics and observability |
| Technology | Purpose |
|---|---|
| OpenAI API | GPT-4o-mini for cost-effective keyword extraction |
| sentence-transformers | Generate embeddings for JD and experience bullets |
| Chroma / Qdrant | Vector database for semantic search |
ats_resume_app/
β
βββ README.md # This file
βββ requirements.txt # Python dependencies
βββ .gitignore # Git ignore rules
βββ Dockerfile # Docker container config
βββ docker-compose.yml # Multi-service orchestration (Future)
β
βββ resume_templates/ # Word template files
β βββ c3_template.docx # C3 format resume template
β
βββ outputs/ # Generated resumes (gitignored)
β βββ .gitkeep
β
βββ src/ # Application source code
β βββ __init__.py
β βββ main.py # FastAPI app entry point
β βββ models.py # Pydantic models for validation
β βββ resume_generator.py # Core Word generation logic
β βββ llm_client.py # OpenAI/Gemini API integration
β βββ vector_search.py # RAG/vector search (Future)
β βββ utils.py # Helper functions
β
βββ static/ # Static assets
β βββ styles.css # CSS styles
β
βββ templates/ # HTML templates
β βββ index.html # Main web UI
β
βββ tests/ # Test suite (Future)
β βββ test_resume_generator.py
β βββ test_llm_client.py
β βββ conftest.py
β
βββ .github/ # CI/CD workflows
βββ workflows/
βββ ci.yml # GitHub Actions pipeline
- Python 3.11+
- pip
- (Optional) Docker + Docker Compose
- Clone and navigate to the project:
cd ats_resume_app- Create a virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate- Install dependencies:
pip install -r requirements.txt- Set environment variables:
# On Windows PowerShell:
$env:OPENAI_API_KEY = "sk-your-key-here"
# On Linux/Mac:
export OPENAI_API_KEY="sk-your-key-here"- Run the application:
uvicorn src.main:app --reload- Open in browser:
- Web UI: http://127.0.0.1:8000
- API Docs: http://127.0.0.1:8000/docs
# Build image
docker build -t ats-resume-app .
# Run container
docker run -p 8000:8000 -e OPENAI_API_KEY=sk-your-key ats-resume-appThis app can be deployed to various platforms:
- Railway (Recommended) - Best for FastAPI apps
- Render - Easy deployment with auto-scaling
- Vercel - Serverless functions (limited for long-running tasks)
- Fly.io - Global distribution
Quick Deploy to Railway:
- Push code to GitHub
- Go to https://railway.app and sign up with GitHub
- Create new project β Deploy from GitHub repo
- Add
OPENAI_API_KEYenvironment variable in Variables tab - Railway auto-deploys! Get your URL from Settings β Domains
Detailed Railway Setup:
- Connect your GitHub repository to Railway
- Railway automatically detects FastAPI and deploys
- Add environment variables in the Variables tab
- Your app will be live at
https://your-app.up.railway.app
GET /- Main HTML interface
POST /generate_resume/- Generate resume from form data (returns DOCX file)POST /api/generate_resume- Generate resume from JSON (returns metadata + download link)GET /download/{filename}- Download generated resumeGET /health- Health check endpointGET /docs- Interactive API documentation (Swagger UI)
# JSON API
curl -X POST "http://localhost:8000/api/generate_resume" \
-H "Content-Type: application/json" \
-d '{
"job_description": "Looking for a Python developer with FastAPI experience..."
}'- Basic FastAPI server
- LLM keyword extraction (placeholder)
- DOCX resume generation
- Simple web UI
- Docker support
- OpenAI Integration - Real LLM keyword extraction
- Enhanced Resume Generation - Better formatting, STAR bullets
- Vector Search (RAG) - Match experience with job requirements
- PostgreSQL Database - User accounts, job history
- JWT Authentication - Secure multi-user access
- Logging & Metrics - Structured logging, Prometheus metrics
- Multiple Resume Templates - Choose from C3, modern, creative
- Batch Processing - Generate resumes for multiple job descriptions
- Resume Analytics - ATS score, keyword match percentage
- CI/CD Pipeline - Automated testing and deployment
- Cloud Deployment - Deploy to AWS/GCP/Azure
# Run tests (when implemented)
pytest tests/
# With coverage
pytest --cov=src tests/| Variable | Description | Required |
|---|---|---|
OPENAI_API_KEY |
OpenAI API key for LLM features | Yes (for production) |
GEMINI_API_KEY |
Google Gemini API key (alternative) | Optional |
DATABASE_URL |
PostgreSQL connection string (future) | No |
JWT_SECRET |
Secret key for JWT auth (future) | No |
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License.
- Built with FastAPI
- LLM powered by OpenAI / Google Gemini
- Document generation using python-docx
For questions, issues, or suggestions, please open an issue on GitHub.
Built with β€οΈ for Full-Stack and ML/LLM Engineers