Skip to content

expphoto/resumetool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

27 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿš€ ResumeTool - AI-Powered Job Matching & Resume Optimization

Python 3.11+ MIT License GPT-5-nano

Transform your job search with AI-powered resume analysis, intelligent job matching, and automated opportunity discovery.

ResumeTool is a comprehensive job search assistant that combines advanced resume parsing, AI-powered analysis, and multi-source job discovery to help professionals find their ideal career opportunities faster and more effectively.

โœจ Key Features

๐Ÿง  Intelligent Resume Analysis

  • 6x Better Skill Detection with AI enhancement
  • Professional Title Generation from experience
  • Comprehensive Skill Categorization with expertise levels
  • Multi-Format Support (PDF, DOCX, TXT)

๐ŸŽฏ Smart Job Matching

  • AI-Powered Compatibility Scoring (up to 85% accuracy)
  • Multi-Source Job Discovery (Indeed, ZipRecruiter + more)
  • Automated Skill Gap Analysis with improvement recommendations
  • Remote-First Job Options with location flexibility

โšก Lightning-Fast Workflow

  • One-Command Analysis: ./run.sh analyze resume.pdf
  • Interactive Wizard Mode for guided job search
  • Rich CLI Interface with beautiful tables and progress bars
  • Cost-Effective AI using GPT-5-nano

๐Ÿข Hiring Triage System (employer-side)

The real problem in modern hiring isn't finding applicants โ€” it's what happens after. An ATS surfaces 180 "qualified" candidates from 500 submissions. A hiring team of 3 cannot meaningfully evaluate 180 people. So most of those candidates get ghosted, not because they failed, but because there was no intelligent routing layer after the initial filter.

This system is that routing layer. It picks up where the ATS leaves off and applies a multi-stage evaluation that goes far beyond keyword matching โ€” looking at how a candidate thinks, how much effort they actually put in, and who they are beyond their resume.

The Problem This Solves

500 applicants submitted
    โ†“  ATS / initial AI filter
180 "qualified" matches  โ†โ”€โ”€ this is where hiring teams get stuck
    โ†“  THIS TOOL
~15โ€“20 candidates worth a real human conversation

Pipeline Overview

Stage What it does Status
1. Rubric scoring Scores resumes against weighted, named criteria โ€” not keyword matching. HR defines dimensions like "years of relevant experience" with good/bad examples. โœ… Built
2. AI-conducted interview Candidates receive a text-based async interview. Questions are psychologically layered โ€” similar themes asked in different ways across the session to check for consistency and depth, not just surface answers. โœ… Built (text), voice planned
3. Effort & intent scoring Did this person just blast their resume and disappear? Or did they follow up, research the company, customize their cover letter? Two candidates with identical resumes should not score the same if one went the extra mile. โœ… Built
4. Public footprint analysis Looks at who the candidate is beyond the resume โ€” LinkedIn activity, GitHub contributions, published work, public professional presence. Signals genuine expertise and engagement vs. a polished document with little behind it. ๐Ÿšง Planned
5. OSINT pre-screen Using only publicly available information, runs a background pre-check: news mentions, court records, professional history verification. Flags items for HR review rather than auto-rejecting โ€” the human makes the final call. ๐Ÿšง Planned
6. Auto-routing Every candidate gets a tier (A/B/C/D) and a response. Tier A gets a fast-track interview invite. Tier D gets a warm, human decline. No one gets silence. โœ… Built
7. Feedback loop Hiring manager decisions feed back into the model. After 10+ decisions, the system learns what "good" actually means for this specific company and calibrates accordingly. โœ… Built

What "Effort Scoring" Actually Means

Two candidates submit identical resumes for the same role. Candidate A applied via LinkedIn in 30 seconds. Candidate B applied directly, wrote a cover letter that referenced a specific product feature, emailed a follow-up two days later, and mentioned something from the company blog.

Most ATS systems treat these as equal. This system does not.

Signals tracked:

  • Application quality โ€” cover letter analyzed for genuine customization vs. generic template (AI-scored)
  • Time-to-apply โ€” early applicants signal higher intent; normalized against posting date
  • Source channel โ€” referral > direct apply > job board blast
  • Follow-up behavior โ€” proactive contact after applying is logged and weighted
  • Research indicators โ€” references to specific company details, products, team members, or recent news in written responses

