Streamlit-based project that parses resumes, compares them with a Job Description (JD), computes ATS scores, filters candidates, and explains selection/rejection with actionable insights.
- Resume upload (
.pdf,.docx) with automatic text extraction - JD input (paste text or upload file)
- Stronger skill extraction and skill-gap detection
- Context-aware matching with TF-IDF cosine similarity
- ATS score with configurable weighted components
- Recruiter filtering (
min ATS,min experience,required skills) - Candidate ranking with decision explainability
- Resume quality analysis and improvement feedback
- Auto-generated interview questions
- Parsing warning when low text is extracted (common in scanned/image PDFs)
- Role-based authentication with login/register/logout (
adminandcustomer) - Advanced candidate search and view filters (status, shortlist-only, min probability)
- Analytics tab (status pie, ATS distribution, top skills)
- Comparison tab with side-by-side table and radar chart
- Saved Jobs manager (save/load/delete JD templates per user)
- Role Compare tab (score same candidate pool across multiple saved jobs)
- Admin panel for user management and global saved-job control
- Export both full results and filtered view CSV

resume_checker_ai/
|-- app.py
|-- requirements.txt
|-- README.md
|-- backend/
| |-- __init__.py
| |-- auth.py
| |-- job_store.py
| |-- parser.py
| |-- jd_processor.py
| |-- skill_extractor.py
| |-- similarity_engine.py
| |-- quality_analyzer.py
| |-- scoring_engine.py
| |-- filter_engine.py
| |-- decision_explainer.py
| `-- interview_generator.py
|-- utils/
| |-- __init__.py
| |-- constants.py
| |-- helpers.py
| `-- text_cleaner.py
|-- models/
|-- data/
`-- tests/
Streamlit UI
|
v
Auth Layer (Login/Register)
|
v
Controller (app.py)
|
+--> Resume Parser
+--> JD Processor
+--> Skill Extractor + Similarity Engine
+--> Scoring Engine
+--> Filtering Engine
+--> Decision Explainer + Interview Generator
|
v
Ranked Results + Insights Dashboard
Default weights:
- Skill Match: 30%
- Semantic Similarity: 25%
- Experience Match: 15%
- Education Match: 10%
- Resume Quality: 20%
Final ATS = weighted sum of all component scores
- Create and activate a virtual environment (recommended).
- Install dependencies:
pip install -r requirements.txt- Run the app:
streamlit run app.py- Provide job description in sidebar (paste/upload).
- Optionally save the JD in Saved Jobs for reuse.
- Upload multiple resumes.
- Adjust filters and score weights.
- Click Run Screening.
- Review
Candidates,Analytics, andComparetabs. - Use
Role Comparetab to compare candidate fit across saved job roles.
Customeraccount:- Full resume screening workflow
- Saved Jobs (own account)
- Candidate analytics, comparison, role comparison
Adminaccount:- Admin control center
- View all users
- View all saved jobs across users
- Delete any saved job
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/<YOUR_USERNAME>/<YOUR_REPO>.git
git push -u origin main- Open https://share.streamlit.io
- Login with GitHub and click New app
- Select:
- Repository:
<YOUR_USERNAME>/<YOUR_REPO> - Branch:
main - Main file path:
app.py
- Repository:
- Click Deploy
If build fails, check app logs and ensure requirements.txt installs correctly.
- Parsing quality depends on resume formatting quality.
- Scanned/image PDFs often have very low extractable text without OCR.
- Current semantic engine uses TF-IDF for lightweight local execution.
- You can replace similarity layer with sentence-transformer embeddings later without changing UI flow.