The vault was 155 pages / 31,210 lines, most of it measurement ledgers for payloads that no longer run. A throughput figure for a runtime nobody operates is not a record: AI moves faster than the vault, so the number is wrong before anyone reads it, and a wrong number in a runbook gets believed. Per the new purpose test in `AGENTS.md` → *Documentation Policy*, it is destroyed. Gone (`.AGENTTRASH/20261019-destruction/`, KILL-LIST.txt is the manifest): - the `frank-medium` endpoint and its five era pages, `frank-npu`, FastFlowLM, the ikllama/kingjones/dealign/frank-redo eras, the ling/swift15/freetoken/ubatch campaign pages, qwen3.8 spec-matrix and strix-optimizations, the two "Running Qwen3.6 …" pages; - the whole `Pipeline Parallelism/` folder (no live script passes a pipeline flag) and the multi-device/x4-pair/hybrid/offload experiment pages; - every vLLM page — no vLLM endpoint exists on this fleet; - `LLM/deployment.md` (`Architecture/Deployment Flow.md` is the test-referenced owner) and the external surveys (SGLang, Lemonade, llama.cpp forks/diff, self-hosted app census, the TTS survey) that were obsolete by construction; - `log.md`, 2,380 lines. Git holds the chronology; a causal law belongs to the page that owns the thing it governs, never to a diary. Survivors: 101 pages, 17,542 lines, 0 OKF violations, 0 unresolved links. Eras tables keep the window, payload, runtime, reason and rollback pointer; the rate columns are blanked. The live shapes stay verbatim — those numbers are what the deployer and `models.yml` consume.
215 lines
13 KiB
Markdown
215 lines
13 KiB
Markdown
---
|
||
type: reference
|
||
description: "Self-hosted job-search and resume tools: the landscape, local-LLM fit, and the recommended homelab stack."
|
||
tags:
|
||
- research
|
||
- job-search
|
||
- resume
|
||
- self-hosted
|
||
timestamp: 2026-09-22
|
||
---
|
||
|
||
# AI Job Search and Resume Tools
|
||
|
||
Research brief for self-hostable (Docker/Podman) open-source applications in two
|
||
categories: (a) **job search** — finding jobs, matching, tracking applications —
|
||
and (b) **resume/CV formatting** — building, tailoring, and optimizing. Target
|
||
environment: this homelab (2 Ubuntu GPU servers + 1 macOS mini, Podman/Quadlet,
|
||
Caddy, local LLMs via Ollama/llama.cpp).
|
||
|
||
## The Two Shapes
|
||
|
||
The space split into two distinct shapes in 2026:
|
||
|
||
1. **Web-app trackers** — Dockerized dashboards for tracking applications,
|
||
resumes, and AI-assisted matching/tailoring (JobSync, offerPilot, JobNavigator
|
||
on the job-search side; Reactive Resume, Resume Matcher, OpenResume, ResumeLM
|
||
on the resume side). The natural homelab fit: one `docker compose up` (or
|
||
Quadlet unit), data in a local volume, AI pointed at a local Ollama/llama.cpp
|
||
endpoint.
|
||
2. **CLI agent frameworks** — "bring your own AI coding CLI" tools that run the
|
||
whole job search as local files + prompts (career-ops, MadsLorentzen/ai-job-search).
|
||
Viral in 2026 (72k and 44k stars) and the strongest at *finding* jobs (portal
|
||
scanning) and *tailoring* CVs, but not self-hosted web services — they run on
|
||
your machine against a paid AI CLI (Claude Code, Codex, etc.).
|
||
|
||
**Strongest self-hostable picks for this fleet:** JobSync (MIT, Ollama-as-default
|
||
AI + MCP server), Resume Matcher (Apache-2.0, best dedicated tailoring tool)
|
||
Reactive Resume (MIT, best pure resume builder, 43k stars). There is **no
|
||
dominant self-hosted app for pure job *discovery*** at scale — that niche is
|
||
JobNavigator (Docker, 126 stars) plus the CLI frameworks.
|
||
|
||
## Job-Search Applications
|
||
|
||
### career-ops — https://github.com/career-ops-hq/career-ops
|
||
MIT, ~72,400 stars (verified 2026-09-22). Open-source AI job-search "command
|
||
center" that runs inside any AI coding CLI (Claude Code, Codex, Copilot, Gemini
|
||
CLI). Evaluates listings against your CV with a published five-dimension rubric,
|
||
generates ATS-optimized per-role PDF resumes, drafts Greenhouse/Ashby/Lever
|
||
application answers, scans 150+ career portals with zero API tokens, and tracks
|
||
the pipeline in a Go terminal dashboard. Never auto-submits. Uses whichever AI
|
||
CLI you already pay for; data is local Markdown/YAML you own. Not a server:
|
||
`npx @santifer/career-ops init`.
|
||
|
||
### ai-job-search (MadsLorentzen) — https://github.com/MadsLorentzen/ai-job-search
|
||
MIT, ~43,600 stars. Claude Code framework: `/setup`, `/scrape`, `/rank`
|
||
`/apply <url>` (fit evaluation + tailored LaTeX CV + cover letter + a reviewer
|
||
agent), `/interview`, plus an ATS parseability check on generated PDFs. Portal
|
||
skills ship for the Danish market but are swappable. Prereqs: Claude Code,
|
||
Python 3.10+, Bun, a LaTeX distribution. **Caveat (README):** a GitHub fork is
|
||
always *public* and `/setup` writes personal data into tracked files — use a
|
||
private repo with this repo as `upstream`.
|
||
|
||
### JobSync — https://github.com/Gsync/jobsync
|
||
MIT, ~1,300 stars. The most complete self-hosted tracker: application tracker +
|
||
monitoring dashboard, resume management (PDF/DOCX import with AI extraction)
|
||
contacts, company pages, interview question bank, tasks/time tracking, and
|
||
**automated job discovery** (scheduled automations track companies via job-board
|
||
APIs and AI-match each listing). In-app AI assistant (resume review, job-match
|
||
scoring, tailored cover letters) and a built-in **MCP server** (Claude Desktop
|
||
can add jobs from chat). **Ollama is the default provider — fully local, no API
|
||
key**; known-good `qwen3.5:9b`. Models must support tool calling + structured
|
||
output. `git clone` + `docker compose up` → :3737. Env: `AUTH_SECRET`
|
||
`ENCRYPTION_KEY` (encrypts stored API keys — set before adding keys, never
|
||
change after), `NEXTAUTH_URL`, `MCP_ENABLED`. Treats pasted postings as untrusted
|
||
text (prompt-injection defense).
|
||
|
||
### offerPilot — https://github.com/offercontext/offerPilot
|
||
AGPL-3.0, ~730 stars. Local-first AI job-application tracker (Chinese-first,
|
||
English README). Pipeline by company/role/stage, resume versioning, JD-linked
|
||
material generation, **mock interviews** (offline Whisper transcription in
|
||
browser, audio never persisted), interview review, **offer comparison and
|
||
salary-negotiation prep**, a "Pilot" AI assistant. Provider-agnostic (connect
|
||
your own model service). Docker: `docker build -t offerpilot . && docker run
|
||
--rm -p 127.0.0.1:8080:8080 -v offerpilot-data:/data offerpilot`. Will not
|
||
auto-submit.
|
||
|
||
### JobNavigator — https://github.com/vesaias/JobNavigator
|
||
MIT, ~126 stars. The most aggressive *discovery* tool: scrapes career pages
|
||
(Playwright + 11 ATS handlers) and job boards (JobSpy: LinkedIn, Indeed,
|
||
ZipRecruiter, Google), dedupes, AI-scores jobs against your résumés, tailors
|
||
résumés/cover letters (8+8 templates), auto-fills ATS forms, tracks applications
|
||
with funnel/Sankey stats, auto-detects Gmail replies, sends Telegram alerts.
|
||
Chrome extension for passive LinkedIn capture. AI: Claude/Codex/Antigravity
|
||
CLIs, OpenAI, OpenRouter, **Ollama**. `git clone` + `docker compose up -d`
|
||
(prebuilt GHCR images, pinnable via `JN_IMAGE_TAG`).
|
||
|
||
## Resume / CV Applications
|
||
|
||
### Reactive Resume — https://github.com/reactive-resume/reactive-resume
|
||
MIT, ~43,300 stars. The most popular open-source resume builder: 15 templates,
|
||
live preview, PDF/JSON/DOCX export, drag-and-drop, share links, JSON Resume
|
||
import, passkeys/2FA, and an **ATS checker with optional AI review**.
|
||
Provider-agnostic AI — OpenAI, Claude, Gemini, OpenRouter, **Ollama**, and any
|
||
OpenAI-compatible endpoint (base URL + model); credentials encrypted
|
||
server-side. `docker compose up -d` (PostgreSQL + optional SeaweedFS). Since
|
||
v5.1.0 PDF generation is fully client-side (`@react-pdf/renderer`) — no
|
||
Browserless/Chromium. No tracking/analytics by default; full export; one-click
|
||
delete.
|
||
|
||
### Resume Matcher — https://github.com/srbhr/Resume-Matcher
|
||
Apache-2.0, ~28,500 stars. The dedicated *tailoring* tool: upload a master
|
||
resume, paste a JD, get AI-tailored content with a review step, per-job
|
||
templates, cover-letter + interview-prep generation, **resume scoring + keyword
|
||
highlighting** against the JD, PDF export (4 templates). **Ollama (local)** plus
|
||
OpenAI, Claude, Gemini, OpenRouter, DeepSeek (built on LiteLLM). Official
|
||
Docker images: `docker run -p 3000:3000 -v resume-data:/app/backend/data
|
||
ghcr.io/srbhr/resume-matcher:latest` (API at `/api`, health at `/api/v1/health`).
|
||
**Ollama-in-Docker gotcha (README):** use `http://host.docker.internal:11434`
|
||
not `localhost`.
|
||
|
||
### OpenResume — https://github.com/xitanggg/open-resume
|
||
AGPL-3.0, ~8,900 stars. Resume builder **and** parser. The builder produces an
|
||
ATS-friendly design (Greenhouse/Lever compatible) with real-time PDF preview;
|
||
the parser deterministically tests an existing resume's ATS readability.
|
||
**No AI** — deliberately algorithmic (PDF.js + layout heuristics). Purely
|
||
client-side (works offline, data never leaves the browser).
|
||
|
||
### ResumeLM — https://github.com/olyaiy/resume-lm
|
||
AGPL-3.0, ~326 stars. AI resume builder for tech jobs: base + tailored resumes,
|
||
ATS scoring, AI bullet editing, cover-letter generator, job/application
|
||
tracking. Cloud API providers only in practice (OpenAI, Claude, Gemini,
|
||
DeepSeek, Groq) — no Ollama/local documented. Next.js 15 + Supabase + Redis.
|
||
|
||
### rendercv (non-AI) — https://github.com/rendercv/rendercv
|
||
MIT, ~17,600 stars. LaTeX-based YAML→PDF resume builder. No AI, but the
|
||
strongest "ATS-safe by construction" formatter (single column, standard fonts)
|
||
pairs well with any AI tailoring step.
|
||
|
||
## Best Practices for a Homelab AI Resume/Job Pipeline
|
||
|
||
**Local LLM vs API.**
|
||
1. **Local-first for PII.** CVs carry name, contact, employment history, often
|
||
salary. The apps that matter all support fully-local inference: JobSync
|
||
(Ollama default), Resume Matcher (Ollama via LiteLLM), Reactive Resume
|
||
(Ollama + any OpenAI-compatible endpoint), JobNavigator (Ollama). Point them
|
||
at Ollama on the GPU server, or a llama.cpp `llama-server` OpenAI-compatible
|
||
endpoint (Reactive Resume and Resume Matcher consume it via base-URL
|
||
override).
|
||
2. **Pick a model with tool calling + structured output** for JobSync — its
|
||
assistant works by calling tools; a model without tool support "will reply
|
||
with text instead of doing anything." JobSync's tested local model is
|
||
`qwen3.5:9b`; anything 8B–32B with tool support is a reasonable bet.
|
||
3. **Raise Ollama's context to ~16k** for resume/JD matching (the 4k default
|
||
truncates long resume+JD prompts; don't go much higher).
|
||
4. **Networking:** expose Ollama on the LAN (`OLLAMA_HOST`); inside Docker on
|
||
the same host use `http://host.docker.internal:11434`.
|
||
5. **Budget reality:** the CLI frameworks are the strongest at discovery +
|
||
tailoring quality but require a paid AI CLI. For zero per-token cost and full
|
||
privacy, the Docker apps + local Ollama is the way; expect somewhat weaker
|
||
tailoring than frontier-API models.
|
||
|
||
**Privacy & data handling.**
|
||
1. **Treat job postings as untrusted input.** The best projects defend against
|
||
prompt injection in JDs (JobSync scopes the assistant to the visible job;
|
||
ai-job-search documents postings as untrusted). Keep a human review step
|
||
before anything is sent.
|
||
2. **Never auto-submit.** All the serious tools keep submission human by
|
||
design. Mass auto-application burns standing with recruiters and ATS systems.
|
||
3. **Don't fork the CLI frameworks publicly** for personal use (ai-job-search:
|
||
forks are public, `/setup` writes personal data into tracked files).
|
||
4. **Protect stored secrets.** JobSync: set `ENCRYPTION_KEY` (`openssl rand
|
||
-base64 32`) *before* adding API keys. Reactive Resume: AI credentials are
|
||
encrypted server-side.
|
||
5. **Keep the service off the public internet.** These apps store sensitive PII.
|
||
Bind to LAN / put behind the existing Caddy reverse proxy with auth (the
|
||
fleet already runs Anubis+Authentik+Caddy — route through the same guard
|
||
chain). offerPilot's own default is `127.0.0.1:8080`.
|
||
6. **Back up the data volume.** JobSync has built-in zip backup/restore (excludes
|
||
API keys by design). offerPilot and Resume Matcher keep everything in one
|
||
volume — snapshot those.
|
||
7. **Podman/Quadlet specifics:** all Docker-compose stacks map directly to
|
||
Quadlet `.container`/`.network` units for boot persistence (fleet convention).
|
||
Remember the published-port cutover gate (3737 JobSync, 3000 Resume Matcher,
|
||
8080 offerPilot) and that Ollama must be reachable from the container network
|
||
(published port or `host.containers.internal`).
|
||
|
||
## Suggested Stack for This Fleet
|
||
|
||
| Role | App | Why |
|
||
|---|---|---|
|
||
| Tracking + matching + discovery | **JobSync** (MIT) | Only self-hosted tracker with Ollama-as-default AI, job-board API discovery, MCP server, backup/restore |
|
||
| Per-JD tailoring | **Resume Matcher** (Apache-2.0) | Master-resume workflow, scoring + keyword highlighting, single container, Ollama |
|
||
| Resume building / ATS-safe PDFs | **Reactive Resume** (MIT) | 15 templates, ATS checker + AI review, JSON Resume import, client-side PDF |
|
||
| (optional) deep discovery | **JobNavigator** (MIT) | Playwright scraping of career pages + boards, Telegram alerts |
|
||
| (optional) CLI power mode | **career-ops** (MIT) | Best-in-class scoring rubric + portal scanning, if a paid AI CLI is acceptable |
|
||
|
||
All five run comfortably on the existing GPU servers alongside Ollama; none
|
||
requires more than a few hundred MB RAM.
|
||
|
||
# Citations
|
||
|
||
- career-ops: https://github.com/career-ops-hq/career-ops (MIT, ~72,386 stars) — site: https://career-ops.org
|
||
- ai-job-search: https://github.com/MadsLorentzen/ai-job-search (MIT, ~43,609 stars)
|
||
- JobSync: https://github.com/Gsync/jobsync (MIT, ~1,299 stars)
|
||
- offerPilot: https://github.com/offercontext/offerPilot (AGPL-3.0, ~730 stars)
|
||
- JobNavigator: https://github.com/vesaias/JobNavigator (MIT, ~126 stars)
|
||
- Reactive Resume: https://github.com/reactive-resume/reactive-resume (MIT, ~43,301 stars) — AI guide: https://docs.rxresu.me/guides/using-ai ; self-hosting: https://docs.rxresu.me/self-hosting/docker
|
||
- Resume Matcher: https://github.com/srbhr/Resume-Matcher (Apache-2.0, ~28,499 stars)
|
||
- OpenResume: https://github.com/xitanggg/open-resume (AGPL-3.0, ~8,908 stars)
|
||
- ResumeLM: https://github.com/olyaiy/resume-lm (AGPL-3.0, ~326 stars)
|
||
- rendercv (non-AI): https://github.com/rendercv/rendercv (MIT, ~17,620 stars)
|
||
- JobSync Ollama default + 16k context + ENCRYPTION_KEY: https://github.com/Gsync/jobsync/blob/main/README.md
|
||
- Resume Matcher Ollama-in-Docker URL: https://github.com/srbhr/Resume-Matcher/blob/main/README.md
|
||
- Reactive Resume client-side PDF since v5.1.0: https://github.com/reactive-resume/reactive-resume/blob/main/README.md
|