Skip to content

M-ABHIRAM36/resume_screener

Repository files navigation

๐Ÿ“„ Resume Screening & Career Guidance System

AI-Powered Resume Analysis, Skill Gap Detection & Personalized Career Roadmaps

React Node.js FastAPI TailwindCSS spaCy License


A full-stack AI platform that automates resume screening for HR teams and provides personalized career guidance for candidates โ€” powered by NLP, BERT embeddings, TF-IDF analysis, and intelligent scoring algorithms.

Features โ€ข Architecture โ€ข Quick Start โ€ข API Reference โ€ข Contributing


Landing Page

๐Ÿ“‘ Table of Contents


โœจ Features

๐Ÿข HR Portal

Feature Description
Batch Resume Upload Upload & analyze up to 200 resumes simultaneously (PDF/DOCX)
Intelligent Scoring 5-category scoring: Skill Match, Experience, Projects, Keywords, Education
Advanced Filtering Filter by skills, location, college, experience, match percentage + 15+ filter types
Candidate Ranking Auto-ranked candidates with sortable table view
Job Management Create/manage job listings with required skills
JWT Authentication Secure HR login/signup with JWT tokens
Expandable Skills View all extracted skills per candidate in the dashboard table
Quick Presets One-click filter presets for common screening scenarios

๐Ÿ‘ค Candidate Portal

Feature Description
Resume Score Evaluation Get a realistic ATS-style score with detailed breakdown
5-Category Breakdown Skill Match, Experience, Projects, Keywords, Education โ€” each scored individually
Circular Score Displays SVG-animated score rings with color-coded results
Bonus Factor Detection Projects, achievements, publications, leadership, internships, portfolio
Skill Gap Analysis Priority-ranked missing skills: Critical, Important, Nice-to-Have
Area Strength Analysis Visual category bars showing weak vs strong areas
Learning Roadmap Personalized 4-phase roadmap: Foundation โ†’ Core โ†’ Practice โ†’ Job-Ready
Visual Career Roadmaps 80+ downloadable roadmap images for different career paths
Custom Job Description Paste any JD โ€” auto-detects 50+ skill keywords
Extracted Profile Shows parsed name, email, phone, experience, college, degree, location

๐Ÿค– AI / ML Capabilities

Feature Description
spaCy NER Named entity recognition for person names and organizations
BERT Embeddings Sentence-transformers (all-MiniLM-L6-v2) for semantic resume-job similarity
TF-IDF Matching Keyword relevance scoring using scikit-learn TF-IDF vectorizer
Smart Skill Extraction 180+ skills from knowledge base + 80+ canonical variation mappings
Section-Aware Parsing Experience extraction respects resume section boundaries
College Detection Two-pass extraction: prefers B.Tech/M.Tech institutions, skips 10th/12th schools
Indian Phone Support Regex patterns for Indian (+91), US (+1), and generic phone formats
Portfolio Detection Auto-detects GitHub, LinkedIn, and personal website links

๐Ÿ— System Architecture

High-Level Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                              USER BROWSER                                   โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚  Landing     โ”‚   โ”‚  Candidate  โ”‚   โ”‚  HR Dashboardโ”‚   โ”‚  Auth Pages  โ”‚  โ”‚
โ”‚   โ”‚  Page        โ”‚   โ”‚  Portal     โ”‚   โ”‚  + Filters   โ”‚   โ”‚  Login/Signupโ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚          โ”‚                 โ”‚                  โ”‚                   โ”‚          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚                 โ”‚                  โ”‚                   โ”‚
           โ–ผ                 โ–ผ                  โ–ผ                   โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     REACT FRONTEND (Vite, Port 5173)                        โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚ App.jsx  โ”‚  โ”‚ api.js    โ”‚  โ”‚ Pages/   โ”‚  โ”‚Components/โ”‚  โ”‚ Data/     โ”‚  โ”‚
โ”‚   โ”‚ Router   โ”‚  โ”‚ GET/POST  โ”‚  โ”‚ 8 pages  โ”‚  โ”‚ 6 shared  โ”‚  โ”‚ job_roles โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                       โ”‚                                                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                        โ”‚  HTTP (fetch)
                        โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   NODE.JS BACKEND (Express, Port 5000)                      โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚ HR Auth      โ”‚  โ”‚ HR Resume     โ”‚  โ”‚ HR Dashboard   โ”‚  โ”‚ Candidate  โ”‚  โ”‚
โ”‚   โ”‚ Controller   โ”‚  โ”‚ Controller    โ”‚  โ”‚ Controller     โ”‚  โ”‚ Controller โ”‚  โ”‚
โ”‚   โ”‚ JWT signup/  โ”‚  โ”‚ multer upload โ”‚  โ”‚ mock data gen  โ”‚  โ”‚ single     โ”‚  โ”‚
โ”‚   โ”‚ login        โ”‚  โ”‚ up to 200     โ”‚  โ”‚ filtering      โ”‚  โ”‚ analysis   โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                             โ”‚                                      โ”‚        โ”‚
โ”‚                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚
โ”‚                     โ–ผ                                                       โ”‚
โ”‚            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                       โ”‚
โ”‚            โ”‚  mlService.js   โ”‚   โ”‚ mockMlService.js  โ”‚                       โ”‚
โ”‚            โ”‚  FormData proxy โ”‚   โ”‚ Synthetic data    โ”‚                       โ”‚
โ”‚            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                       โ”‚
โ”‚                     โ”‚                                                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                      โ”‚  HTTP (axios + FormData)
                      โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  PYTHON ML SERVICE (FastAPI, Port 8000)                      โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚ routes.py    โ”‚  โ”‚ resume_       โ”‚  โ”‚ skill_         โ”‚  โ”‚ scorer.py  โ”‚  โ”‚
