All Projects
Open Source · Job Discovery

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.