Scattered sheets of white paper covering the entire frame

Job Hunt

Blog post description of Job hunt agent

PROJECT DETAILS

6/12/20264 min read

a close up of a cell phone with an orange and pink background

JOBHUNT AGENT

Self-Hosted AI Job Application Automation — Private, Free, and Fully Under Your Control

Job Sourcing • AI Resume Tailoring • Auto Form-Fill • Application Tracking • Zero Cost

What It Is

JobHunt Agent is a self-hosted, local-first job application automation platform that runs the entire job search pipeline on your own machine: it sources jobs from official ATS APIs, scores them against your profile with AI, tailors your resume and cover letter for each role, fills application forms with browser automation, and tracks every application through follow-up — all orchestrated by an 11-service Docker stack with a human approval gate before anything is ever submitted.

It is built on one uncompromising principle: your resume, your personal data, and your job search never leave your computer. Cloud AI sees only public job postings. Everything personal stays local.

The Problem It Solves

A serious job search is a second full-time job. Sourcing roles across dozens of company career pages, reading every description, deciding fit, rewriting the resume for each application, filling out the same form fields hundreds of times, and remembering to follow up — the volume is crushing, and the repetitive work crowds out the part that actually matters: preparing for interviews.

Commercial 'auto-apply' services exist, but they demand your resume, your personal data, and often your login credentials — uploaded to someone else's cloud, used in ways you cannot audit, sometimes spamming applications that damage your reputation with employers.

JobHunt Agent automates the volume while keeping you in command of every submission — and keeps every byte of personal data on your own machine.

The 10-Stage Pipeline

The platform runs jobs through a complete, idempotent pipeline — every stage can run manually, on a schedule, or via webhook:

• Source — fetches openings from Greenhouse, Lever, Ashby, Workable plus aggregators like Remotive and Arbeitnow, using official public APIs only (no ToS-violating scraping)

• Normalize — strips HTML, extracts salary data, computes content hashes, and generates 768-dimension vector embeddings for fuzzy duplicate detection

• Enrich — classifies country, extracts required skills, flags salary disclosures

• Score — AI rates every job against your profile with reasons plus matched and missing skills

• Documents — renders 13 PDF report types, from shortlists to skills-gap analysis

• Prep — tailors your resume and cover letter per job using a local LLM only

• Review — queues prepared applications for your explicit approval in the dashboard

• Apply — Playwright browser automation fills the form, attaches documents, captures a screenshot — only for jobs you approved

• Track — schedules 7-day follow-up reminders and dead-letters stuck applications

• Report — daily pipeline digest as PDF plus a Telegram summary to your phone

Hidden Technical Strengths

The Privacy Split: Public Text to the Cloud, Personal Data Stays Local

The architecture enforces a hard boundary. Job scoring uses Gemini's free tier — but Gemini receives only the public job posting text that is already on the open web. Resume tailoring and cover letter generation run exclusively on local Ollama models and are never sent to any cloud API. This is not a policy promise; it is wired into which service can talk to which endpoint.

Double Approval Gate — Hard-Coded, Not Configurable Away

Two independent safeguards stand between the pipeline and a submitted application. The Review stage queues every prepared job for human approval in the UI. The Apply stage then hard-enforces approved status before touching a form — and the auto-apply threshold is set to a value that can never be reached, making every single submission a deliberate human decision. Quality of applications is protected by design, not by discipline.

Idempotency Keys Prevent Double-Applying

Every application generates a SHA256 idempotency key enforced by a database UNIQUE constraint. Even if a pipeline stage is re-run, crashes mid-way, or is triggered twice, the same job can never be applied to twice. Double-applying — the fastest way to look careless to an employer — is structurally impossible.

Vector Embeddings for Duplicate Detection

The same job often appears on multiple boards under slightly different titles. JobHunt Agent embeds every posting into a 768-dimension vector via local Ollama and uses pgvector similarity search with an ivfflat index to catch fuzzy duplicates that hash comparison would miss. You see each opportunity once.

Rate-Limit Pooling and Graceful AI Fallback

The scoring service tracks requests-per-minute and requests-per-day across a pool of Gemini free-tier keys with a token-bucket limiter. When the free tier is exhausted, scoring degrades gracefully: local Ollama phi3 takes over, and beneath that a pure heuristic scorer guarantees the pipeline never stalls on a quota.

Pluggable ATS Adapter Pattern

Form-filling is implemented through a clean adapter interface — one module per applicant tracking system, with adapters for Greenhouse, Lever, Ashby, and Workable. When the automation meets an unknown ATS, it degrades safely: screenshots the page and queues it for manual handling instead of guessing. Adding support for a new ATS is one file.

PII-Redacting Structured Logs

Logging is structured JSON with a formatter that actively redacts resume content, cover letters, passwords, and tokens. Credentials are encrypted at rest with Fernet. Even the audit trail respects the privacy architecture.

Full Offline Test Mode

A fixtures mode runs the complete vertical slice — source, normalize, enrich, score, documents — with zero external API calls, using a mock ATS server and local scoring. The entire stack is testable on an airplane. Idempotency is verified by re-running and counting zero duplicate inserts.

n8n Orchestration With Telegram Alerts

Eleven n8n workflow definitions handle cron scheduling, section dispatch, and error alerting. A master scheduler reads the schedule table every four hours and dispatches enabled sections. Failures and daily digests arrive on Telegram. Notably, the Apply stage is deliberately excluded from all automated scheduling — it can only be triggered by the human.

13 Generated Documents

The document engine renders thirteen PDF report types via Jinja2 templates and Gotenberg: master resume universe, daily delta of new jobs, full detail report with scores and reasoning, country and contract matrix, shortlist of top-scoring roles, per-role application packets, application tracker, skills-gap report ranked by frequency, rejected log, daily run report, salary intelligence, contacts sheet, and source attribution audit. Your job search produces its own business intelligence.

Zero-Cost, Self-Hosted Stack

• PostgreSQL 16 with pgvector — free, open source

• Ollama with nomic-embed-text and phi3 — local AI, no API fees

• Gemini free tier — public job text scoring only

• Playwright with Chromium — free browser automation

• Gotenberg — free HTML-to-PDF rendering

• n8n self-hosted — free workflow orchestration

• Telegram Bot API — free notifications

Eleven containerized services, one docker-compose file, every binding restricted to localhost. Total monthly cost: zero.

JobHunt Agent automates the grind of the job search

while keeping the judgment, the data, and the final click exactly where they belong — with you.