โ”‚   โ”‚ /analyze-    โ”‚  โ”‚ parser.py     โ”‚  โ”‚ extractor.py   โ”‚  โ”‚ BERT +     โ”‚  โ”‚
โ”‚   โ”‚ resumes      โ”‚  โ”‚ PDF/DOCX      โ”‚  โ”‚ 180+ skills    โ”‚  โ”‚ TF-IDF     โ”‚  โ”‚
โ”‚   โ”‚ endpoint     โ”‚  โ”‚ extraction    โ”‚  โ”‚ extraction     โ”‚  โ”‚ scoring    โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                                                                             โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                   โ”‚
โ”‚   โ”‚ schemas.py   โ”‚  โ”‚ main.py       โ”‚  โ”‚ data/          โ”‚                   โ”‚
โ”‚   โ”‚ Pydantic     โ”‚  โ”‚ FastAPI app   โ”‚  โ”‚ skills.json    โ”‚                   โ”‚
โ”‚   โ”‚ models       โ”‚  โ”‚ entry point   โ”‚  โ”‚ 180+ skills    โ”‚                   โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                   โ”‚
โ”‚                                                                             โ”‚
โ”‚   NLP Models: spaCy (en_core_web_sm) + sentence-transformers                โ”‚
โ”‚               (all-MiniLM-L6-v2) + scikit-learn TF-IDF                      โ”‚
โ”‚                                                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Data Flow

                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚      CANDIDATE FLOW                   โ”‚
                    โ”‚                                       โ”‚
                    โ”‚   Upload Resume (PDF/DOCX)            โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   Select Job Role / Paste JD          โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   POST /candidate/analyze              โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   Backend โ†’ ML Service                 โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚
                    โ”‚   โ”‚ 1. Parse PDF/DOCX       โ”‚         โ”‚
                    โ”‚   โ”‚ 2. Extract text          โ”‚         โ”‚
                    โ”‚   โ”‚ 3. Extract: name, email  โ”‚         โ”‚
                    โ”‚   โ”‚    phone, experience,    โ”‚         โ”‚
                    โ”‚   โ”‚    college, skills        โ”‚         โ”‚
                    โ”‚   โ”‚ 4. Match skills vs JD    โ”‚         โ”‚
                    โ”‚   โ”‚ 5. BERT similarity       โ”‚         โ”‚
                    โ”‚   โ”‚ 6. TF-IDF keywords       โ”‚         โ”‚
                    โ”‚   โ”‚ 7. Quality bonus check   โ”‚         โ”‚
                    โ”‚   โ”‚ 8. Compute final score   โ”‚         โ”‚
                    โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
                    โ”‚                โ”‚                       โ”‚
                    โ”‚                โ–ผ                       โ”‚
                    โ”‚   Return: score, matchedSkills,       โ”‚
                    โ”‚   missingSkills, categoryScores,       โ”‚
                    โ”‚   bonusFactors, extracted profile      โ”‚
                    โ”‚                โ”‚                       โ”‚
                    โ”‚                โ–ผ                       โ”‚
                    โ”‚   Navigate to Score / SkillGap /      โ”‚
                    โ”‚   Roadmap pages                        โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚         HR FLOW                        โ”‚
                    โ”‚                                       โ”‚
                    โ”‚   Login (JWT) โ†’ Select/Create Job     โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   Upload up to 200 Resumes             โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   POST /hr/resumes                     โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   Same ML pipeline for each resume    โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   Apply filters (skill, location,     โ”‚
                    โ”‚   college, experience, match%)         โ”‚
                    โ”‚          โ”‚                             โ”‚
                    โ”‚          โ–ผ                             โ”‚
                    โ”‚   Return ranked candidate list        โ”‚
                    โ”‚   with scores and details              โ”‚
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Tech Stack

Frontend

Technology Version Purpose
React 18.2 UI component library
React Router DOM 6.14 Client-side routing
Vite 5.x Build tool & dev server
Tailwind CSS 3.4 Utility-first CSS framework
PostCSS 8.x CSS processing
Autoprefixer 10.x Cross-browser CSS prefixes

Backend

Technology Version Purpose
Node.js 16+ Server runtime
Express 4.18 HTTP framework
Multer 1.x File upload middleware
Axios 1.x HTTP client for ML service
JSON Web Token 9.x Authentication
CORS 2.x Cross-origin resource sharing
Form-Data 4.x Multipart form data builder

ML Service

Technology Version Purpose
Python 3.10+ Language runtime
FastAPI 0.95+ Web framework
Uvicorn 0.22+ ASGI server
spaCy 3.5+ NLP โ€” NER, tokenization
sentence-transformers 2.2+ BERT embeddings (all-MiniLM-L6-v2)
scikit-learn 1.2+ TF-IDF vectorizer, cosine similarity
pdfplumber 0.7+ PDF text extraction (layout-aware)
python-docx 0.8+ DOCX text extraction
PyPDF2 3.0+ Fallback PDF reader
python-multipart 0.0+ Multipart file upload support
NumPy 1.x Numerical operations
PyTorch 1.12+ Deep learning backend for BERT

๐Ÿ“ Project Structure

