{"id":48670371,"url":"https://github.com/brianruggieri/candidate-eval","last_synced_at":"2026-04-10T12:06:54.098Z","repository":{"id":347601417,"uuid":"1183488687","full_name":"brianruggieri/candidate-eval","owner":"brianruggieri","description":"Evidence-backed job fit assessments from your resume and local git repos. Chrome extension for real-time job board grading, interactive dashboard, cover letter generation, and proof packages. Privacy-first — all processing stays local.","archived":false,"fork":false,"pushed_at":"2026-03-28T16:14:25.000Z","size":4142,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T17:54:30.749Z","etag":null,"topics":["career-tools","chrome-extension","claude-code","cli","cover-letter-generator","dashboard","fastapi","git-analysis","job-matching","job-search","pii-scrubbing","privacy-first","pydantic","python","resume-parser","skill-assessment"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brianruggieri.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-16T16:53:38.000Z","updated_at":"2026-03-28T16:00:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/brianruggieri/candidate-eval","commit_stats":null,"previous_names":["brianruggieri/candidate-eval"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/brianruggieri/candidate-eval","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brianruggieri%2Fcandidate-eval","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brianruggieri%2Fcandidate-eval/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brianruggieri%2Fcandidate-eval/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brianruggieri%2Fcandidate-eval/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brianruggieri","download_url":"https://codeload.github.com/brianruggieri/candidate-eval/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brianruggieri%2Fcandidate-eval/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31641501,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["career-tools","chrome-extension","claude-code","cli","cover-letter-generator","dashboard","fastapi","git-analysis","job-matching","job-search","pii-scrubbing","privacy-first","pydantic","python","resume-parser","skill-assessment"],"created_at":"2026-04-10T12:06:52.473Z","updated_at":"2026-04-10T12:06:54.093Z","avatar_url":"https://github.com/brianruggieri.png","language":"Python","readme":"# claude-candidate\n\n\u003e Everyone uses AI to polish their resume. I built one that watches me work — and scores the results against real job postings.\n\nA pipeline that turns development session logs and resume data into evidence-backed job fit assessments.\n\n**Privacy note:** Session logs and resume data are processed locally. Job posting extraction calls Claude CLI, which reaches Anthropic's API — posting text is sent as a prompt; raw session logs and resume files are not sent. Generation commands (reports, deliverables) may include derived assessment summaries in prompts.\n\n---\n\n## What It Does\n\n- **Extracts skills from real work** — Scans Claude Code development sessions, identifies skills and behavioral patterns, and links every claim to specific session evidence. Not self-reported; observed.\n- **Matches against real job postings** — Parses job requirements, scores fit across skills, domain, and culture signals, and produces a letter grade with evidence-linked explanations.\n- **Runs as a browser extension** — Chrome extension assesses job postings in real-time from any job board via a local FastAPI server.\n\n---\n\n## The Self-Referential Property\n\nThe session logs from *building this tool* are part of the profile it uses to evaluate its builder. Every architectural decision, debugging strategy, and test you see in this repo is also data the tool has scored against real job postings.\n\n---\n\n## How It Works\n\n```\nSession Logs (JSONL) ──→ Sanitizer ──→ Extractor ──→ CandidateProfile ──┐\nResume (PDF/DOCX)    ──→ Resume Parser ──────────────→ ResumeProfile ────┤\n                                                                          ↓\n                                                           MergedEvidenceProfile\n                                                                          ↓\nJob Posting ──→ Requirement Parser ──→ QuickRequirements ──→ Scorer ──→ FitAssessment\n```\n\n- **Dual evidence model** — Skills sourced from sessions, resume, or both. Corroborated skills (both sources agree) rank higher.\n- **Provenance tracking** — Every skill claim is tagged: `corroborated`, `sessions_only`, or `resume_only`. No unattributed assertions.\n- **PII scrubbing** — Two-layer pipeline: session logs are scrubbed on ingestion (emails, phones, API keys, paths); deliverable output is additionally scrubbed via DataFog before leaving the tool. Person-name detection uses honorific-anchored heuristics unless `datafog[nlp]` is installed.\n\nFull architecture, trust model, and roadmap: [ARCHITECTURE.md](ARCHITECTURE.md)\n\n---\n\n## By the Numbers\n\n| Metric | Value |\n|--------|-------|\n| Test coverage | Full unit + integration with fast/slow tiering |\n| Benchmark accuracy | 47/47 postings within 1 grade |\n| Canonical skills in taxonomy | 104 |\n| Sessions scanned (author) | 2,300+ |\n\n---\n\n## Tech Stack\n\nPython 3.11+ · Pydantic v2 · FastAPI · Click · aiosqlite · rapidfuzz · pytest + Hypothesis\nChrome Extension (Manifest V3) · DataFog for PII scrubbing\n\n---\n\n## Quick Start\n\n```bash\npip install -e .  # requires Python 3.11+\n\n# Onboard from a resume\nclaude-candidate resume onboard path/to/resume.pdf\n\n# Extract skills from Claude Code session logs\nclaude-candidate sessions scan\n# → saves profile to ~/.claude-candidate/candidate_profile.json\n\n# Score against a job posting\nclaude-candidate assess \\\n  --profile ~/.claude-candidate/candidate_profile.json \\\n  --job posting.txt \\\n  --company \"Acme Corp\" \\\n  --title \"Senior AI Engineer\"\n```\n\nFor the daily-driver workflow: run `claude-candidate server start` and use the Chrome extension to assess job postings in-browser.\n\n---\n\n## Project Status\n\n**v0.8.2** — Core pipeline stable. Dual evidence model (resume + repos), 104-skill taxonomy with fuzzy matching, eligibility gates, confidence scoring, and Chrome extension for real-time assessment.\n\nThe repo is the deliverable.\n\n---\n\n## License\n\nMIT\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrianruggieri%2Fcandidate-eval","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrianruggieri%2Fcandidate-eval","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrianruggieri%2Fcandidate-eval/lists"}