← projects
Python

JobSonar

JobSonar
Python
OVERVIEW

A self-hosted job-search agent that scans job boards, public ATS APIs (Greenhouse, Lever, Ashby), and a company watchlist of ~250 career pages in parallel. Scores, filters, and dedupes postings against your profile, then surfaces a ranked shortlist in a local web UI. Never auto-applies — it pre-fills the form and hands control back to you. Runs entirely locally with no account, server, or telemetry.

TECH STACK
PythonPlaywrightSQLiteAnthropic API
KEY FEATURES
  • Parallel multi-stage scan across job boards, ATS APIs, and a ~250-company watchlist with per-source soft-fail
  • Pulls clean JSON feeds from public ATS APIs (Greenhouse, Lever, Ashby) instead of scraping
  • Optional LLM scoring via Anthropic API to rank postings and draft tailored resume bullets/cover letters
  • Assisted-apply only — opens a real browser with the form pre-filled, never submits on its own
HOW IT WORKS
  1. 01A scan sweeps job boards, ATS feeds, and the company watchlist in parallel via per-source adapters
  2. 02Results are deduped by URL/title+company and filtered by role, experience, location, and posting age
  3. 03Postings are scored against your profile with keyword matching plus an optional Anthropic LLM pass
  4. 04New-only results are saved to a local SQLite database
  5. 05A Flask web UI lets you review, archive, export to Excel, or launch an assisted-apply browser session
CHALLENGES

Aggregating 15+ heterogeneous sources (Greenhouse, Lever, Ashby, SmartRecruiters, Rippling, Keka feeds, plus JSearch/Adzuna and a ~250-company watchlist) meant every source had a different schema and rate limit. Solved with a job_agent/sources/ adapter layer that normalizes each source into one common job schema before deduping by URL and normalized title+company.

METRICS
19
API endpoints
8,316
Python LOC
13
Source adapters
9
Core dependencies