resume-screening-project/
โ”‚
โ”œโ”€โ”€ ๐Ÿ“„ README.md                          โ† You are here
โ”œโ”€โ”€ ๐Ÿ“„ package.json                       โ† Frontend dependencies & scripts
โ”œโ”€โ”€ ๐Ÿ“„ vite.config.js                     โ† Vite configuration
โ”œโ”€โ”€ ๐Ÿ“„ tailwind.config.cjs                โ† Tailwind CSS configuration
โ”œโ”€โ”€ ๐Ÿ“„ postcss.config.cjs                 โ† PostCSS configuration
โ”œโ”€โ”€ ๐Ÿ“„ index.html                         โ† HTML entry point
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ src/                               โ† REACT FRONTEND SOURCE
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ main.jsx                       โ† App entry (React 18 createRoot)
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ App.jsx                        โ† Router + layout + navigation
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ api.js                         โ† API helper (GET/POST to localhost:5000)
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ index.css                      โ† Global styles (Tailwind layers)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ pages/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ landing.jsx                โ† Landing page (hero + role selection)
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ auth/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ Login.jsx              โ† HR login form
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ Signup.jsx             โ† HR signup form
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ RoleSelect.jsx         โ† Role selection page
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ candidate/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ Dashboard.jsx          โ† Job selection + resume upload (314 lines)
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ ResumeScore.jsx        โ† Score report + category breakdown (272 lines)
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ SkillGap.jsx           โ† Gap analysis + priority ranking (237 lines)
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ Roadmap.jsx            โ† Learning plan + roadmap images (342 lines)
โ”‚   โ”‚   โ”‚
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ hr/
โ”‚   โ”‚       โ””โ”€โ”€ ๐Ÿ“„ Dashboard.jsx          โ† HR dashboard + filters + table (732 lines)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ components/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ CandidateCard.jsx          โ† Candidate summary card (HR view)
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ FilterPanel.jsx            โ† 15+ filter options for HR
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ ProgressBar.jsx            โ† Animated progress bar
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ ResumeUpload.jsx           โ† Drag & drop file uploader
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ RoadmapTimeline.jsx        โ† Vertical timeline component
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ ScoreBadge.jsx             โ† Gradient score badge
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ SkillBadge.jsx             โ† Skill chip component
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ data/
โ”‚       โ””โ”€โ”€ ๐Ÿ“„ job_roles.json             โ† Job roles + required skills + roadmap steps (731 lines)
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ public/
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ roadmaps/                      โ† 80+ career roadmap PNG images
โ”‚       โ”œโ”€โ”€ ๐Ÿ“ท backend.png
โ”‚       โ”œโ”€โ”€ ๐Ÿ“ท frontend.png
โ”‚       โ”œโ”€โ”€ ๐Ÿ“ท full-stack.png
โ”‚       โ”œโ”€โ”€ ๐Ÿ“ท react.png
โ”‚       โ”œโ”€โ”€ ๐Ÿ“ท python.png
โ”‚       โ”œโ”€โ”€ ๐Ÿ“ท machine-learning.png
โ”‚       โ”œโ”€โ”€ ๐Ÿ“ท devops.png
โ”‚       โ””โ”€โ”€ ๐Ÿ“ท ... (80+ more)
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ backend/                           โ† NODE.JS BACKEND
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ package.json                   โ† Backend dependencies
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ server.js                      โ† HTTP server (port 5000)
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ app.js                         โ† Express app + route mounting
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ controllers/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrAuthController.js        โ† Signup/login with JWT
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrJobController.js         โ† Job CRUD + auto-generate up to 50
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrResumeController.js      โ† Batch resume upload + ML analysis
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrDashboardController.js   โ† Mock dashboard data + filtering
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrDebugController.js       โ† ML service health check
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ candidateController.js     โ† Single resume analysis for candidates
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ routes/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrAuthRoutes.js            โ† POST /signup, /login
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrJobRoutes.js             โ† POST /, GET /, GET /:id
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrResumeRoutes.js          โ† POST / (multer, 200 files max)
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrDashboardRoutes.js       โ† GET /:jobId
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hrDebugRoutes.js           โ† GET /check-ml
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ candidateRoutes.js         โ† POST /analyze (multer, 1 file)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ services/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ mlService.js               โ† ML service HTTP client (FormData proxy)
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ mockMlService.js           โ† Synthetic candidate data generator
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ data/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ hr_users.json              โ† Stored HR accounts
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ jobs.json                  โ† Created job listings
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ dummyColleges.json         โ† College names for mock data
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ dummyLocations.json        โ† Location names for mock data
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ uploads/                       โ† Uploaded resume files (gitignored)
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ ml-service/                        โ† PYTHON ML SERVICE
โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ requirements.txt              โ† Python dependencies
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ ๐Ÿ“‚ app/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ main.py                   โ† FastAPI app entry point
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ routes.py                 โ† Main endpoint + all extraction logic (1304 lines)
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ schemas.py                โ† Pydantic response models
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ scorer.py                 โ† BERT + TF-IDF scoring engine
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ skill_extractor.py        โ† Skill extraction with 80+ variations
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ resume_parser.py          โ† PDF/DOCX text extraction
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ ๐Ÿ“‚ data/
โ”‚       โ””โ”€โ”€ ๐Ÿ“„ skills.json               โ† 180+ skill knowledge base
โ”‚
โ””โ”€โ”€ ๐Ÿ“‚ docs/                             โ† DOCUMENTATION
    โ”œโ”€โ”€ ๐Ÿ“„ README.md                     โ† Academic project documentation (432 lines)
    โ”œโ”€โ”€ ๐Ÿ“„ system_architecture.html       โ† System architecture document
    โ”œโ”€โ”€ ๐Ÿ“„ system_architecture_ppt.html   โ† Architecture presentation
    โ””โ”€โ”€ ๐Ÿ“„ data_flow_diagrams.html        โ† Data flow diagrams

๐Ÿš€ Quick Start / Local Setup

Prerequisites

Make sure you have the following installed on your system:

Tool Version Check Command Download
Node.js 16+ node --version nodejs.org
npm 8+ npm --version Comes with Node.js
Python 3.10+ python --version python.org
pip 22+ pip --version Comes with Python
Git 2.x git --version git-scm.com

Step 1 โ€” Clone the Repository

# Clone the project
git clone https://github.com/your-username/resume-screening-project.git

# Navigate to the project directory
cd resume-screening-project

Step 2 โ€” ML Service (Python)

The ML service is the AI brain of the platform. Set it up first since other services depend on it.

# Navigate to ML service directory
cd ml-service

# Create a Python virtual environment
python -m venv .venv

# Activate the virtual environment
# On Windows (PowerShell):
.\.venv\Scripts\Activate.ps1

# On Windows (CMD):
.\.venv\Scripts\activate.bat

# On macOS/Linux:
source .venv/bin/activate

# Install Python dependencies
pip install -r requirements.txt

# Download the spaCy English model
python -m spacy download en_core_web_sm

# Start the ML service
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000

# You should see:
# INFO:     Uvicorn running on http://0.0.0.0:8000
# INFO:     Started reloader process

โฑ๏ธ First-time startup note: The first run will download the all-MiniLM-L6-v2 sentence-transformer model (~80 MB). This only happens once and may take 1-2 minutes depending on your internet speed.

๐Ÿ’ก Verify: Open http://localhost:8000/docs to see the FastAPI Swagger UI.

Step 3 โ€” Backend (Node.js)

Open a new terminal (keep ML service running):

# Navigate to backend directory
cd backend

# Install Node.js dependencies
npm install

# Start the backend server
node server.js

# You should see:
# Server running on port 5000

๐Ÿ’ก Verify: Open http://localhost:5000 โ€” you should see {"message":"Resume Screening Backend (HR)"}

Step 4 โ€” Frontend (React)

Open another new terminal (keep both ML service and backend running):

# Navigate to project root (not backend!)
cd resume-screening-project

# Install frontend dependencies
npm install

# Start the Vite dev server
npm run dev

# You should see:
#   VITE v5.x  ready in XXX ms
#   โžœ  Local:   http://localhost:5173/

๐Ÿ’ก Open: Navigate to http://localhost:5173 in your browser.

Running All Services

