Skip to content

Repository files navigation

Resume Miner

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

Product Surface

  • Screening Workspace: compare a resume with a job description and inspect match evidence
  • ATS Resume Studio: generate a polished ATS-friendly resume from your resume, GitHub, LinkedIn, and target job description
  • CLI Toolkit: train models, benchmark datasets, screen documents, and run the app locally

Highlights

  • Reads .txt, .md, and .pdf resumes 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

Quick Start

1. Install

python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install -e .

2. Run the app

On Windows:

.\run_local_app.ps1

Or:

run_local_app.bat

Manual startup:

python -m resume_miner.cli serve --host 127.0.0.1 --port 8000

Then open:

  • http://127.0.0.1:8000/
  • http://127.0.0.1:8000/ats-studio

CLI Commands

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]

Data Included

The repository supports both provided dataset layouts:

  • data/Resume/Resume.csv
  • data/data/ or data/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

Deployment

This repo is ready to connect to GitHub and deploy from there.

Included deployment files:

  • render.yaml for Render
  • Procfile and runtime.txt for platform-style Python hosting
  • Dockerfile for container deployment
  • wsgi.py for Gunicorn
  • .github/workflows/ci.yml for 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.

Render Example

  1. Push this repo to GitHub.
  2. In Render, create a new Web Service from the GitHub repo.
  3. Let Render use the included render.yaml.
  4. 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.

Testing

python -m unittest discover -s tests

Project Layout

src/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/

Notes

  • 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.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages