Self-hosted · MIT · Claude Code native

Job Search
with Leverage.

Five Claude Code skills and a Python engine. One concrete top pick a day, not a wall of options. ATS scrapers, LinkedIn alert ingest, warm-line orchestration, and an end-to-end apply pipeline. Your data on your machine.

Scanning Greenhouse · Lever · Ashby · LinkedIn alerts · Firecrawl
5
Skills
3
ATS Adapters
~1.5k
Engine LOC
1
YAML Config
0
External DB
01 · DISCOVER

Scan

Greenhouse, Lever, Ashby APIs. LinkedIn job-alert emails. Firecrawl broad-web.

02 · SCORE

Classify

Title regex against your lanes. Blocklist. Comp floor. Description signals.

03 · ENRICH

Warm-line

1st-degree LinkedIn signal. Recruiter Gmail history. ATS dedup risk.

04 · RANK

Pick

Lane fit + warm-line + history. One top pick. Three backups. No wall.

05 · APPLY

Submit

WebFetch the JD. Tailor. Render. Browser-MCP through the ATS form.

Live Demo · No install needed

Try the scorer right now.

Type or pick a role. The same scoring logic that runs locally. Title-first classification, lane regex, green and red description flags. Watch the score recompute in real time.

--
awaiting input
Reasons appear here as you type.
The Five Skills

Everything you'd do, automated.

Each skill is one markdown file in ~/.claude/commands/. Claude Code picks them up automatically and routes your input.

/job-radar
Daily ATS scan

Scrapes target companies via Greenhouse, Lever, Ashby APIs. Scores against your lane regex. Outputs one top pick plus three backups. No wall of postings.

freedailyno auth
/job-radar-linkedin
Free Premium replacement

Ingests LinkedIn job-alert emails from Gmail. Parses subject-line cards into your DB. Auto-captures warm-line connections as candidate contacts.

freegmail mcpidempotent
/job-radar-firecrawl
Broad-web discovery

Paid variant using Firecrawl search across the live web. Same scoring brain as the free pipeline. Around 10 to 15 credits per run.

paidweeklyfirecrawl
/warm-line
Pre-apply leverage

Tier 1 through 4 connection ranking. Ready-to-paste outreach drafts in your voice. Halts cold-applies when ATS dedup risk exists at the company.

freeper-jobdrafts
/apply
End-to-end submit

JD URL to confirmation in around 35 tool calls. WebFetch JD, tailor resume and cover, render to PDF, browser-MCP submit through Greenhouse, Lever, Ashby.

freebrowser mcppdf render
Architecture

One engine. One config.
One SQLite file.

Skills orchestrate. Engine scores. SQLite persists. Your ~/.job-radar/profile.yml is the single source of truth. Edit one file and every skill respects the change.

OPERATOR SKILLS LAYER · ~/.claude/commands/ /job-radar daily ATS scan /job-radar -linkedin Gmail alert ingest /job-radar -firecrawl broad-web (paid) /warm-line pre-apply leverage /apply end-to-end submit PYTHON ENGINE · ~/.job-radar/engine/ profile.yml YAML config single source scorer.py title-first regex 0-100 score discover.py ATS pipeline dedup, upsert briefing.py one-screen .md history-aware linkedin _ingest.py subject parse DATA LAYER · ~/.job-radar/ radar.db SQLite + WAL 6 tables briefings/ YYYY-MM-DD audit trail lca.db OPTIONAL visa annotate ATS ADAPTERS · public APIs, no auth Greenhouse boards-api .greenhouse.io Lever api.lever.co v0/postings Ashby posting-api .ashbyhq.com
Sample Run

One screen. One pick. No wall.

Real output from /job-radar, the LinkedIn ingest, and a warm-line check. No methodology preamble, no postings dump, just the pick and the next action.

profile.yml

Generic skeleton. Your moat is the tuning.

Three starter profiles ship in examples/. Copy the closest one, edit identity and targets, then keep adding lane signals as you learn what surfaces as unfit that shouldn't be.

Why It Exists

The same search, with leverage.

Default flowJob Radar flow
DiscoveryOpen LinkedIn, scroll, refreshFive sources auto-scanned daily
FilteringEye-balling titlesTitle regex + blocklist + comp floor
RankingMost recent firstLane fit + warm-line + history-aware
Warm-lineForgotten until after applyingMandatory pre-apply check + draft DMs
SubmissionManual paste, around 80 tool callsAround 35 calls, browser-automated
PersistenceTabs and screenshotsSQLite, your data, your machine
TuningRe-explain preferences every timeOne YAML file, every skill respects it
LinkedIn Premium$30/mo, results buried in UIFree, ingests the same alerts via Gmail
Quickstart