You need 3 terminals running simultaneously:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                                                              โ”‚
โ”‚   Terminal 1 (ML Service):                                   โ”‚
โ”‚   cd ml-service                                              โ”‚
โ”‚   .\.venv\Scripts\Activate.ps1                               โ”‚
โ”‚   python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 โ”‚
โ”‚                                                โœ… Port 8000  โ”‚
โ”‚                                                              โ”‚
โ”‚   Terminal 2 (Backend):                                      โ”‚
โ”‚   cd backend                                                 โ”‚
โ”‚   node server.js                                             โ”‚
โ”‚                                                โœ… Port 5000  โ”‚
โ”‚                                                              โ”‚
โ”‚   Terminal 3 (Frontend):                                     โ”‚
โ”‚   npm run dev                                                โ”‚
โ”‚                                                โœ… Port 5173  โ”‚
โ”‚                                                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Quick Verification Checklist

  • http://localhost:8000/docs โ€” FastAPI Swagger docs load
  • http://localhost:5000 โ€” Backend responds with JSON
  • http://localhost:5000/hr/debug/check-ml โ€” ML connectivity check passes
  • http://localhost:5173 โ€” React app loads with landing page

๐Ÿ“– Usage Guide

Candidate Portal

  1. Open the app โ†’ Click "Login as Candidate" on the landing page
  2. Select a target job role from the dropdown (e.g., "Frontend Developer") or click "Paste Job Description" to paste a custom JD
  3. Upload your resume (PDF or DOCX, max 10 MB)
  4. Click "Analyze Resume" โ€” wait for the AI analysis

You'll be navigated to the Resume Score page:

Page What You See
Resume Score Overall score (0-100), job match %, 5-category breakdown bars, bonus factors, matched/missing skills, extracted profile
Skill Gap Coverage %, priority-ranked missing skills (Critical/Important/Nice-to-Have), weak areas with inline progress bars
Roadmap Personalized 4-phase learning plan (Foundation โ†’ Core โ†’ Practice โ†’ Job-Ready) + full career roadmap image

HR Portal

  1. Sign up โ†’ Create an HR account with company name, email, password
  2. Login โ†’ Authenticate with JWT
  3. Create a job or select an existing role
  4. Upload resumes (batch upload up to 200 files)
  5. View ranked candidates โ†’ Sort, filter, and compare
  6. Use filters โ†’ Filter by skills, location, experience, match percentage, and more

๐Ÿ“ฆ Module Descriptions

1. ML Service โ€” Python FastAPI

The ML service is the core intelligence layer responsible for all resume analysis.

routes.py (1,304 lines)

The largest file in the project. Contains:

Function / Section Lines Purpose
Regex Patterns 1-50 Compiled patterns for email, phone (IN/US/generic), URLs
extract_name_from_text() ~60-120 spaCy NER โ†’ PERSON entities, title-case heuristics, fallback extraction
extract_email() ~120-140 Regex extraction of email addresses
extract_phone() ~140-175 Multi-format phone extraction (Indian +91, US +1, generic)
extract_portfolio_links() ~175-220 GitHub, LinkedIn, personal website detection
count_internships() ~220-260 Keyword counting for intern/internship mentions
extract_experience_years() ~260-380 Section-aware extraction: "X years of experience", date ranges, year counting
extract_location() ~380-440 Strict whitelist matching against Indian cities/states
extract_branch() ~440-480 Branch/specialization from degree (CSE, ECE, IT, etc.)
extract_degree() ~480-535 Degree detection (B.Tech, M.Tech, BCA, MCA, BE, ME, etc.)
extract_college_smart() ~536-670 Two-pass college extraction โ€” skips 10th/12th schools, prefers university-level B.Tech/M.Tech institutions
Quality signal detection ~670-800 Projects, achievements, publications, leadership, technical depth, top institutes, portfolio
Scoring logic ~800-990 Match percentage, overall score, category scores, labels
POST /analyze-resumes ~998-1304 Main endpoint: file handling, orchestration, response building

scorer.py

# Lazy-loaded sentence-transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')

# BERT semantic similarity between resume text and job description
semantic_similarity(resume_text, job_description) โ†’ float [0, 1]

# TF-IDF keyword overlap
keyword_similarity(resume_text, job_description) โ†’ float [0, 1]

# Combined score
compute_score(resume_text, job_description, skill_scores) โ†’ float [0, 1]
#   Weights: Skills 45%, BERT 40%, TF-IDF 15%

skill_extractor.py

# 80+ canonical variation mappings
SKILL_VARIATIONS = {
    "JavaScript": ["javascript", "js", "es6", "es2015", "ecmascript"],
    "TypeScript": ["typescript", "ts"],
    "React": ["react", "reactjs", "react.js"],
    "Node.js": ["node.js", "nodejs", "node"],
    # ... 80+ more entries
}

# Extract skills from text
extract_skills(text) โ†’ List[str]
# 1. Check canonical variations (word boundary regex)
# 2. Check skills.json database (word boundary regex)
# 3. Map to canonical display names
# 4. Deduplicate

resume_parser.py

# Supported formats
extract_text_from_bytes(file_bytes, filename) โ†’ str

# PDF:  pdfplumber (layout-aware with table extraction)
# DOCX: python-docx (headers + paragraphs + tables)
# DOC:  UTF-8 decode fallback for .doc files

schemas.py

class AnalyzeResponse(BaseModel):
    candidateId: str
    name: str
    email: str
    phone: str
    skills: List[str] = []
    matchedSkills: List[str] = []
    missingSkills: List[str] = []
    experience: int = 0
    internships: int = 0
    college: str = ""
    branch: str = ""
    degree: str = ""
    location: str = ""
    portfolioLinks: List[str] = []
    matchPercentage: int = 0
    score: int = 0
    resumeStrength: str = "Weak"
    jobFitLevel: str = "Low Fit"
    categoryScores: Optional[Dict[str, int]] = None
    bonusFactors: Optional[Dict[str, Any]] = None

2. Backend โ€” Node.js Express

Route Architecture

app.use('/hr/auth',      hrAuthRoutes)       โ†’ JWT signup/login
app.use('/hr/jobs',      hrJobRoutes)        โ†’ Job CRUD
app.use('/hr/resumes',   hrResumeRoutes)     โ†’ Batch resume analysis
app.use('/hr/dashboard', hrDashboardRoutes)  โ†’ Mock dashboard data
app.use('/candidate',    candidateRoutes)    โ†’ Single resume analysis
app.use('/hr/debug',     hrDebugRoutes)      โ†’ ML health check