What "AI Interview" Actually Means

This is not a quiz. The async text interview uses psychological interview design:

  • Questions are generated from rubric gaps โ€” if a candidate scored low on "system design," they get probed there specifically
  • Similar themes are asked in different framings across the session to test consistency (a common technique in structured interviewing to detect coached or fabricated answers)
  • Behavioral ("tell me about a time..."), situational ("how would you handle..."), and verification ("walk me through how you built...") question types are mixed
  • Answers are scored on specificity, depth, and internal consistency โ€” not just keyword presence

Public Footprint & OSINT (Planned)

Important note on fairness: These signals are surfaced as information for a human reviewer, not as automatic disqualifiers. The goal is to give hiring teams more signal, not to automate decisions that could introduce bias. Companies using these features should establish clear, consistent policies for how the information is reviewed.

Planned data sources (public only):

  • LinkedIn โ€” activity level, recommendations, publication history, network density in relevant fields
  • GitHub / GitLab โ€” actual code contributions, commit frequency, open source engagement
  • Google / news โ€” professional mentions, published articles, conference talks, press coverage
  • Public records โ€” court records, business filings, professional license status
  • Domain expertise signals โ€” Stack Overflow reputation, industry forum participation, published research

The output is a public profile summary with flagged items for HR review. Nothing is used to auto-reject.

Running the HR Dashboard

# Set your OpenAI key and start the server
export RESUMETOOL_OPENAI_API_KEY="sk-..."
uvicorn resumetool.server.app:app --reload

# Open http://localhost:8000  (default login: admin / changeme)
# Change credentials via env var:
export RESUMETOOL_HR_AUTH_USERS="yourname:yourpassword"

Submitting Applications via API

# Ingest a single resume โ€” triage runs immediately and returns a tier
curl -u admin:changeme -X POST http://localhost:8000/api/v1/applications \
  -F "req_id=<job-req-id>" \
  -F "candidate_email=alice@example.com" \
  -F "candidate_name=Alice Smith" \
  -F "source=linkedin" \
  -F "days_since_posting=2" \
  -F "cover_letter=I've followed your work on X for two years and..." \
  -F "resume_file=@alice_resume.pdf"
# Returns: {"tier": "A", "composite_score": 0.88, "screen_link": "/screen/<token>"}

Creating a Job Requisition with a Rubric

import httpx

req = httpx.post("http://localhost:8000/api/v1/jobs", auth=("admin", "changeme"), json={
    "company_id": "acme-corp",
    "title": "Senior Backend Engineer",
    "description": "We're looking for...",
    "rubric": {
        "criteria": [
            {"name": "Python depth", "description": "3+ years production Python", "weight": 0.40,
             "examples_good": ["Built async APIs with FastAPI at scale"],
             "examples_bad": ["Used Python for scripting only"]},
            {"name": "System design", "description": "Distributed systems experience", "weight": 0.35},
            {"name": "Team leadership", "description": "Led 2+ engineers", "weight": 0.25},
        ]
    }
})
print(req.json()["id"])  # use this req_id when submitting applications

Key Functions (Built)

Function Location Purpose
score_resume_against_rubric() triage/scoring.py Stage 1 โ€” per-criterion AI scoring with company calibration
generate_screening_questions() triage/screening.py Stage 2 โ€” generates psychologically layered questions from rubric gaps
score_screening_answers() triage/screening.py Stage 2 โ€” scores answers on specificity, depth, and consistency
compute_behavioral_score() triage/behavioral.py Stage 3 โ€” effort and intent composite from multiple signals
compute_composite() triage/router.py Stage 6 โ€” weighted score across all active stages
assign_tier() triage/router.py Stage 6 โ€” A/B/C/D tier assignment
generate_response_email() triage/router.py Stage 6 โ€” tier-specific human-sounding response email
run_triage() triage/pipeline.py Orchestrates all stages for one application
record_decision() feedback/loop.py Stage 7 โ€” stores HM decision and triggers prompt calibration

Tier Logic

Composite = 50% rubric score + 35% interview score + 15% effort/intent score
(interview weight rolls into rubric until the candidate completes their screen)