Four commands to running.

Skills land in ~/.claude/commands/. Engine in ~/.job-radar/engine/. Profile at ~/.job-radar/profile.yml. Idempotent.

bash # 1. Clone git clone https://github.com/Dicoangelo/job-radar-production.git cd job-radar-production # 2. Install (sets up ~/.job-radar/, copies skills to ~/.claude/commands/) bash install.sh # 3. Pick a starter profile and edit it cp examples/profile.revops.yml ~/.job-radar/profile.yml $EDITOR ~/.job-radar/profile.yml # 4. Restart Claude Code, then in any project: /job-radar
Sovereignty

Local-first. By design.

Job search data is sensitive. Compensation, contacts, application history, draft outreach. Job Radar treats it like the user's, not the platform's.

Your data, your disk

One SQLite file at ~/.job-radar/radar.db. No vendor account. No telemetry. Backup is one cp command.

No analytics, no tracking

Static GitHub Pages site, no scripts. The tool ships with zero outbound calls beyond the public ATS endpoints you opt into.

MIT licensed

Fork it. Modify it. Ship it inside a company. No license fee. No telemetry. No vendor lock.

Idempotent install

Re-running install.sh upgrades in place without touching your profile. Uninstall removes everything but backs up your config.

FAQ

Questions before you install.

Do I need Claude Code or will Claude.ai work?
Both work, but the experience is different. The Python engine runs locally regardless of which Claude you use. Claude Code (the CLI) auto-loads the skills from ~/.claude/commands/. On Claude.ai web or desktop, you run the engine yourself (python3 ~/.job-radar/engine/discover.py) and paste the briefing into a Claude.ai project. The browser-automation parts of /apply only work in Claude Code because they need MCP tools.
How is this different from LinkedIn Premium?
Premium gives you better filters inside LinkedIn's UI for $30 a month. Job Radar ingests the free LinkedIn job-alert emails Premium would have surfaced through the UI, but parses them into your own database, scores them with your lane regex, and pairs them with warm-line and ATS-dedup logic that Premium doesn't touch. It's a different layer of the stack.
Does this work for non-RevOps roles?
Yes. The starter profiles ship for Revenue Operations and Partner Operations because that's the original author's lane. The whole point of profile.yml is that the lane is a config value, not a hardcoded assumption. Edit the lanes block with the title regex patterns matching your role family. PM, Marketing, Engineering, Customer Success all work the same way.
What about visa sponsorship (TN, H-1B, O-1)?
There's an optional visa module that annotates each shortlisted company with LCA filing counts from the DOL's public H-1B disclosure data. Off by default. Citizens and permanent residents never need it. Visa users set profile.visa.enabled: true, build the LCA database once from the DOL CSV, and the briefing labels companies as STRONG, LIKELY, or UNVERIFIED sponsors.
Will this scrape sites that ban scraping?
No. The ATS adapters use the publicly-documented Greenhouse, Lever, and Ashby job-board APIs that those vendors publish for syndication. No auth. No headless browser scraping of restricted sites. LinkedIn job-alert emails come through Gmail (you already opted into receiving them). Firecrawl is opt-in and runs against your own API key.
What does it cost to run?
Zero for the default loop. The ATS scrapers, LinkedIn ingest, warm-line, and apply pipeline are all free. The Firecrawl variant is the only paid path and runs roughly 10 to 15 credits per execution (a few cents). Everything else is your own laptop and disk.
How do I uninstall cleanly?
bash install.sh --uninstall removes ~/.job-radar/ and the five skills from ~/.claude/commands/. Your profile.yml is backed up to ~/job-radar-profile.backup.yml in case you reinstall later.
Can I run multiple profiles?
Today the engine loads one active profile at a time. You can swap by symlinking different profiles into ~/.job-radar/profile.yml, or by setting JOB_RADAR_PROFILE=/path/to/profile.yml as an environment variable. Multi-profile support is on the roadmap.
Roadmap

What's shipped. What's next.

PRs welcome. The codebase is small and intentionally readable. Around 1,500 lines of Python plus five markdown skill files.

▶ v0.1 · Shipped

Foundation

  • 5 Claude Code skills
  • Greenhouse, Lever, Ashby adapters
  • Config-driven scorer
  • LinkedIn alert ingest
  • SQLite local DB
  • Idempotent installer
○ v0.3 · Later

Intelligence

  • Claude-driven JD-keyword extractor
  • Auto-tune lane regex from outcomes
  • Optional Supabase sync
  • Workday adapter (per-tenant config)
  • Mobile briefing PWA

Run the loop tonight.

One install command. Pick a starter profile. By tomorrow morning, your terminal has one concrete pick instead of fifty open tabs.