mlService.js โ€” ML Service Client

// Sends resumes to Python ML service
const ML_URL = process.env.ML_SERVICE_URL || 'http://localhost:8000';

async function analyze(files, jobData) {
    // 1. Build FormData with job_title, job_description, required_skills
    // 2. Append resume file streams
    // 3. POST to ML_URL/analyze-resumes
    // 4. Fallback: retry as JSON if multipart fails (422)
    // 5. Return array of candidate results
}

candidateController.js โ€” Candidate Endpoint

// POST /candidate/analyze
// Accepts: single resume file + job info
// Returns: { success, candidate, summary, jobTitle, requiredSkills }

// Summary generation:
// - "Matched X of Y required skills: ..."
// - "Missing skills: ..."
// - Experience assessment
// - Actionable feedback

hrResumeController.js โ€” HR Batch Upload

// POST /hr/resumes
// Accepts: up to 200 resume files (multer)
// Resolves job from: jobId in jobs.json OR form fields (jobTitle, requiredSkills)
// Calls: mlService.analyze(files, jobData)
// Applies: skill, location, college, experience, match% filters
// Returns: filtered & ranked candidate list

3. Frontend โ€” React + Vite

Routing (App.jsx)

Route Component Description
/ Landing Landing page with role selection
/candidate CandidateDashboard Job selection + resume upload
/candidate/score ResumeScore Score report with breakdowns
/candidate/skill-gap SkillGap Skill gap analysis
/candidate/roadmap Roadmap Learning roadmap + career images
/hr HRDashboard HR portal with filters & table
/auth/login Login HR login form
/auth/signup Signup HR signup form
/auth/role RoleSelect Role selection

Shared Components

Component File Purpose
CandidateCard CandidateCard.jsx Individual candidate card view
FilterPanel FilterPanel.jsx 15+ filter types with presets
ProgressBar ProgressBar.jsx Animated bar with color transitions
ResumeUpload ResumeUpload.jsx Drag & drop file uploader
RoadmapTimeline RoadmapTimeline.jsx Vertical timeline display
ScoreBadge ScoreBadge.jsx Gradient score badge
SkillBadge SkillBadge.jsx Skill chip / tag

State Management

Navigation-based state passing via React Router's useNavigate and useLocation:

// Dashboard โ†’ ResumeScore
nav('/candidate/score', {
    state: {
        job,               // Selected job role object
        candidateSkills,   // All extracted skills
        matchedSkills,     // Skills matching job requirements
        missingSkills,     // Required skills not found
        matchPercent,      // Job match percentage
        score,             // Overall resume score
        candidateData,     // Full candidate data object
        categoryScores,    // { skillMatch, experience, projects, keywords, education }
        bonusFactors,      // { projects, achievements, publications, ... }
        summary,           // AI-generated summary text
        resumeStrength,    // "Strong" | "Average" | "Weak"
        jobFitLevel        // "Excellent Fit" | "Good Fit" | "Partial Fit" | "Low Fit"
    }
})

๐Ÿงฎ Scoring Algorithm

Match Percentage Calculation

matchPercentage =
    (skillRatio ร— 50)           โ† % of required skills found in resume
  + (experienceScore ร— 20)      โ† years / 5, capped at 1.0
  + (projectsScore ร— 15)        โ† project keywords detected (0 or 1)
  + (tfidfSimilarity ร— 15)      โ† TF-IDF cosine similarity
  + (bertSimilarity ร— 5)        โ† BERT semantic similarity bonus

Overall Score Calculation

baseScore =
    (skillRatio ร— 25)           โ† skill match ratio
  + (skillBreadth ร— 20)         โ† total skills found / expected count
  + (experienceFactor ร— 15)     โ† years / 5, capped at 1.0
  + (bertSimilarity ร— 15)       โ† BERT semantic score
  + (tfidfSimilarity ร— 5)       โ† TF-IDF keyword score

qualityBonus (up to +20):
  + projects      โ†’ +4
  + achievements  โ†’ +3
  + publications  โ†’ +3
  + leadership    โ†’ +2
  + technicalDepth โ†’ +3
  + topEducation  โ†’ +3
  + portfolio     โ†’ +2

finalScore = min(baseScore + qualityBonus, 100)

Category Scores

Each category is scored 0-100 independently:

Category How It's Scored
Skill Match (matchedSkills / requiredSkills) ร— 100
Experience min(years / 5, 1.0) ร— 100
Projects Project/portfolio keywords detected โ†’ 0 or 80-100
Keywords tfidfSimilarity ร— 100
Education Degree relevance + institution quality

Quality Bonus Factors

Factor Detection Method Bonus Points
Projects Keywords: "project", "built", "developed", "created" +4
Achievements Keywords: "award", "achievement", "certification", "winner" +3
Publications Keywords: "published", "paper", "journal", "conference" +3
Leadership Keywords: "lead", "managed", "team leader", "coordinator" +2
Technical Depth Long skill list (>10 skills) + project mentions +3
Top Education IIT, NIT, IIIT, BITS, top-tier institutions +3
Internships Count of "intern"/"internship" mentions variable
Portfolio GitHub, LinkedIn, personal website links detected +2

Labels & Ratings

Score Range Resume Strength Job Fit Level
70-100 Strong Excellent Fit
45-69 Average Good Fit (50+) / Partial Fit (45-49)
0-44 Weak Low Fit

๐ŸŒ API Reference

ML Service Endpoints (Port 8000)

POST /analyze-resumes

Analyze one or more resumes against a job description.

Content-Type: multipart/form-data

Field Type Required Description
resumes File(s) Yes PDF or DOCX resume files
job_title string No Target job title
job_description string No Full job description text
required_skills JSON string No Array of required skill names
name_method string No "filename" or "text" โ€” how to extract candidate name

Response: List[AnalyzeResponse]

