JobHuntAgent
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 6 GitHub stars
Code Warn
- process.env — Environment variable access in dashboard_app/api/action.js
- network request — Outbound network request in dashboard_app/api/action.js
- process.env — Environment variable access in dashboard_app/api/jobs.js
- network request — Outbound network request in dashboard_app/api/jobs.js
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
A Claude Code agent for job hunting: tailors a one-page resume to each job description, scores fit, scrapes postings from job boards, drafts recruiter emails, and tracks everything on a dashboard.
Job Hunt Agent
An agentic job-search system built in Claude Code, where the rules the
agent must follow are checks in code, not sentences in a prompt. It
tailors a one-page resume to each job description, scores fit on an
auditable rubric, scrapes postings, drafts recruiter emails (never sends
them), and tracks every application through to an outcome on a dashboard.
Run it inside Claude Code. On first use the agent interviews you once
to build a reusable "base template" from your real experience. After that,
paste a job description and get a tailored, ATS-checked one-page PDF back.
Why it is built this way
Most "AI resume" tools optimise for generating text. This one optimises for
not shipping a mistake, because a fabricated bullet or a two-page resume
sent to a real employer cannot be recalled. The design rules that follow
came from real failures during the author's own run, each turned
into a mechanical check the moment it happened. The full list is indocs/05_DESIGN_DECISIONS.md.
- Guardrails as code. A resume is "done" only when
verify_resume.py
passes: one page, no dashes, enough real content, no unheld title claim,
ATS-parseable, no ligature glyphs. The agent cannot mark work finished by
saying so. - Provenance over trust. Every bullet in a built resume must trace to a
phrase that literally appears in the candidate's source files. In the
author's build the builder refuses to compile otherwise; this template
ships the rule and the PDF verifier, and the provenance check is the first
item on the porting list indocs/06_FEATURES.md.
"Never invent a bullet" is meant to be a check, not a rule to remember. - Two scores, never blended.
fitmeasures how well the background
matches the JD;oddsmeasures the chance of clearing that employer's
screen. A wide gap means "apply via referral", not "skip". - Score what you actually read. Scored on a stub JD, roles looked
better than on the full posting (the less the agent knew, the higher it
scored). Fit is now capped by how much JD text existed at scoring time,
and the cap lifts automatically when the real posting is recovered. - Human in the loop where it matters. The agent drafts emails; the user
sends. The agent builds resumes; the user approves from a phone. Nothing
outbound happens without a person pressing the button. - Measured on outcomes, not activity. The scoreboard's North Star is
interviews per ten applications, with cohorts by score band, employer tier
and channel, and a validation test that refuses to draw a conclusion
under 25 resolved applications.
Features at a glance
The full list, with a status for each (ships in this repo, operating rule,
or documented from the author's build), is indocs/06_FEATURES.md. The short version:
| Stage | What the system does |
|---|---|
| Onboarding | One interview turns your real resume into a bullet library, role headers, skills blocks and a profile with salary, notice period, target roles and locations. |
| Resume engine | Locked one-page template, per-application specs that select and order real bullets, Chrome PDF compile with auto-fit, archived (never deleted) replacements, optional cover letter. |
| QA gate | Pass/fail verifier: one page, ATS text layer, no dashes, no ligatures, no leaked template text, name first, bullet and word floors, required and banned facts, no unheld title claim, no unverified estimates, sent resumes frozen. |
| Scoring | Six-dimension rubric with a re-derivable breakdown; fit and odds kept separate; skip / review / auto-approve thresholds; years of experience never scored; location a pre-filter, never a dimension. |
| Discovery | Greenhouse, Lever and Ashby scraper with no API key; manual capture from a pasted JD or URL; recruiter email captured on the row. |
| Tracking | SQLite tracker with a fixed status flow, append-only notes, applied-date stamps, and a clear split between "you passed" and "they passed". |
| Outreach | Gmail drafts with the resume attached; the kit has no send path. Telegram digest of the review queue. No form autofill, ever. |
| Dashboard | Supabase and Vercel approval dashboard for the phone: Review, To Apply, Pipeline; fit and odds side by side; two-way sync with the local tracker; a seeded demo instance. |
| Interview prep | Company-researched prep report with every candidate fact tagged by confidence. |
| Operating rules | Seven guardrails, each with the incident behind it, and a scheduled-run design (morning pipeline, evening audit) documented for reuse. |
Beyond the shipped set, the author's build adds a validation gate on every
status transition, JD-quality caps on fit, employer-tier odds adjustments,
Gmail-alert discovery with queue caps and a 7-day no-JD clock, a location
taxonomy module, ghost-job signals, an outcome tracker that reads employer
replies, a scoreboard whose only North Star is interviews per ten
applications, pending-action deadlines, a health check and per-run tracing.
Each is described in the features doc with the order that worked for
porting them.
What you get
- A locked one-page HTML/PDF resume template (
templates/resume_base.html).
Layout and CSS never change; only the content does. - A bullet-library + per-job-spec model (
scripts/build_resume.py,scripts/resume_specs.py). Tailoring = selecting, ordering and rephrasing
your real bullets toward a JD's own words. Nothing fabricated. - A mechanical QA gate (
scripts/verify_resume.py): fails a resume for
more than one page, em/en dashes, too few bullets, too thin, banned
filler, an unheld job-title claim, unverified[estimate]markers,
non-ATS-parseable layout, or ligature glyphs that break literal keyword
matching. - A one-page PDF compiler with auto-fit (
scripts/compile_pdf.py). - An onboarding interview (
ONBOARDING.md) the agent runs to set this
up from your existing resume, then asks about salary, roles and locations. - A fit-check rubric the agent scores each JD against before tailoring,
recorded on the job withscripts/score.py(fit vs. odds, plus a
re-derivable breakdown).
Optional pipeline (no keys needed to start)
- A job scraper (
scripts/scrape.py) that pulls postings from public
Greenhouse / Lever / Ashby boards, filtered by your title and location
keywords. No API key. - A local tracker (
scripts/track.py, SQLite) that every other piece
reads from and writes to. - Gmail draft creation for recruiter outreach (
scripts/gmail_auth.py)
— drafts only, it never sends. - A Telegram digest of your review queue (
scripts/telegram_setup.py). - A web approval dashboard (
dashboard_app/, Supabase + Vercel) —
Approve / Pass / Mark-applied from your phone, synced back to the tracker. - Setup guides for every key, one step at a time
(docs/01_SETUP_API_KEYS.md).
Optional interview prep
- An interview-prep report generator (
docs/04_INTERVIEW_PREP_GUIDE.md):
when you have an interview booked, the agent researches the company,
rebuilds every candidate claim from your real profile, and compiles a
thorough prep PDF - resume walkthrough, STAR stories, domain frameworks,
a company and competitor deep dive, likely questions with answer frames,
and a strategic teardown. Every fact carries a confidence badge.
Quick start
Install prerequisites:
- Python 3.10+
- Google Chrome (used to render the PDF)
pip install -r requirements.txtCopy the config templates:
cp config/profile.example.json config/profile.json cp config/resume_rules.example.json config/resume_rules.jsonOpen this folder in Claude Code and say:
"Set up my base resume."
The agent follows
ONBOARDING.md: asks for your current resume (or
interviews you from scratch), fills the template, builds your bullet
library, then asks about current/expected salary, notice period, target
roles and preferred locations.After onboarding, paste any job description and say "tailor my resume
for this."(Optional) Turn on tracking and discovery:
python scripts/track.py init cp config/job_sources.example.json config/job_sources.json # edit companies + keywords python scripts/scrape.py --dry-runSee
docs/03_PIPELINE_OVERVIEW.md, thendocs/01_SETUP_API_KEYS.mdfor
Telegram / Gmail / the dashboard.
Files map
| Path | Purpose | Core? |
|---|---|---|
CLAUDE.md |
Operating rules the agent follows | yes |
ONBOARDING.md |
The one-time interview | yes |
templates/resume_base.html |
The locked resume layout | yes |
templates/cover_letter_base.html |
Optional matching cover letter | no |
scripts/compile_pdf.py |
HTML -> one-page PDF | yes |
scripts/verify_resume.py |
Pass/fail QA gate | yes |
scripts/build_resume.py |
Assemble a resume from a spec | yes |
scripts/resume_specs.py |
One entry per application | yes |
config/profile.json |
Contact, roles, locations, salary | yes |
config/resume_rules.json |
Your name + fact/title rules for the QA gate | yes |
candidate_profile/ |
Your resume PDF + verified extra facts | yes |
scripts/track.py |
Local SQLite application tracker | optional |
scripts/scrape.py |
Pull jobs from Greenhouse/Lever/Ashby (no API key) | optional |
config/job_sources.json |
Watchlist + title/location filters for the scraper | optional |
scripts/score.py |
Store a fit/odds score + breakdown on a job | optional |
scripts/sync_supabase.py |
Sync tracker <-> hosted dashboard | optional |
scripts/telegram_setup.py |
Telegram digest of the review queue | optional |
scripts/gmail_auth.py |
Create outreach email drafts (never sends) | optional |
dashboard_app/ |
Supabase + Vercel approval dashboard | optional |
docs/01_SETUP_API_KEYS.md |
Telegram, Gmail, SerpAPI, Supabase, Vercel | optional |
docs/02_BASE_RESUME_GUIDE.md |
Manual version of onboarding | reference |
docs/03_PIPELINE_OVERVIEW.md |
The optional tracking pipeline | optional |
docs/04_INTERVIEW_PREP_GUIDE.md |
The optional interview-prep report generator | optional |
docs/05_DESIGN_DECISIONS.md |
The incidents behind each guardrail, and what was measured | reference |
docs/06_FEATURES.md |
Every feature with its status: ships, rule, or described from the author's build | reference |
demo/ |
A seeded, fictional demo instance for screenshots and walkthroughs | reference |
Privacy
.gitignore excludes everything with real personal data: config/*.json
(except .example. templates), candidate_profile/* (except examples),data/, resumes/, cover_letters/, JDs/, and all API credentials.
Before pushing, run git status and confirm none of the real files are
staged.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found