Rank every HN 'Who is hiring?' post against your resume, then draft emails and prefill applications from a local dashboard. Runs on Claude Code.
Python
0
5 commits
updated Oct 2, 2026
The thread gets hundreds of posts every month, and reading them all takes an evening. This reads every one, scores it against your resume and what you're looking for, explains each score, drafts the email, and fills in the application form. It runs on your machine, using your own Claude subscription.

j/k to move, i interested, a applied, s skip, d draft, o open the apply link.You need Python 3.10+ and Claude Code, installed and logged in (claude on your PATH). Nothing to pip install, and no API key.
git clone https://github.com/MaxwellVolz/hn_whos_hiring
cd hn_whos_hiring
python3 server.py
Open http://localhost:8787, then:
Refresh again as the month goes on: only new or edited posts get scored.
![]() | ![]() |
| Your profile: the one place you describe yourself | Drafted email: specific to the post, ready for Gmail |
All model calls go through claude -p, so they use whatever Claude Code is logged in with: a Pro or Max subscription, an API key, Bedrock or Vertex. Nothing else is needed.
python3 match.py <key> --model haiku.Two buttons on each job put it in a queue: Queue Gmail draft + resume and Queue form prefill. Open Claude Code in this folder and say:
process the outreach queue
Claude follows CLAUDE.md: it creates Gmail drafts with your resume attached, or fills application forms in Chrome from your profile. It never sends or submits. Every application ends with you clicking the button. It won't make accounts or type passwords. Free-text answers come from your resume, and skill checkboxes are only ticked when your profile backs them up.
The Gmail and Chrome steps need a Gmail connector (MCP) and the Claude in Chrome extension in Claude Code. Everything else works without them.
HN_PROFILE_DIR=examples/demo_profile HN_DATA_DIR=/tmp/hn-demo python3 server.py
The screenshots above come from this fictional profile, a senior full-stack and AI engineer in Brooklyn.
Your profile, resume and every scraped post live in profile/ and data/. Both are gitignored, and nothing is uploaded anywhere except the prompts Claude Code sends to Claude. Move either folder with HN_PROFILE_DIR / HN_DATA_DIR.
| Step | File | What happens |
|---|---|---|
| Find & fetch | scrape.py | Finds the newest thread through HN's Algolia search, then pulls every top-level post from the official HN API. Re-runs keep first-seen times and flag edits and deletions. |
| Score | match.py | Sends posts in batches of 6 to claude -p with your profile and resume, and gets back structured JSON (score, reasons, concerns, work mode, salary, apply method). |
| Review | server.py | A small stdlib web server for the dashboard and Profile page. It runs Refresh in the background. |
| Write | outreach.py | Drafts an email from your resume, the post, and the match's reasons. |
Some useful commands:
python3 scrape.py # fetch this month's thread
python3 scrape.py 2026-09 <item id> # register any thread by its HN item id
python3 match.py 2026-10 --limit 20 # score just a few posts to try it
python3 server.py 2026-09 --port 9000 # pin the dashboard to an older thread
Tested on macOS. Linux should work. Windows is untested.
MIT
Python
57.3%
HTML
42.7%
Rank every HN 'Who is hiring?' post against your resume, then draft emails and prefill applications from a local dashboard. Runs on Claude Code.
Python
0
5 commits
updated Oct 2, 2026
The thread gets hundreds of posts every month, and reading them all takes an evening. This reads every one, scores it against your resume and what you're looking for, explains each score, drafts the email, and fills in the application form. It runs on your machine, using your own Claude subscription.

j/k to move, i interested, a applied, s skip, d draft, o open the apply link.You need Python 3.10+ and Claude Code, installed and logged in (claude on your PATH). Nothing to pip install, and no API key.
git clone https://github.com/MaxwellVolz/hn_whos_hiring
cd hn_whos_hiring
python3 server.py
Open http://localhost:8787, then:
Refresh again as the month goes on: only new or edited posts get scored.
![]() | ![]() |
| Your profile: the one place you describe yourself | Drafted email: specific to the post, ready for Gmail |
All model calls go through claude -p, so they use whatever Claude Code is logged in with: a Pro or Max subscription, an API key, Bedrock or Vertex. Nothing else is needed.
python3 match.py <key> --model haiku.Two buttons on each job put it in a queue: Queue Gmail draft + resume and Queue form prefill. Open Claude Code in this folder and say:
process the outreach queue
Claude follows CLAUDE.md: it creates Gmail drafts with your resume attached, or fills application forms in Chrome from your profile. It never sends or submits. Every application ends with you clicking the button. It won't make accounts or type passwords. Free-text answers come from your resume, and skill checkboxes are only ticked when your profile backs them up.
The Gmail and Chrome steps need a Gmail connector (MCP) and the Claude in Chrome extension in Claude Code. Everything else works without them.
HN_PROFILE_DIR=examples/demo_profile HN_DATA_DIR=/tmp/hn-demo python3 server.py
The screenshots above come from this fictional profile, a senior full-stack and AI engineer in Brooklyn.
Your profile, resume and every scraped post live in profile/ and data/. Both are gitignored, and nothing is uploaded anywhere except the prompts Claude Code sends to Claude. Move either folder with HN_PROFILE_DIR / HN_DATA_DIR.
| Step | File | What happens |
|---|---|---|
| Find & fetch | scrape.py | Finds the newest thread through HN's Algolia search, then pulls every top-level post from the official HN API. Re-runs keep first-seen times and flag edits and deletions. |
| Score | match.py | Sends posts in batches of 6 to claude -p with your profile and resume, and gets back structured JSON (score, reasons, concerns, work mode, salary, apply method). |
| Review | server.py | A small stdlib web server for the dashboard and Profile page. It runs Refresh in the background. |
| Write | outreach.py | Drafts an email from your resume, the post, and the match's reasons. |
Some useful commands:
python3 scrape.py # fetch this month's thread
python3 scrape.py 2026-09 <item id> # register any thread by its HN item id
python3 match.py 2026-10 --limit 20 # score just a few posts to try it
python3 server.py 2026-09 --port 9000 # pin the dashboard to an older thread
Tested on macOS. Linux should work. Windows is untested.
MIT
Python
57.3%
HTML
42.7%