[
  {
    "candidateId": "cand_001",
    "name": "John Doe",
    "email": "john@example.com",
    "phone": "+91-9876543210",
    "skills": ["Python", "React", "Node.js", "Docker"],
    "matchedSkills": ["Python", "React"],
    "missingSkills": ["AWS", "Kubernetes"],
    "experience": 3,
    "internships": 1,
    "college": "IIT Delhi",
    "branch": "CSE",
    "degree": "B.Tech",
    "location": "Hyderabad",
    "portfolioLinks": ["https://github.com/johndoe"],
    "matchPercentage": 72,
    "score": 68,
    "resumeStrength": "Average",
    "jobFitLevel": "Good Fit",
    "categoryScores": {
      "skillMatch": 75,
      "experience": 60,
      "projects": 80,
      "keywords": 55,
      "education": 90
    },
    "bonusFactors": {
      "projects": true,
      "achievements": false,
      "publications": false,
      "leadership": true,
      "technicalDepth": true,
      "topEducation": true,
      "internships": 1,
      "portfolio": true
    }
  }
]

GET /docs

FastAPI auto-generated Swagger UI for interactive API testing.


Backend Endpoints (Port 5000)

Authentication

Method Endpoint Body Response
POST /hr/auth/signup { companyName, email, password } { token }
POST /hr/auth/login { email, password } { token }

Jobs

Method Endpoint Body / Params Response
POST /hr/jobs { name, requiredSkills[], experienceRange, location } Created job
GET /hr/jobs โ€” Array of jobs (auto-fills to 50)
GET /hr/jobs/:id โ€” Single job object

Resume Analysis

Method Endpoint Body Response
POST /hr/resumes FormData: resumes[] (up to 200), jobId, jobTitle, requiredSkills, jobDescription, jobLocation, filters { candidates[] }
POST /candidate/analyze FormData: resumes (1 file), jobId, jobTitle, requiredSkills, nameMethod, jobDescription { success, candidate, summary, jobTitle, requiredSkills }

Dashboard & Debug

Method Endpoint Response
GET /hr/dashboard/:jobId Mock candidates for job with filters
GET /hr/debug/check-ml { status, mlServiceUrl }

๐Ÿ” Resume Parsing Pipeline

Input: PDF/DOCX file bytes
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 1. FORMAT DETECTION          โ”‚
โ”‚    .pdf โ†’ pdfplumber         โ”‚
โ”‚    .docx โ†’ python-docx       โ”‚
โ”‚    .doc โ†’ UTF-8 fallback     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 2. TEXT EXTRACTION           โ”‚
โ”‚    PDF: layout-aware with    โ”‚
โ”‚         table extraction     โ”‚
โ”‚    DOCX: headers +           โ”‚
โ”‚          paragraphs +        โ”‚
โ”‚          tables              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 3. TEXT CLEANING             โ”‚
โ”‚    - Normalize line endings  โ”‚
โ”‚    - Preserve column gaps    โ”‚
โ”‚    - Collapse excess padding โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 4. ENTITY EXTRACTION         โ”‚
โ”‚    - Name (spaCy NER)        โ”‚
โ”‚    - Email (regex)           โ”‚
โ”‚    - Phone (regex: IN/US)    โ”‚
โ”‚    - Portfolio links (regex) โ”‚
โ”‚    - Experience (section-    โ”‚
โ”‚      aware parsing)          โ”‚
โ”‚    - College (two-pass)      โ”‚
โ”‚    - Degree (pattern match)  โ”‚
โ”‚    - Branch (abbreviation)   โ”‚
โ”‚    - Location (whitelist)    โ”‚
โ”‚    - Internships (count)     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 5. SKILL EXTRACTION          โ”‚
โ”‚    - Canonical variations    โ”‚
โ”‚    - skills.json database    โ”‚
โ”‚    - Word boundary matching  โ”‚
โ”‚    - Deduplication           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 6. SCORING                   โ”‚
โ”‚    - Skill match ratio       โ”‚
โ”‚    - BERT similarity         โ”‚
โ”‚    - TF-IDF similarity       โ”‚
โ”‚    - Quality bonus           โ”‚
โ”‚    - Category scores         โ”‚
โ”‚    - Labels & ratings        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
Output: AnalyzeResponse JSON

๐Ÿ”ง Skill Extraction Engine

The skill extraction pipeline uses a 3-step approach:

Step 1: Canonical Variation Matching

80+ skill families with variation aliases:

JavaScript  โ†’  js, es6, es2015, ecmascript
TypeScript  โ†’  ts
React       โ†’  reactjs, react.js
Node.js     โ†’  nodejs, node
Python      โ†’  py, python3
MongoDB     โ†’  mongo
PostgreSQL  โ†’  postgres, pg
Kubernetes  โ†’  k8s
Amazon Web Services  โ†’  aws
Google Cloud Platform  โ†’  gcp
Machine Learning  โ†’  ml
Deep Learning  โ†’  dl
Natural Language Processing  โ†’  nlp
Continuous Integration  โ†’  ci/cd, cicd
... 80+ more families

Step 2: Database Matching

180+ skills from ml-service/data/skills.json:

[
  "Python", "Java", "C++", "C#", "Go", "Rust", "JavaScript",
  "TypeScript", "React", "Angular", "Vue.js", "Node.js",
  "Express", "Django", "Flask", "FastAPI", "Spring Boot",
  "Docker", "Kubernetes", "AWS", "Azure", "GCP",
  "TensorFlow", "PyTorch", "scikit-learn", "Pandas",
  "MongoDB", "PostgreSQL", "Redis", "GraphQL",
  "Git", "Linux", "Terraform", "Ansible",
  "... 180+ total"
]

Step 3: Deduplication & Canonical Display

Extracted skills are mapped to their canonical display names and deduplicated:

Input text: "... reactjs, React.js, REACT ..."
Output: ["React"]  (single canonical entry)

๐Ÿ—บ๏ธ Roadmap Image Integration

The Roadmap page includes 80+ career roadmap images from public/roadmaps/.

How It Works

  1. Mapping: ROADMAP_MAP maps 65+ job title variations to image slugs
  2. Resolution: resolveRoadmapSlug() uses 3-tier matching:
    • Direct lookup (exact match)
    • Partial/substring match
    • Slugified fallback
  3. Validation: RoadmapImage component pre-validates images with new Image() โ€” only renders if the file exists
  4. Display: Full-width image with rounded corners, shadow, and fade-in animation

Supported Roadmap Images

