Files
serverAppConfigs/serverAppConfigs-docs/Research/AI Job Search and Resume Tools.md
Frank 327e78b950 docs(vault): destroy the dead weight — 53 pages and the change diary
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.
2026-10-19 10:56:37 -07:00

215 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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