Skip to main content

Simple ATS Resume/C.V validation tool

Project description

ResumeForgeLint

version build coverage python license

Simple ATS (application tracking system) Resume/C.V validation tool

Documentation: resume-forge-lint.web.app

Companion tool: ResumeForge — generate ATS-friendly resumes

Installation

git clone git@github.com:JohnStrong/ResumeForgeLint.git
cd ResumeForgeLint
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

Requires Python 3.10+.

Table of Contents

Features (v1)

  • Validate a resume provided as a .txt file
  • Fuzzy section heading detection using synonym sets (e.g., Experience/Work History/Employment; Education/Academics; Skills/Technical Skills)
  • Per-section rubric scoring + issue reporting
    • Shows which sections/signals were detected
    • Lists issues with severity (critical/warning/info) and short "why" explanations
  • Human-readable output
    • Default mode prints a summary of ATS risk + top issues per section
  • Required-section expectations (baseline)
    • Core sections expected (scored even if missing):
      • Work Experience
      • Skills
      • Education
    • Unrecognized sections (e.g. Projects, Volunteer Work, Certifications) are ignored and do not contribute to the score

Note: Profile/Summary and References are not scored in v1. Most ATS systems do not parse these sections for structured data, and modern best practice is to omit References entirely. They do not contribute to the score positively or negatively.

Scoring Rubrics (Work in progress)

[x] denotes rubric is implemented

Header (20 points)

  • Full name present on first line
  • Email address present
  • Phone number present
  • Phone number country code present (e.g. +1, +44)
  • LinkedIn URL present (optional, bonus)

Work Experience (20 points)

  • Section present
  • Quantified achievements (numbers, percentages, metrics)
  • Action verbs at start of bullet points
  • Date ranges present for each role
  • Company and role title present

Skills (20 points)

  • Section present
  • Contains keywords (technical terms, tools, languages)
  • Minimum keyword count threshold
  • No excessive soft-skill filler

Education (20 points)

  • Section present
  • Degree type present (BSc, MSc, PhD, etc.)
  • Institution name present
  • Graduation date present

Commands

validate

Analyse a .txt resume, score each section, and print a summary report.

resumeforgelint validate --input resume.txt

What it does:

  1. Reads the plain-text resume
  2. Detects sections via fuzzy heading matching (synonym sets)
  3. Scores each section and flags issues (critical / warning / info)
  4. Prints a summary to stdout:
    • Overall rating (🟢 Good / 🟡 Needs Work / 🔴 Poor)
    • Per-section breakdown with score and top issue

Example output:

Overall: 🟢 Good (80/80)

  Header             🟢  20/20
  Experience         🟢  20/20
  Education          🟢  20/20
  Skills             🟢  20/20

Examples

Good resume (examples/good_header.txt)

All required sections present with complete information. Scores 80/80 (100%).

$ resumeforgelint validate --input examples/good_header.txt
Overall: 🟢 Good (80/80)

  Header             🟢  20/20
  Experience         🟢  20/20
  Education          🟢  20/20
  Skills             🟢  20/20

Needs Work (examples/needs_work.txt)

Has all sections but Education is missing degree type and institution. Experience lacks action verbs. Scores 62/80 (77%).

$ resumeforgelint validate --input examples/needs_work.txt
Overall: 🟡 Needs Work (62/80)

  Header             🟢  20/20
  Experience         🟢  17/20  ⚠ Bullet points should start with strong action verbs (e.g. built, delivered, improved)
  Education          🔴   5/20  ✖ Education should include a degree type (e.g. BSc, MSc, PhD)
  Skills             🟢  20/20

Poor resume (examples/bad_all.txt)

Missing name in header, no company/role or dates in experience, no technical keywords in skills, and no education section content. Scores 8/80 (10%).

$ resumeforgelint validate --input examples/bad_all.txt
Overall: 🔴 Poor (8/80)

  Header             🔴   0/20  ✖ A Resume should contain the applicants full name at the start (top) of the document
  Experience         🔴   0/20  ✖ Each role should include company name and role title
  Skills             🔴   8/20  ✖ Skills section should contain technical keywords (tools, languages, frameworks)
  Education          🔴   0/20  ✖ Education section should not be empty

Testing

Run the full test suite:

pytest

Fidelity Tests

Fidelity tests compare our rubric scoring against independent spaCy NER extraction. They assert that when spaCy can extract structured data (name, email, org, dates, degree), our tool scores that section as passing — and when spaCy cannot extract it, our tool flags it as an issue.

pytest fidelity_tests/

Requires spaCy:

pip install spacy
python -m spacy download en_core_web_sm

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

resumeforgelint-0.1.1.tar.gz (14.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

resumeforgelint-0.1.1-py3-none-any.whl (15.0 kB view details)

Uploaded Python 3

File details

Details for the file resumeforgelint-0.1.1.tar.gz.

File metadata

  • Download URL: resumeforgelint-0.1.1.tar.gz
  • Upload date:
  • Size: 14.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for resumeforgelint-0.1.1.tar.gz
Algorithm Hash digest
SHA256 236ba1116ec1d2cadaf9aa24520e6dddfb8e290246b4ec6856d68417f2c5b233
MD5 93f9d03958fc3563fb1621ab3182924a
BLAKE2b-256 8d956e87f05ca53b95f099c116338e8ac6dcc8bb8272ce93ae89ad04d5a95236

See more details on using hashes here.

File details

Details for the file resumeforgelint-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for resumeforgelint-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 91d33fef3e40c061d79233371d299300ab2645a24273435f21226f6c12d6f18d
MD5 29e847290e112394a04b25c124cba715
BLAKE2b-256 5de1a9abcc8598cf467cc85f2ecb3dcda594b3a38a6b4e89052e4f49c92bcca4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page