Tier A  โ‰ฅ 85%  โ†’  Fast-track interview invite
Tier B  65-85% โ†’  Active hold โ€” HM reviews with full context
Tier C  45-65% โ†’  Polite decline with 1-2 specific gap notes
Tier D  < 45%  โ†’  Warm decline

No candidate gets silence. Every application generates a response.


๐ŸŽฌ Quick Demo

# Analyze your resume with AI
./run.sh analyze resume.pdf --enhance

# Find matching jobs automatically  
./run.sh match resume.pdf --query "cloud engineer" --remote

# Interactive guided mode
./run.sh wizard

Sample Output:

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ Resume Analysis: resume.pdf                                     โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
Title: Senior Cloud Architect
Email: candidate@example.com

                    Skills                     
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Skill        โ”ƒ Level        โ”ƒ Category   โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ AWS          โ”‚ expert       โ”‚ Cloud      โ”‚
โ”‚ Kubernetes   โ”‚ advanced     โ”‚ DevOps     โ”‚
โ”‚ Python       โ”‚ expert       โ”‚ Programmingโ”‚
โ”‚ Leadership   โ”‚ intermediate โ”‚ Management โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽฏ Top Job Match: Senior Cloud Engineer (92% compatibility)
โœ… Matching Skills: AWS, Kubernetes, Python, Docker
๐Ÿ’ก Recommendation: Consider AWS Solutions Architect certification

๐Ÿš€ Getting Started

Prerequisites

  • Python 3.11+
  • Virtual environment support
  • Optional: OpenAI API key for enhanced AI features

Installation

# Clone the repository
git clone https://github.com/yourusername/resumetool.git
cd resumetool

# Set up virtual environment
source .venv/bin/activate
export PYTHONPATH=src

# Quick start with convenience script
./run.sh wizard

Basic Usage

# Analyze resume (basic)
./run.sh analyze my_resume.pdf

# With AI enhancement (requires OpenAI key)
export OPENAI_API_KEY="your_key_here"
./run.sh analyze my_resume.pdf --enhance

# Discover job opportunities
./run.sh discover "data scientist" --remote --limit 10

# Find personalized job matches
./run.sh match my_resume.pdf --query "machine learning engineer"

๐Ÿ“Š Performance Comparison

Feature Without AI With AI Enhancement
Skills Detected 1-3 basic 6-15 categorized
Experience Parsing 50% accuracy 95% accuracy
Job Match Quality Generic 50% Intelligent 85%+
Professional Insights None Title + recommendations
Overall Improvement Baseline 6x Better Results

๐Ÿ›  Advanced Features

Command Line Interface

resumetool [OPTIONS] COMMAND [ARGS]...

Commands:
  analyze     Parse and analyze resume files
  discover    Find job opportunities  
  match       Get personalized job matches
  optimize    Generate tailored resume versions (coming soon)
  apply       Track applications (coming soon)
  wizard      Interactive guided mode

Python API

from resumetool.analysis.resume_parser import ResumeParser
from resumetool.ai.openai_client import OpenAIAnalyzer

# Parse resume
parser = ResumeParser()
analysis = parser.parse_file("resume.pdf")

# Enhance with AI
analyzer = OpenAIAnalyzer(api_key="your_key")
enhanced = analyzer.enhance_resume_analysis(analysis)

print(f"Found {len(enhanced.skills)} skills")

๐ŸŽฏ Use Cases

For Job Seekers

  • Career Transition: Understand how your skills translate to new roles
  • Skill Gap Analysis: Identify what to learn for target positions
  • Market Research: Discover in-demand skills in your field
  • Application Optimization: Tailor applications to specific roles

For Recruiters & HR

  • Candidate Screening: Quick skill assessment and role matching
  • Market Analysis: Understand skill trends and compensation
  • Job Description Optimization: Improve posting effectiveness

For Career Coaches

  • Client Assessment: Comprehensive skill and experience analysis
  • Career Planning: Data-driven career path recommendations
  • Progress Tracking: Monitor skill development over time

๐Ÿ”ฎ Roadmap

โœ… Phase 1: Core Analysis (Complete)

  • Resume parsing with AI enhancement
  • Multi-source job discovery
  • Intelligent job matching

