Coding & Developmentโœจgemini๐Ÿค–claude๐Ÿ’ฌgpt๐ŸŒuniversal

hunterjobs-ats

A candidate-side applicant tracking system. Three-stage local AI pipeline that scrapes job listings, filters them against your profile, researches the companies behind them, and drafts personalized outreach

Quick Start

Install this Skill

npx skills add mustar22/hunterjobs-ats
<!-- =========================================================
  README HEADER
  Replace the line below with your logo. 576px works well.
========================================================= -->
<p align="center">
  <img src="gogo_logo/HJ_576.png" alt="HunterJobs ATS" width="220" />
</p>

<h1 align="center">HunterJobs ATS</h1>

<p align="center">
  <em>A candidate-side applicant tracking system.</em>
</p>

<p align="center">
  <img alt="version" src="https://img.shields.io/badge/version-0.7.0-9d6fff" />
  <img alt="license" src="https://img.shields.io/badge/license-Apache--2.0-blue" />
  <img alt="status" src="https://img.shields.io/badge/status-work%20in%20progress-orange" />
  <img alt="tests" src="https://github.com/mustar22/hunterjobs-ats/actions/workflows/test.yml/badge.svg" />
  <img alt="stars" src="https://img.shields.io/github/stars/mustar22/hunterjobs-ats?style=flat&color=9d6fff" />
  <img alt="forks" src="https://img.shields.io/github/forks/mustar22/hunterjobs-ats?style=flat&color=9d6fff" />
  <img alt="issues" src="https://img.shields.io/github/issues/mustar22/hunterjobs-ats?color=9d6fff" />
  <img alt="clones" src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/mustar22/hunterjobs-ats/traffic-data/traffic/clones-badge.json" />
</p>

<p align="center">
  <sub><strong>v0.7.0 just shipped</strong> - you can rewrite what the judge looks for, it now reads work mode and visa requirements off the listing, and Claude joined the backends. <a href="#changelog--roadmap">See changelog &darr;</a></sub>
</p>

---

## What it is

A local Python app that reads job listings so you don't have to. It scrapes them, judges each one against your profile, and for the ones worth your time it researches the company and digs up real people to contact. Everything runs on your machine against your own LLM key, stored in a plain SQLite file. No accounts, no cloud, no SaaS.

Sources: LinkedIn, Indeed, Y Combinator startups (scraped straight off each company's ATS board), and the monthly Hacker News "Who is Hiring?" thread. The UI is a desktop dashboard: Jobs / Applied / Market Analyzer / Logs / Setup. Pick your sources, pick a backend (Gemini, Claude, Gemma, OpenAI, OpenRouter, or a local LM Studio model), paste your profile, hit Run. Jobs stream in as they're judged.

> **Work in progress.** Most of it works. Some bits are clanky. Feedback welcome.

<!-- HERO SCREENSHOT: Jobs tab with several expanded listings, dark theme, one colored row visible -->

![Jobs tab](screenshots/jobs_tab_overview.png)

---

## Why this exists

The job market is broken from a candidate's side. Recruiter spam, ghost listings, staffing agencies dressed up as employers, the same 12 roles re-uploaded across 6 boards. Spray 200 applications, hope for 3 interviews. Weeks of your life for almost no signal.

So this is the inverse of a normal ATS. Those serve employers, helping companies filter candidates. This one serves you: it filters everything *they* throw at the market down to a short list that actually matches what you can do, with enough context to write a real email to a real person.

**It is not an autoapply tool.** No mass submissions, no auto-sent emails, nothing pretending to be you on LinkedIn. It does the parts that suck (scraping, filtering, researching, finding who to contact) and then gets out of your way. Who you write to and what you say stays yours. Fewer and better leads, not more noise.

It started as a script I hacked together for myself, just to stop LinkedIn trash from eating my evenings. This is that idea grown up: it doesn't only filter, it researches the company and hands you real people to contact. Three LLM calls in a row, each doing one job properly.

![Demo](screenshots/hunterjobs_demo.gif)

---

## How it works

Two AI "brains" running locally on your machine, sharing one SQLite database.

```mermaid
flowchart LR
    subgraph Brain1["Brain 1 - Pipeline"]
        direction TB
        S1["Stage 1<br/>Scrape + Filter<br/>(Gemma)"] --> S2["Enrichment<br/>Company OSINT + Contacts<br/>(one cached pass per company)"]
    end

    subgraph Brain2["Brain 2 - Strategist"]
        Snap["Periodic Market Snapshot<br/>(Gemini / Claude)"]
        Chat["Conversational chat<br/>with DB read access"]
    end

    DB[(SQLite<br/>Jobs ยท Snapshots ยท Chat ยท Embeddings)]

    S1 --> DB
    S2 --> DB
    DB --> Snap
    DB --> Chat
```

**Brain 1** is the pipeline:

| Stage | What it does | LLM |
|------:|---|---|
| 1 | Scrape job boards, hard-reject obvious noise (keyword blacklist), then GOOD/MAYBE/BAD verdict against your profile - up to your per-scan budget; overflow queues for the next scan. | Gemma 4 (free tier on Google AI Studio) |
| Enrichment | For GOOD jobs, one cached pass per company: research (size, real stack, hiring signal, staffing-agency demote) **and** contact discovery in a single call. Contacts come from emails printed in the posting itself, YC profile founders, team pages, GitHub orgs, and web

... (truncated)
Repository
7stars
1forks
View on GitHub
Details
DiscoveredJul 26, 2026
Last UpdatedJul 26, 2026
Author@mustar22
Quality Score
40/100