AI Frontier Post
A job seeker searching job listings on a laptop
Job hunting is a polling problem — JobRadar automates the loop. Photo: Pablo Merchan Montes / Unsplash.

Job hunting is a polling problem. You refresh the same careers pages every morning — most of them on Greenhouse, Lever, or Ashby boards that all look identical — and the moment you stop checking, the role you wanted closes. The boards' own job alerts are keyword soup: a search for “product” emails you about product managers, product marketers, and product support, and you learn to ignore all of it.

JobRadar automates the whole loop properly. It watches 56 companies' job boards across seven ATS platforms — Greenhouse, Lever, Ashby, Workable, Workday, and Oracle Recruiting Cloud — gives every posting a stable id so “new” means new and disappeared ones get marked dead, then scores each one 0–10 against your resume with an LLM. Matches land in your inbox as a daily alert, a weekly digest arrives every Monday, and a local web UI at http://localhost:8765 keeps the full ranked list searchable. It's MIT-licensed, picked up 150+ stars within days of launch, and its best design idea is one worth stealing: the scoring rules that matter run in code, not in the prompt.

What you get at the end: a job hunter that watches the boards you care about, scores them against your actual resume, and pings you only when something clears your bar. Here's the whole thing, hands-on.

What you'll need

1. Clone and install

git clone https://github.com/suvamneog/jobradar.git
cd jobradar
./install.sh

install.sh sets up the virtual environment and registers two launchd jobs: a daily alert check at 09:30 and a weekly digest every Monday at 09:00. You can run everything by hand below, but the schedules are what turn this from a script into a radar.

2. Point it at your resume

Drop your resume PDF into the repo folder and set resume_path in config.yaml. This is the document every posting gets scored against, so use the version you'd actually submit — the model reads the job description and your experience together, then assigns the 0–10 score with a reason.

3. Add your keys

cp run.example.sh run.sh

Then fill in the two keys: your LLM key (default provider xkiro, model mistralai/mistral-large-2512, with a daily_token_limit of 1,000,000 in the config), and your Gmail App Password for sending mail. Now prove the plumbing works before you spend any tokens:

./run.sh test          # sends a test email
./run.sh scan          # fetch, diff, score
./run-web.sh           # web UI at http://localhost:8765

4. Run your first scan

./run.sh scan fetches every board, diffs against the last run, and scores everything 0–10. This is where the two hard rules kick in — and they're the reason this tool is interesting:

Both rules are arithmetic on stored data, not prompt instructions — a model asked nicely complies inconsistently, so the enforcement lives in code. ./run.sh recap re-applies them later for free, no tokens spent.

A person filling out a resume on a laptop
JobRadar scores each posting against your actual resume — use the version you'd submit. Photo: RDNE Stock project / Pexels.

5. Tune the companies and the bar

The default list covers 56 companies. Add your own in config.yaml — the board and slug come straight from the company's careers URL:

companies:
  - { name: 'Adobe', board: workday, slug: 'adobe/wd5/external_experienced' }

alerts:
  companies: [Adobe, Oracle, Atlassian]   # checked daily
  min_score: 6

The URL-to-board mapping, from the README:

alerts.companies is your daily shortlist; min_score: 6 is the bar a posting must clear to reach your inbox. The weekly digest covers everything, ranked.

6. Let the schedules run it

Once install.sh has registered the launchd jobs, the daily rhythm is ./run.sh alert — it checks the shortlist and fires only if something new opened. The manual kit:

./run.sh alert         # check the shortlist, alert if anything opened
./run.sh digest        # send the weekly email
./run.sh recap         # re-apply the scoring rules, no tokens
./run.sh list          # the week's finds in the terminal
Planning the job hunt at a desk with a laptop and notebook
The 09:30 daily alert and the Monday digest keep the hunt on autopilot. Photo: Matt Ragland / Unsplash.

7. Mind the token meter

Scoring thousands of postings with an LLM costs real tokens, and JobRadar is designed like someone who has paid that bill. Jobs are scored 25 per request with compact positional replies, the token budget is checked before every request and recorded per batch, and a run that hits the ceiling stops cleanly and resumes next time — it can't lock you out of your key. The README's number: a full 3,400-job first scan costs about 340K tokens. That's the expensive part, and it happens once. After that only new postings get scored, which the README puts at a few thousand tokens a week. The default provider, xkiro with Mistral Large 3, has a free tier; the daily_token_limit in config.yaml (1,000,000 by default) is the guardrail that keeps a misconfiguration from eating it in one run.

8. Steal the robustness ideas

Even if you never run the full radar, the repo has two patterns worth copying. First: rules in code, not in prompts. The seniority and relevance caps are arithmetic on stored fields because a model “asked nicely” complies inconsistently — and recap can re-apply them with zero tokens. Second: the test suite reads like an incident log. Ten suites, most written because something broke in real use: a threading crash in the live scan, an alert that would have fired 142 notifications at once, a malformed model reply that killed a 3,000-job run. Run them before you trust it:

for t in tests/test_*.py; do ./.venv/bin/python "$t"; done

What you built

A personal job radar: 56 company boards diffed on a schedule, every posting scored 0–10 against your resume with the seniority and relevance guards enforced in code, daily shortlist alerts and a Monday digest in your inbox, and a searchable local web UI for the full ranked list.

Honest limitations