Category Available Roadmaps
Languages Python, JavaScript, TypeScript, Java, C++, Go, Rust, Kotlin, Swift, PHP, Ruby
Frontend React, Angular, Vue, Next.js, Flutter, React Native, CSS, HTML
Backend Node.js, Express, Django, Flask, Spring Boot, Laravel, ASP.NET Core
Data / AI Data Analyst, Data Engineer, Data Scientist, Machine Learning, MLOps, Prompt Engineering, AI Engineer
DevOps / Cloud DevOps, Docker, Kubernetes, AWS, Terraform, Linux
Databases MongoDB, PostgreSQL, Redis, SQL
Other System Design, Software Architect, Cyber Security, Blockchain, Game Developer, QA, UX Design, Product Manager, Technical Writer

Adding New Roadmaps

  1. Add your PNG image to public/roadmaps/ (e.g., your-role.png)
  2. Add a mapping entry in Roadmap.jsx:
// In ROADMAP_MAP object:
'your role name': 'your-role',  // matches your-role.png

๐Ÿ“Š Data Files Reference

src/data/job_roles.json

Contains all predefined job roles with skills and roadmap steps:

{
  "id": "role_001",
  "name": "Frontend Developer",
  "requiredSkills": [
    "HTML", "CSS", "JavaScript", "React",
    "TypeScript", "Git", "Responsive Design"
  ],
  "roadmapSteps": [
    "Learn HTML5 fundamentals",
    "Master CSS3 and Flexbox/Grid",
    "JavaScript ES6+ deep dive",
    "Learn React.js framework",
    "Build portfolio projects",
    "Practice coding interviews",
    "Apply for frontend roles"
  ]
}

ml-service/data/skills.json

Flat array of 180+ recognized skill names used by the skill extractor.

backend/data/jobs.json

Stores HR-created job listings (runtime-generated).

backend/data/hr_users.json

Stores registered HR user accounts (email, hashed password, company name).

backend/data/dummyColleges.json & dummyLocations.json

Used by mockMlService.js to generate realistic synthetic candidate data for the HR dashboard demo.


๐Ÿ–ฅ๏ธ Frontend Pages & Components

Landing Page (src/pages/landing.jsx)

  • Gradient hero section with geometric circles
  • "AI-Powered Platform" status badge
  • 3 feature cards: Smart Analysis, Skill Gap, Learning Roadmap
  • CTA buttons: Candidate login, HR login
  • Signup link

Candidate Dashboard (src/pages/candidate/Dashboard.jsx)

  • Two-tab layout: "Resume Score" / "Skill Gap & Roadmap"
  • Radio toggle: "Select Job Role" / "Paste Job Description"
  • Dropdown with all roles from job_roles.json
  • Custom JD auto-detects 50+ skill keywords
  • File upload area (PDF/DOCX)
  • Analyze button with loading spinner

Resume Score (src/pages/candidate/ResumeScore.jsx)

  • SVG circle score rings (animated) for score and match %
  • 4 metric cards: Score, Match%, Strength, Fit
  • AI-generated summary
  • 5 category breakdown bars (colored backgrounds)
  • Bonus factor badges (star icons)
  • Matched skills (green) / Missing skills (red) side by side
  • All extracted skills with check marks
  • Extracted profile cards (experience, college, degree, location)
  • Navigation to Skill Gap / Roadmap

Skill Gap (src/pages/candidate/SkillGap.jsx)

  • Ring chart for coverage percentage
  • 4 metric cards: Gap%, Matched, Missing, Required
  • Coverage progress bar
  • Category strength/weakness analysis with inline bars
  • Priority-ranked missing skills with badges (Critical/Important/Nice-to-Have)
  • Matched skills / Extra skills sections

Roadmap (src/pages/candidate/Roadmap.jsx)

  • Gradient header with progress stats
  • Progress bar (completed/total steps)
  • Phase cards with colored headers, SVG icons, vertical timeline
  • Phase items with done/pending dots and badges
  • Full career roadmap image section (80+ images)
  • Navigation actions

HR Dashboard (src/pages/hr/Dashboard.jsx)

  • Job role selector
  • Batch resume upload (up to 200 files)
  • Advanced filter panel (15+ filter types, quick presets)
  • Candidate table with expandable skills cells
  • Sort by score, match%, name
  • Score badges with color gradients

โš™๏ธ Environment Variables

All services work with defaults. Customize with environment variables:

Backend (backend/)

Variable Default Description
PORT 5000 Backend server port
ML_SERVICE_URL http://localhost:8000 Python ML service URL
JWT_SECRET demo-secret JWT signing secret

ML Service (ml-service/)

Variable Default Description
PORT 8000 ML service port

Frontend (src/)

Variable Default Description
VITE_API_URL http://localhost:5000 Backend API URL (in api.js)

๐Ÿ”ง Troubleshooting

Common Issues

Issue Cause Solution
ECONNREFUSED on port 8000 ML service not running Start ML service: python -m uvicorn app.main:app --port 8000
ECONNREFUSED on port 5000 Backend not running Start backend: cd backend && node server.js
Port already in use Previous process still running Kill it: npx kill-port 5000 or npx kill-port 8000
python-multipart error Missing Python dependency pip install python-multipart
spaCy model not found Model not downloaded python -m spacy download en_core_web_sm
matchedSkills always 0 Pydantic schema missing fields Ensure schemas.py has matchedSkills, categoryScores, bonusFactors
Job role IDs don't match Frontend uses role_001, backend uses job_1001 Backend reads jobTitle + requiredSkills from form fields as fallback
First ML request is slow Model loading on first call Normal โ€” all-MiniLM-L6-v2 loads ~3-5 sec on first request
CORS errors Backend CORS not configured Backend already uses cors() middleware โ€” check if backend is running
Resume upload fails File too large or wrong format Check: PDF/DOCX only, < 10 MB per file

Windows-Specific

# Kill process on specific port (Windows PowerShell)
$proc = Get-NetTCPConnection -LocalPort 5000 -ErrorAction SilentlyContinue |
        Select-Object -First 1
if ($proc) { Stop-Process -Id $proc.OwningProcess -Force }

# Activate Python venv (PowerShell)
.\.venv\Scripts\Activate.ps1

# If PowerShell execution policy blocks venv activation:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

macOS/Linux

# Kill process on specific port
lsof -ti:5000 | xargs kill -9
lsof -ti:8000 | xargs kill -9

# Activate Python venv
source .venv/bin/activate

๐Ÿค Contributing

We welcome contributions! Whether it's bug fixes, new features, documentation improvements, or roadmap images โ€” all contributions are valued.

Contribution Guidelines

  1. Fork the repository
  2. Create a feature branch from main
  3. Make your changes
  4. Test your changes locally (all 3 services)
  5. Commit with clear, descriptive messages
  6. Push to your fork
  7. Open a Pull Request

