Resume Miner is a Flask-based resume intelligence app for screening resumes, extracting skill signals, and generating ATS-ready tailored resumes with PDF and LaTeX export.
It combines:
- explicit skill matching for transparent screening
- source-aware ranking from resume text, LinkedIn profile text, and GitHub repositories
- ATS resume generation with browser preview, PDF download, and LaTeX output
- classical ML baselines for resume-category alignment and benchmarking
Screening Workspace: compare a resume with a job description and inspect match evidenceATS Resume Studio: generate a polished ATS-friendly resume from your resume, GitHub, LinkedIn, and target job descriptionCLI Toolkit: train models, benchmark datasets, screen documents, and run the app locally
- Reads
.txt,.md, and.pdfresumes or job descriptions - Extracts hard and soft skills with explainable evidence
- Scores alignment using rule-based overlap plus optional TF-IDF + linear SVM classification
- Pulls public GitHub project signals and best-effort LinkedIn signals into the ranking flow
- Builds reference-style ATS resumes with preview, downloadable PDF, and downloadable LaTeX
- Supports benchmark runs on both CSV resume datasets and categorized document corpora
- Ships with deployment files for GitHub-connected hosting on Python platforms
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install -e .On Windows:
.\run_local_app.ps1Or:
run_local_app.batManual startup:
python -m resume_miner.cli serve --host 127.0.0.1 --port 8000Then open:
http://127.0.0.1:8000/http://127.0.0.1:8000/ats-studio
python -m resume_miner.cli screen <resume> <job_description> [--model path] [--json]
python -m resume_miner.cli train <dataset.csv> [--text-column text] [--label-column category] [--model-out path]
python -m resume_miner.cli evaluate <dataset.csv> [--text-column text] [--label-column category] [--json]
python -m resume_miner.cli benchmark <dataset.csv> [--text-column text] [--label-column category] [--json] [--output path]
python -m resume_miner.cli serve [--model path] [--host 127.0.0.1] [--port 8000]The repository supports both provided dataset layouts:
data/Resume/Resume.csvdata/data/ordata/data/data/for the categorized PDF corpus
The loader auto-detects common text and label column names such as:
- text:
resume_text,resume,text,Resume_str,cleaned_resume - label:
category,label,Category,job_category
This repo is ready to connect to GitHub and deploy from there.
Included deployment files:
render.yamlfor RenderProcfileandruntime.txtfor platform-style Python hostingDockerfilefor container deploymentwsgi.pyfor Gunicorn.github/workflows/ci.ymlfor automated test runs on push and pull requests
Important note:
- GitHub Pages cannot run a Flask backend because it only serves static files.
- To host the live app from your GitHub repo, connect the repo to Render, Railway, Fly.io, or another Python host.
- Push this repo to GitHub.
- In Render, create a new Web Service from the GitHub repo.
- Let Render use the included
render.yaml. - Deploy.
The app will boot with gunicorn wsgi:app. If you later want a default trained model on the server, set MODEL_PATH to a valid model file path or add a training step in your hosting build pipeline.
python -m unittest discover -s testssrc/resume_miner/
agents/
app.py
ats_pipeline.py
classifier.py
cli.py
datasets.py
experiments.py
io.py
models.py
pipeline.py
taxonomy.py
data/
docs/
notebooks/
tests/
artifacts/is intentionally ignored so large trained models do not break GitHub pushes.- The app runs without a trained classifier; model-backed alignment becomes available when you provide a model path.
- LinkedIn scraping is best-effort. Pasted LinkedIn profile text is more reliable than the public URL alone.