
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.
install.sh sets up the rest of the environment.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.
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.
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
./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.

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:
boards.greenhouse.io/figma → board greenhouse, slug figmajobs.ashbyhq.com/ramp → board ashby, slug rampjobs.lever.co/spotify → board lever, slug spotifyadobe.wd5.myworkdayjobs.com/external_experienced → board workday, slug adobe/wd5/external_experiencedalerts.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.
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

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.
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
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.
run.sh commands into cron or Task Scheduler yourself.