Development Workflow

# 1. Fork and clone
git clone https://github.com/YOUR-USERNAME/resume-screening-project.git
cd resume-screening-project

# 2. Create a feature branch
git checkout -b feature/your-feature-name

# 3. Set up all 3 services (see Quick Start above)

# 4. Make your changes

# 5. Test locally
#    - Upload a resume and verify scoring works
#    - Check skill extraction accuracy
#    - Test HR batch upload
#    - Verify filters work correctly

# 6. Commit and push
git add .
git commit -m "feat: your feature description"
git push origin feature/your-feature-name

# 7. Open a PR on GitHub

Code Style

Language Style Guide
JavaScript/JSX ES6+, functional components, React Hooks
Python PEP 8, type hints recommended
CSS Tailwind CSS utility classes, avoid custom CSS where possible
Commits Conventional Commits preferred

What Can I Contribute?

Area Examples
New Roadmap Images Add .png images to public/roadmaps/ + mapping in Roadmap.jsx
More Job Roles Add entries to src/data/job_roles.json with skills + roadmap steps
More Skills Add skills to ml-service/data/skills.json + variations in skill_extractor.py
Better Extraction Improve name/college/experience parsing in routes.py
UI Improvements Enhance any page component styling
Tests Add unit/integration tests (currently none)
Documentation Improve README, add CONTRIBUTING.md, add JSDoc/docstrings
Docker Add Dockerfile / docker-compose for easy deployment
Database Replace JSON file storage with MongoDB/PostgreSQL
Auth Add candidate authentication, OAuth providers
Deployment Add Vercel/Railway/Render deployment configs

Pull Request Template

When opening a PR, please include:

## What does this PR do?
Brief description of changes.

## Type of change
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Refactoring
- [ ] New roadmap image(s)
- [ ] New job role(s)
- [ ] Other

## Checklist
- [ ] I've tested my changes locally
- [ ] All 3 services start without errors
- [ ] Resume upload and scoring still works
- [ ] No existing functionality is broken
- [ ] I've updated the README if needed

## Screenshots (if UI changes)
Before: ...
After: ...

๐Ÿ‘ฅ Contributors

abhiram
M.Abhiram

๐Ÿ’ป Project Lead & Full-Stack Development

How to Add Yourself as a Contributor

After your PR is merged, add yourself to the table above following this format:

<td align="center">
  <a href="https://github.com/YOUR-GITHUB-USERNAME">
    <img src="https://github.com/YOUR-GITHUB-USERNAME.png" width="80px;" alt="Your Name"/>
    <br /><sub><b>Your Name</b></sub>
  </a>
  <br />
  <sub>EMOJI Your Contribution Type</sub>
</td>

Contribution Type Emojis:

Emoji Type
๐Ÿ’ป Code
๐Ÿ“– Documentation
๐ŸŽจ Design / UI
๐Ÿ› Bug Fix
๐Ÿ”ง DevOps / Infra
๐Ÿค– ML / AI
๐Ÿ—บ๏ธ Roadmap Images
โœ… Testing

๐Ÿ”ฎ Future Enhancements

Priority Enhancement Description
๐Ÿ”ด High Database Integration Replace JSON files with MongoDB or PostgreSQL for production use
๐Ÿ”ด High Candidate Authentication Add login/signup for candidates with profile persistence
๐Ÿ”ด High Docker Compose One-command deployment with docker-compose up
๐ŸŸก Medium Resume Storage Cloud storage (S3/GCS) for uploaded resumes
๐ŸŸก Medium Job Description Parser Auto-extract required skills from any pasted JD using NLP
๐ŸŸก Medium Email Notifications Send score reports to candidates via email
๐ŸŸก Medium Export Reports Download score reports as PDF
๐ŸŸก Medium Batch Processing UI Progress bar for HR batch uploads showing per-resume status
๐ŸŸข Low Dark Mode System-preference dark mode with Tailwind dark: classes
๐ŸŸข Low Internationalization Multi-language support (Hindi, Telugu, etc.)
๐ŸŸข Low Resume Templates Downloadable ATS-friendly resume templates
๐ŸŸข Low Interview Prep AI-generated interview questions based on skill gaps
๐ŸŸข Low Analytics Dashboard HR analytics: hiring funnel, skill trends, source tracking
๐ŸŸข Low Mobile App React Native mobile app for candidates
๐ŸŸข Low Video Resume Support video resume uploads with audio transcription
๐ŸŸข Low ATS Integration API integration with popular ATS systems (Lever, Greenhouse)

๐Ÿ“‘ Complete API Endpoint Summary

# Method Endpoint Service Description
1 POST /analyze-resumes ML (8000) Analyze resumes with full NLP pipeline
2 GET /docs ML (8000) Swagger interactive API docs
3 GET / Backend (5000) Health check
4 POST /hr/auth/signup Backend (5000) HR registration
5 POST /hr/auth/login Backend (5000) HR authentication
6 POST /hr/jobs Backend (5000) Create job listing
7 GET /hr/jobs Backend (5000) List all jobs
8 GET /hr/jobs/:id Backend (5000) Get specific job
9 POST /hr/resumes Backend (5000) Batch resume analysis (up to 200)
10 GET /hr/dashboard/:jobId Backend (5000) Mock dashboard data
11 POST /candidate/analyze Backend (5000) Single resume analysis
12 GET /hr/debug/check-ml Backend (5000) ML service connectivity check

๐Ÿ“œ License

This project is licensed under the MIT License โ€” see the LICENSE file for details.

MIT License

Copyright (c) 2025 Resume Screening & Career Guidance System

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

๐Ÿ™ Acknowledgments

Resource Usage
spaCy NLP library for named entity recognition
sentence-transformers BERT embeddings for semantic similarity
scikit-learn TF-IDF vectorizer and cosine similarity
FastAPI High-performance Python web framework
React Frontend UI library
Tailwind CSS Utility-first CSS framework
Vite Frontend build tool
pdfplumber PDF text extraction
roadmap.sh Career roadmap images and inspiration

Built with โค๏ธ for smarter hiring and career growth

โญ Star this repository if you found it useful!

Report Bug โ€ข Request Feature โ€ข Contribute

About

Full-stack Resume Screening System with React, Node.js, and FastAPI that performs resume parsing, semantic matching, scoring, and career roadmap generation.

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors