An enterprise-grade automated platform to parse resumes, evaluate ATS scores, extract technical skills, and generate contextual recommendations.
Key Features • Project Preview •pm tun Architecture • Tech Stack • Installation & Setup • API Reference • Roadmap • Contributing • Contributors
- Flexible Multi-Format Parsing — Instant text extraction from files (PDF format) using Python
pdfplumber. - ATS Optimizer & Scoring Engine — High-performance scoring algorithm that parses resumes against technical standard keywords.
- Contextual Skill Extraction — Detects core programming languages, frameworks, developer tools, database engines, and libraries.
- Dynamic Feedback Generation — Yields smart suggestions recommending targeted certifications, technologies, and formatting changes.
- Premium Glassmorphic UI — Fully responsive, beautiful interface with active state indicators, hover metrics, and smooth transitions built using Bootstrap 5.
┌──────────────┐ POST /api/upload/ ┌─────────────────┐
│ │ ────────────────────────────────> │ │
│ React Client │ │ Django Backend │
│ (Bootstrap) │ <──────────────────────────────── │ (REST API) │
└──────────────┘ Analysis JSON └─────────────────┘
│
▼
┌─────────────────┐
│ PDFPlumber Parser│
└─────────────────┘
│
▼
┌─────────────────┐
│ Keyword Matches │
│ & ATS Engine │
└─────────────────┘
- Framework: React 19 (Vite boilerplate)
- Language: TypeScript
- Styling: Bootstrap 5 + Vanilla CSS Variables (Glassmorphism theme)
- API Handler: Axios
- Framework: Django REST Framework (DRF)
- Language: Python 3.10+
- CORS Management: django-cors-headers
- Text Extractor: PDFPlumber
ai-resume-analyzer/
├── frontend/ # React frontend application
│ ├── public/ # Static public assets (ui.png, favicon, etc.)
│ ├── src/
│ │ ├── assets/ # Images, logos, and Vite assets
│ │ ├── App.css # Component layout configurations
│ │ ├── App.tsx # Application entry view & core client logic
│ │ ├── index.css # Core stylesheets and variables
│ │ └── main.tsx # DOM Renderer
│ ├── package.json # Node modules and dependency matrix
│ └── tsconfig.json # TypeScript compiler settings
│
├── backend/ # Django REST API backend
│ ├── resume_analyzer/ # Main settings, routing, and configurations
│ ├── analyzer/ # App endpoints, models, viewsets, and migrations
│ │ ├── migrations/ # Database migration schema
│ │ ├── models.py # Resume database models
│ │ ├── serializers.py # Django REST serialization maps
│ │ ├── urls.py # Endpoint routes
│ │ └── views.py # Resume parsing & scoring logic
│ ├── resumes/ # Storage path for processed resumes
│ ├── requirements.txt # Python dependencies list
│ └── manage.py # Django command utility
│
└── README.md
Ensure you have the following packages installed on your local development machine:
- Node.js (v18 or higher)
- Python (v3.10 or higher)
- Git
- Redis Server (running locally on port 6379 for Celery tasks)
git clone https://github.com/Muskankr/AI-Resume-Analyzer.gitWe recommend installing dependencies inside a secure Python virtual environment:
# Navigate to server directory
cd server
# Initialize a virtual environment
python -m venv venv
# Activate the virtual environment
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate
# Create local environment configuration from the example
# Windows:
copy .env.example .env
# macOS/Linux:
cp .env.example .env
# Install dependencies
pip install -r requirements.txt
# Execute database migrations
python manage.py migrate
# Spin up Django development server
python manage.py runserver
# In a separate terminal, activate the venv and start the Celery background worker:
# (Use --pool=solo on Windows to avoid process spawning issues)
celery -A resume_analyzer worker -l info --pool=soloThe API server starts on: http://127.0.0.1:8000/
| Variable | Description | Default / Placeholder |
|---|---|---|
SECRET_KEY |
Secret key for Django cryptographic signing | django-insecure-local-development-secret-key-change-me |
DEBUG |
Set to True for development, False for production |
True |
ALLOWED_HOSTS |
Comma-separated list of allowed host/domain names | localhost,127.0.0.1,127.0.0.1:8000 |
Create your environment variables by copying the provided examples:
cd frontend
cp .env.development.example .env.development
cp .env.production.example .env.productionThen install dependencies and start the app:
# Install packages
npm install
# Run the local Vite web server
npm run devThe client application will run at: http://localhost:5173/
| Variable | Description | Default / Placeholder |
|---|---|---|
VITE_BACKEND_URL |
The URL of the Django backend REST API server | http://127.0.0.1:8000 |
VITE_SENTRY_DSN |
Sentry DSN for frontend error tracking | (Empty) |
This project uses Sentry for production error tracking on both the frontend and backend. The integration includes a before_send (backend) and beforeSend (frontend) hook to actively sanitize request bodies and prevent Personally Identifiable Information (PII) or resume content from being sent to the tracking service.
- Create a free developer account at Sentry.io.
- Create two new projects in Sentry:
- One for Django (Backend)
- One for React (Frontend)
- Copy the respective DSN (Data Source Name) for each project.
Add the DSNs to your .env files:
Backend (server/.env)
SENTRY_DSN=your-django-sentry-dsnFrontend (client/.env)
VITE_SENTRY_DSN=your-react-sentry-dsnFor local development, you do not need to set the Sentry DSNs.
- If
SENTRY_DSNandVITE_SENTRY_DSNare missing or empty, Sentry remains inactive. - The application will initialize normally without any tracking overhead or startup errors.
Test suites and coverage reports are wired into the project setup for both backend and frontend submodules.
# Run test coverage for both Frontend and Backend
npm run test:coverage
# Run Frontend tests with Vitest coverage
npm run test:coverage:frontend
# Run Backend tests with Coverage.py
npm run test:coverage:backendcd backend
coverage run manage.py test analyzer
coverage report- Coverage Configuration: Configured in
backend/.coveragerc - Minimum Threshold: 60% line coverage.
cd frontend
npm run test:coverage- Coverage Configuration: Configured in
frontend/vite.config.ts - Minimum Threshold: 50% across lines, functions, branches, and statements.
Validates and parses an uploaded resume, matches standard technical keywords, calculates scores, and returns suggestions.
- Endpoint:
/api/upload/ - Method:
POST - Payload Format:
multipart/form-data
| Name | Type | Required | Description |
|---|---|---|---|
file |
binary (PDF) |
Yes | The document to analyze |
{
"score": 80,
"skills_found": [
"python",
"django",
"react",
"git"
],
"suggestions": [
"Mention Django experience",
"Add frontend skills like React"
]
}The resume upload endpoint (POST /api/upload/) is throttled per client IP using DRF's SimpleRateThrottle.
| Setting | Default | Description |
|---|---|---|
RESUME_UPLOAD_RATE |
10/hour |
Max requests per IP. Format: <n>/hour, <n>/day, <n>/min |
To change the limit, set RESUME_UPLOAD_RATE in your server/.env:
RESUME_UPLOAD_RATE=20/hourWhen the limit is exceeded, the API returns:
// HTTP 429 Too Many Requests
// Retry-After: <seconds>
{ "detail": "Request was throttled. Expected available in <N> seconds." }Standard security headers are configured for both the frontend (client) and backend (server) environments to mitigate common vulnerabilities:
- Content-Security-Policy (CSP): Limits the resources (scripts, styles, connections) the browser is allowed to load.
- Client: Allows
'self'resources, inline scripts/styles for React/Bootstrap, and local/production backend API connections. - Server (API): Uses a strict
default-src 'none';for JSON API responses, and standard self-hosting for Django admin.
- Client: Allows
- X-Frame-Options (
DENY): Prevents the app from being embedded in<iframe>tags, mitigating Clickjacking attacks. - X-Content-Type-Options (
nosniff): Disables MIME-type sniffing to prevent MIME-based attacks. - Referrer-Policy (
strict-origin-when-cross-origin): Protects privacy by stripping referrer paths when making cross-origin requests.
To ensure parity between local development and production environments, the headers are applied in both locations:
- Production (Vercel): Configured via vercel.json files in the root and frontend directories.
- Local Development (Vite): Preconfigured in vite.config.ts to send headers when running the local dev server (
npm run dev). - Django Backend: Applied dynamically in all environments via Django settings and a custom middleware in middleware.py.
- DOCX Document Parsing — Integrate
python-docxto support Word resume parser pipelines. - Dark Mode Toggle — Implement user-theme selections with CSS theme tokens persisted in
localStorage. - Target Job Role Comparison — Match resume skill outputs directly against selectable target job roles.
- Persistent User Dashboard — Save and render a timeline history of past scores using client-side indexing.
- Upload Interactive States — Dash borders and overlay drop indicators to make file uploads feel extremely natural.
We welcome contributions of all levels under the ECSoC'26 program!
📜 Please read our Code of Conduct before participating in this project. By contributing, you agree to abide by its guidelines.
- Fork the repository on GitHub.
- Clone your fork and create a checkout branch:
git checkout -b feature/your-feature-name
- Commit your changes with standard semantic commit messages (e.g.
feat: ...,fix: ...). - Push changes to your fork and create a Pull Request (PR) targeting the upstream
mainbranch.
Please review active issues before creating duplicates, and always link open issues to your Pull Request!
This repository uses a CODEOWNERS file to automatically request reviews from maintainers whenever a Pull Request is opened.
- The file lives at
.github/CODEOWNERS. - Currently, all files (
*) are owned by @Muskankr. - When you open a PR, GitHub will automatically add the code owner as a reviewer.
- As the project grows, ownership can be split by folder (e.g.
/frontend/→ frontend maintainers,/backend/→ backend maintainers).
- Muskan Kumari (@Muskankr) — Project Creator & Lead Maintainer
A huge thanks to all the developers who have contributed code, fixed bugs, and improved documentation!


