A Full-Stack, AI-Powered Resume Evaluation Pipeline
Live Demo (Frontend): https://parsifyv1.vercel.app
- Overview
- Key Features
- System Architecture
- Evaluation Rubric
- Prerequisites
- Local Development Setup
- Configuration Details
- Usage Guide
- Privacy and Fairness
- License
Parsify is a comprehensive, full-stack web application designed to intelligently and fairly evaluate software engineering resumes. Instead of providing an opaque score like traditional ATS (Applicant Tracking Systems), Parsify focuses on explainability and transparency.
It parses resume PDFs natively into structural Markdown, extracts structured JSON data using a local or hosted Large Language Model (LLM), augments that data with real-world GitHub profile signals, and then produces an objective evaluation.
The final output provides candidates and recruiters with actionable insights, a detailed breakdown of strengths, and highest-impact areas for improvement.
- Multi-Format Document Extraction: Supports high-fidelity extraction from PDF, DOCX, and TXT files. PDFs are processed via PyMuPDF into rich Markdown.
- Provider-Agnostic AI: Seamlessly swap between local privacy-first models (via Ollama) and highly accurate cloud-based models (via Google Gemini).
- GitHub Enrichment: Automatically scans resumes for GitHub links or accepts manual input. It queries the GitHub REST API to pull repository statistics, identifying top-tier contributions to open source or complex personal projects.
- Career Path Prediction & Salary Estimates: Recommends alternative top roles (e.g., Frontend, Backend, ML) the candidate is suited for with AI-driven confidence scores and predicts a fair market base salary range.
- Fairness Checking: Verifies no bias based on restricted categories.
- Salary Prediction: Estimates candidate market value based on role and skills.
- Interview Question Generation: Automatically tailors technical/behavioral interview questions.
- Live PDF Export: Download the full evaluation report as a clean PDF (
@media printstyling). - Targeted Job Description Matching (Analyzer): (NEW) A dedicated
/analyzerpage where you can paste a Job Description and a Resume to get a live ATS match percentage, along with matched skills, missing skills (skill gap), and actionable recommendations. - Job-Tailored AI Resume Builder: (NEW) A dedicated
/buildertool to generate a professional summary and high-impact bullets from raw details via Gemini. By pasting a Target Job Description, the AI will explicitly tailor your content. - Professional PDF Export: (NEW) Includes a Real-Time Live Preview and PDF Export capabilities utilizing
jsPDFandhtml2canvasfor pixel-perfect resume downloads. - Bulk Excel Parsing & Indexing: (NEW) A dedicated
/bulkpage to upload an Excel or CSV file containing 100+ resume URLs. The system downloads, evaluates, and indexes them in the background. - Resume History & Versioning: Persists previous builder versions via local storage.
- Skill Gap Analysis: Explicitly visualizes matched and missing technologies against standard software engineering roles.
- Semantic Talent Search: Evaluated resumes are indexed into a local ChromaDB vector store, enabling powerful semantic searches by recruiters.
- Hybrid Search Architecture (NEW): We now combine Semantic Search (ChromaDB) with Sparse Keyword Search (BM25) to ensure exact technology matches are found.
- Reciprocal Rank Fusion (NEW): Utilizes RRF to mathematically merge semantic and keyword search streams for state-of-the-art candidate ranking.
- Rule-Based Candidate Explainer (NEW): Automatically generates transparent, AI-free explanations during talent search, highlighting exact skill overlaps, years of experience, and location matches.
- Side-by-Side Comparison: A dedicated
/compareview allows deep-diving into two candidates' metrics concurrently. - Context-Aware Skill Depth Scoring (NEW): Automatically weighs skills based on their proximity to 'projects' or 'production experience', rewarding proven application over mere keyword dropping.
- Fast Deterministic Semantic Similarity (SBERT) (NEW): Calculates an instant local fallback ATS Match Score using
all-MiniLM-L6-v2embeddings, independent of LLM latency. - Anti-Hallucination Keyword Verification (NEW): Runs a strict, deterministic regex check across the raw resume text to explicitly flag any skills hallucinated by the LLM, or verify existing ones.
- Confidence Levels (NEW): Displays an overall AI Confidence Rating (High, Medium, Low) for the evaluation output, based on text readability and semantic match strength.
- Beautiful, Responsive UI: A dark-mode-first dashboard built with React 19 and Tailwind CSS that elegantly renders complex JSON evaluation data into easy-to-read metric cards, including real-time search latency metrics.
The application uses a decoupled client-server architecture, allowing the heavy lifting (PDF parsing and LLM inference) to remain on a dedicated server.
[ User Browser ]
│
│ 1. Uploads PDF and Job Metadata
▼
[ Next.js API Proxy (/api/analyze) ]
│
│ 2. Forwards FormData securely
▼
[ FastAPI Backend (localhost:8000) ]
│
├─► PyMuPDF extracts Markdown text
├─► GitHub API fetches repository stats
└─► LLM (Gemini/Ollama) processes Jinja templates
│
│ 3. Returns structured EvaluationData
▼
[ Next.js API Proxy ]
│
│ 4. Maps to Feedback UI schema
▼
[ React UI Dashboard ] -> Renders Scores, Strengths, and Tips
- Framework: Next.js 15, React 19, TypeScript
- Styling: Tailwind CSS 3
- State Management: Zustand, combined with browser
localStoragefor persisting resume history. - Key Files:
app/api/analyze/route.ts: Secure serverless proxy route.app/upload/page.tsx: The primary interaction point for file uploads.
- Framework: FastAPI, Python 3.11+
- PDF Processing: PyMuPDF (
pymupdf4llm) - Validation: Pydantic models ensure strict typing of LLM JSON outputs.
- Key Files:
src/routes/evaluate.py: The main REST endpoint handling incoming files.src/services/score.py: Orchestrates the PDF extraction, GitHub enrichment, and LLM evaluation pipeline.
The AI evaluates candidates against a strict 120-point rubric:
- Open Source Contributions (35 points): Quality, popularity, and consistency of open-source work.
- Self Projects (30 points): Complexity, technical depth, and completeness of personal repositories.
- Production Experience (25 points): Years of professional experience, scale of systems built, and impact.
- Technical Skills (10 points): Relevance and breadth of programming languages and frameworks.
- Bonus Points (Up to +20 points): Awarded for exceptional achievements (e.g., highly starred repos, notable awards).
- Deductions: Explicitly deducted for spelling errors, formatting issues, or suspicious prompt injections.
Before you begin, ensure your system meets the following requirements:
- Node.js: v18 or newer.
- Python: v3.11 or v3.12 (Python 3.14+ is not recommended due to missing pre-built wheels for specific dependencies like
pydantic-core). - AI Backend (Choose One):
- Ollama: Installed locally and running (
ollama serve) with a pulled model (e.g.,ollama pull gemma3:4b). - Google Gemini: An active API Key from Google AI Studio.
- Ollama: Installed locally and running (
The repository is neatly divided. You must run both servers concurrently for the application to function.
Open your terminal and navigate to the backend folder:
cd fbackendCreate an isolated virtual environment to prevent dependency conflicts. On Windows:
py -3.11 -m venv venv
.\venv\Scripts\activateInstall all required Python packages:
pip install -r requirements.txtInitialize your environment variables by copying the template:
cp .env.example .env(Open the .env file in your code editor and configure your specific LLM credentials—see the Configuration section below).
Finally, launch the FastAPI development server:
uvicorn main:app --reload --port 8000The backend is now listening at http://127.0.0.1:8000.
Open a new terminal window and navigate to the frontend folder:
cd frontendInstall the Node dependencies:
npm installStart the Next.js development server:
npm run devThe frontend is now available at http://localhost:3000.
The backend utilizes an .env file to control the AI provider logic.
Backend (fbackend/.env)
| Variable | Description |
|---|---|
LLM_PROVIDER |
Set to ollama for local inference or gemini for cloud inference. |
DEFAULT_MODEL |
The specific model string. Example: gemma3:4b or gemini-2.5-flash. |
GEMINI_API_KEY |
Required only if LLM_PROVIDER is set to gemini. |
GITHUB_TOKEN |
(Optional) A personal access token to prevent rate-limiting during repo enrichment. |
Frontend (frontend/.env)
| Variable | Description |
|---|---|
NEXT_PUBLIC_BACKEND_URL |
The URL of the FastAPI backend. Defaults to http://localhost:8000 if not provided. Essential for production hosting. |
GEMINI_API_KEY |
Required for the Next.js API routes that interact directly with Gemini (e.g., Resume Builder). |
GEMINI_MODEL |
(Optional) Model used for frontend generative features. Defaults to gemini-1.5-flash. |
GITHUB_TOKEN |
(Optional) A personal access token to avoid rate limits if making GitHub API calls from frontend. |
- Navigate to
http://localhost:3000in your web browser. - Click Upload Resume on the dashboard.
- Fill in the optional context fields:
- Target Company Name
- Target Job Title
- Specific Job Description (for keyword matching)
- GitHub Profile Override
- Drag and drop a valid
.pdf,.docx, or.txtresume file. - Click Analyze.
- Wait 15-30 seconds as the backend extracts the Markdown, parses the sections, communicates with the LLM, and scores the profile.
- Review your detailed, evidence-backed evaluation report!
(You can also test the backend REST API independently by visiting the auto-generated Swagger documentation at http://localhost:8000/docs).
Parsify is built with privacy and equity in mind:
- Local Data: By utilizing Ollama, all resume processing can happen 100% locally on your machine, ensuring no PII (Personally Identifiable Information) is ever transmitted to third-party cloud providers.
- Fairness Measures: The absence of a GitHub profile is explicitly configured not to be treated as a negative signal during the evaluation phase.
- Human in the Loop: Parsify is designed as a tool to assist recruiters and candidates, not to make definitive hiring decisions. Always support AI evaluations with human review.
This project is licensed under the MIT License.