{"slug": "show-hn-rank-every-hn-who-is-hiring-post-against-your-resume-locally", "title": "Show HN: Rank every HN \"Who is hiring?\" post against your resume, locally", "summary": "Developer Maxwell Volz released hn_whos_hiring, a locally run tool that scores every Hacker News \"Who is hiring?\" post from 0 to 100 against a user's resume and preferences, drafts application emails, and prefills job forms. The tool requires Python 3.10+ and a logged-in Claude Code installation, runs all model calls through `claude -p`, and scored about 180 posts in 2 minutes at an estimated $2 in API-rate costs with Sonnet. It never sends or submits applications, leaving the final click to the user, and stores profile and scraped post data in gitignored `profile/` and `data/` folders.", "body_md": "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.\n\n- **Every post scored 0-100 for you.** Scores weigh your role priorities, the locations you'll work from, your seniority and your dealbreakers. \"Onsite in Berlin\" doesn't outrank \"Remote US\" because the stack matched.\n- **Reasons you can check.** Each match lists why it fits and what might stop it, quoting your real experience against what the post asks for.\n- **Salary, stage, stack and how to apply,** pulled out of free-form posts, plus filters for role, location fit, status and score.\n- **Emails in your voice.** One click writes a short, specific email that follows the post's own instructions. Open it in Gmail compose, or queue it to become a Gmail draft with your resume attached.\n- **Form prefill.** Queue a job and Claude Code fills the application in Chrome from your profile, attaches your resume, and stops before submit.\n- **Keyboard triage.**`j` /`k` to move,`i` interested,`a` applied,`s` skip,`d` draft,`o` open the apply link.\n\nYou need Python 3.10+ and [Claude Code](https://claude.com/claude-code), installed and logged in (`claude` on your PATH). Nothing to `pip install`, and no API key.\n\n```\ngit clone https://github.com/MaxwellVolz/hn_whos_hiring\ncd hn_whos_hiring\npython3 server.py\n```\n\nOpen **[http://localhost:8787](http://localhost:8787)**, then:\n\n1. **Fill in your profile.** Upload your resume PDF (its text is extracted for you), then set your role focus, locations and standard application answers.\n2. **Click Refresh.** It finds this month's thread, fetches every post and scores them. About 180 posts took 2 minutes.\n3. **Work the list,** top down.\n\nRefresh again as the month goes on: only new or edited posts get scored.\n\n| **Your profile** : the one place you describe yourself | **Drafted email** : specific to the post, ready for Gmail | \n\nAll 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.\n\n- **On a subscription,** scoring counts against your plan's usage limits; you aren't billed per call. The dollar figures in the logs are API-rate estimates. For scale, 179 posts came to about $2 at API rates with Sonnet.\n- **To spend less,** run`python3 match.py <key> --model haiku` .\n- **Cached:** a post is only re-scored when it's edited or when you change your profile.\n\nTwo 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:\n\nprocess the outreach queue\n\nClaude follows [`CLAUDE.md`](https://github.com/MaxwellVolz/hn_whos_hiring/blob/main/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.\n\nThe Gmail and Chrome steps need a Gmail connector (MCP) and the Claude in Chrome extension in Claude Code. Everything else works without them.\n\n```\nHN_PROFILE_DIR=examples/demo_profile HN_DATA_DIR=/tmp/hn-demo python3 server.py\n```\n\nThe screenshots above come from this fictional profile, a senior full-stack and AI engineer in Brooklyn.\n\nYour 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`.\n\n| Step | File | What happens | \n|---|---|---|\n| 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. | \n| 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). | \n| Review | `server.py` | A small stdlib web server for the dashboard and Profile page. It runs Refresh in the background. | \n| Write | `outreach.py` | Drafts an email from your resume, the post, and the match's reasons. | \n\nSome useful commands:\n\n```\npython3 scrape.py                      # fetch this month's thread\npython3 scrape.py 2026-09 <item id>    # register any thread by its HN item id\npython3 match.py 2026-10 --limit 20    # score just a few posts to try it\npython3 server.py 2026-09 --port 9000  # pin the dashboard to an older thread\n```\n\nTested on macOS. Linux should work. Windows is untested.\n\nMIT", "url": "https://wpnews.pro/news/show-hn-rank-every-hn-who-is-hiring-post-against-your-resume-locally", "canonical_source": "https://github.com/MaxwellVolz/hn_whos_hiring", "published_at": "2026-10-02 21:21:14+00:00", "updated_at": "2026-10-02 21:36:20.268356+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "developer-tools"], "entities": ["Maxwell Volz", "Hacker News", "Claude Code", "Anthropic", "Gmail", "Chrome", "GitHub", "Algolia"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-rank-every-hn-who-is-hiring-post-against-your-resume-locally", "markdown": "https://wpnews.pro/news/show-hn-rank-every-hn-who-is-hiring-post-against-your-resume-locally.md", "text": "https://wpnews.pro/news/show-hn-rank-every-hn-who-is-hiring-post-against-your-resume-locally.txt", "jsonld": "https://wpnews.pro/news/show-hn-rank-every-hn-who-is-hiring-post-against-your-resume-locally.jsonld"}}