โœ… Phase 2: Triage Foundation (Complete)

  • Rubric-based structured resume scoring (not keyword matching)
  • Async text interview with AI-generated, psychologically layered questions
  • Effort and intent scoring (cover letter quality, time-to-apply, follow-up, source channel)
  • Auto-routing with tiered responses โ€” no candidate gets silence
  • Per-company feedback loop via prompt calibration
  • HR web dashboard

๐Ÿšง Phase 3: Deeper Candidate Intelligence (Next)

  • Public footprint analysis โ€” LinkedIn activity, GitHub contributions, published work, professional presence
  • OSINT pre-screen โ€” public records, news mentions, professional license verification; surfaced for HR review, not auto-rejection
  • Voice screening option โ€” async audio responses with Whisper transcription, adds tone and fluency signal to text answers
  • Consistency scoring โ€” detect coached or fabricated answers by cross-referencing responses across multi-part interview questions
  • Email delivery โ€” Resend/SendGrid integration so response emails actually send, not just generate

๐Ÿ“‹ Phase 4: Scale & Integrations (Planned)

  • Celery + Redis background processing for high-volume ingestion (500+ resumes in a batch)
  • ATS integrations โ€” push/pull with Greenhouse, Lever, Workday
  • Bulk resume upload โ€” ingest a ZIP of ATS-exported resumes in one API call
  • Candidate portal โ€” let candidates check their screen status and respond to follow-up questions
  • Audit log โ€” exportable record of every scoring decision for compliance review

๐Ÿ— Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Resume Input  โ”‚โ”€โ”€โ”€โ–ถโ”‚   AI Analysis    โ”‚โ”€โ”€โ”€โ–ถโ”‚   Job Discovery     โ”‚
โ”‚  (PDF/DOCX/TXT) โ”‚    โ”‚  (GPT-5-nano)    โ”‚    โ”‚ (Multiple Sources)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                โ”‚                         โ”‚
                                โ–ผ                         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Career Advice  โ”‚โ—€โ”€โ”€โ”€โ”‚ Intelligent      โ”‚โ—€โ”€โ”€โ”€โ”‚   Match Scoring     โ”‚
โ”‚ & Optimization  โ”‚    โ”‚ Recommendations  โ”‚    โ”‚   & Analysis        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ“ˆ Success Stories

"ResumeTool helped me identify 5 additional skills from my experience that I wasn't highlighting. Got 3 interviews in the first week!"
โ€” Software Engineer, Career Transition

"The AI matching found roles I never would have considered. 85% match score led to my dream job at a startup."
โ€” Product Manager, Job Search Success

"As a recruiter, this tool saves me hours of manual resume screening. The skill categorization is incredibly accurate."
โ€” Senior Recruiter, Hiring Efficiency

๐Ÿค Contributing

We welcome contributions! Please see our Contributing Guide for details.

Development Setup

# Install development dependencies
pip install -e .[dev]

# Run tests
pytest

# Code formatting
ruff check .

๐Ÿ“„ Documentation

๐ŸŒ Deploy the marketing site to GitHub Pages

The marketing site (/ landing + /demo guided walkthrough) is fully static and ships via .github/workflows/pages.yml on every push to main. The portal is not included โ€” it requires a live FastAPI deployment with a database.

# Build locally to /dist
python scripts/build_static.py

# Build to a custom directory and base path
python scripts/build_static.py --out public --base /resumetool/

The script:

  • Renders landing.html and demo.html from the Jinja2 templates
  • Injects <base href="/resumetool/"> so absolute paths resolve under the GitHub Pages project URL
  • Rewrites every /dashboard link to /#contact (so the "Open Portal" CTAs route to the contact section on the marketing page instead of 404'ing on Pages)
  • Copies static/*.css and writes a .nojekyll marker

After pushing to GitHub, enable Pages โ†’ "GitHub Actions" and the site will be live at https://<user>.github.io/resumetool/.

๐Ÿ”’ Privacy & Security

  • Local Processing: Resume analysis happens on your machine
  • Optional AI: Choose when to send data to OpenAI
  • No Data Storage: We don't store your personal information
  • Open Source: Full transparency in code and processing

๐Ÿ’ฌ Support

๐Ÿ“œ License

This project is licensed under the MIT License - see the LICENSE file for details.


Made with โค๏ธ for job seekers everywhere

User Guide โ€ข Demo โ€ข Quick Start

About

AI-powered job matching and resume optimization system

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors