AI Job Hunter
AI Job Hunter is a self-hosted job discovery and scoring engine for software engineers. A plugin scanner SDK covers Greenhouse, Lever, Ashby, Workable, Workday, SmartRecruiters, Teamtailor, and remote aggregators. GitHub Actions runs the scan pipeline daily; packages/ai_engine scores each posting with local sentence-transformers embeddings against a candidate profile - no paid LLM API. Jobs above the match threshold auto-promote to Job Leads in Supabase; the React dashboard on GitHub Pages tracks application stages, scan insights, and rescan workflows.
Problem
Job discovery for software engineers means checking dozens of company ATS boards, re-reading the same postings, and manually scoring fit. Paid LLM APIs make semantic matching expensive at daily scan volume, and there was no zero-cost pipeline tying discovery, scoring, and application tracking together.
Before and After
Before
- Manual checks across Greenhouse, Lever, Ashby, and job boards
- Keyword overlap instead of semantic fit scoring
- Paid LLM APIs for every match evaluation
- Spreadsheet application tracking disconnected from scans
- No visibility into scraper health or source coverage
After
- Plugin SDK scanners for 10+ ATS and remote aggregators
- Local sentence-transformers embeddings at zero API cost
- Auto-promote jobs above minMatchScore into Job Leads
- React dashboard on GitHub Pages with pipeline stages
- Supabase free tier with scan insights and rescan workflows
The Architecture
How AI Job Hunter runs end-to-end on GitHub Actions, open-source embeddings, and free tiers - discover jobs, score fit, and track applications without a paid AI bill. Pick any piece to see what it does.
Control
Discovery
Processing
AI
Delivery
What I Built
Multi-ATS discovery pipeline
- Scanner SDK with Greenhouse, Lever, Ashby, Workable, Workday, SmartRecruiters, Teamtailor, and remote boards.
- scanner_engine orchestrates discovery, normalization, and dedupe by URL and external job ID.
- ATS seed registry for direct company career pages without paid job-board APIs.
- Scheduled GitHub Actions cron for daily pipeline runs.
Zero-cost AI match engine
- sentence-transformers/all-MiniLM-L6-v2 embeddings on the runner - no OpenAI bill.
- Multi-dimensional scores: overall, skill overlap, role fit, location/remote preference.
- Heuristic and embedding scorers with fallback paths in packages/ai_engine/.
- Jobs >= minMatchScore (default 75%) auto-promote to Job Leads.
Data layer and profile sync
- Supabase PostgreSQL with candidate profile, scanned jobs, leads, and interviews.
- Profile JSON import via Flask API or dashboard UI; sync scripts for Supabase.
- Scan insights surface source coverage and failure patterns before leads go stale.
- Local data.json fallback when Supabase is unconfigured.
React dashboard on GitHub Pages
- Application stages: New, Shortlisted, Applied, Interviewing, Offer, Rejected.
- Scan insights, skill frequency analytics, and rescan workflows in the UI.
- Deploy via GitHub Actions to GitHub Pages - no backend server to run.
- Monorepo: apps/dashboard, packages/database, packages/scanner_sdk, scraper/.
Engineering Decisions
- Embeddings over paid LLMs - semantic match at zero marginal cost per scan.
- Plugin scanner SDK - each ATS is an isolated scanner module with shared normalize/dedupe.
- Supabase free tier as primary store; GitHub Pages for static frontend - no always-on server.
- Separate CI workflows: lint/test, nightly tests, pipeline cron, deploy-pages, rescan-insights.
- Profile-driven scoring - one candidate profile anchors every embedding comparison.
By the Numbers
Operational cost
Rs.0 / $0
ATS scanners
10+ sources
Embedding model
all-MiniLM-L6-v2 (local)
Default promotion threshold
>=75% match
Python test modules
115+ pytest cases
Frontend host
GitHub Pages
Data store
Supabase free tier
Reliability and Ops
- Deduplication by canonical URL and external job ID prevents duplicate leads.
- scanner_health workflow monitors source availability.
- rescan_engine re-scores existing leads when profile changes.
Testing
- pytest across scraper, scanner_sdk, ai_engine, and database packages.
- CI pipeline + nightly-tests workflow on GitHub Actions.
- Scanner import tests ensure every ATS plugin loads cleanly.
What I Did
- 01Built scanner SDK and 10+ ATS plugin scrapers with normalization, dedupe, and ATS seed registry for direct company boards.
- 02Implemented zero-cost semantic scoring with sentence-transformers/all-MiniLM-L6-v2 and multi-dimensional fit (skills, role, location).
- 03Designed Supabase schema + Flask profile API with auto-promotion to Job Leads at configurable minMatchScore (default 75%).
- 04Shipped React + Vite dashboard on GitHub Pages with pipeline stages, scan insights, and rescan/rescore workflows.
- 05CI/CD: lint/test pipeline, nightly tests, scheduled pipeline-cron, deploy-pages, and scanner-health monitoring.