Structural repair: - 13 pages were the same document twice (each exactly 2x its HEAD size), a second frontmatter block whose closing fence had been glued onto a body line by a frontmatter rewrite that re-read its own output. Un-doubled by cutting at the second frontmatter and keeping the copy whose body is a superset; the orphan census reports 0 lost tokens against HEAD. - log.md: one entry per date, bare `## YYYY-MM-DD` headings, newest first — 66 dated headings merged into 34, titles demoted to bold leads, every content line verified present. The file had been descending at the head and ascending at the tail. Ownership moves: - New `LLM/frank-medium.md` is the locator for the retired Dankserver endpoint: era windows quoted from each era page's own banner, no numbers restated, and the two unresolved date conflicts recorded instead of silently resolved. `frank-archon.md` links to it instead of restating the pre-rename window. - The four Pipeline-Parallelism stubs (frontmatter only, no body) are gone; `Multi-Node Runtimes.md` owns runtime construction, launch, mixed-vendor verdicts and cross-split spec decode, and the four links that pointed at the stubs were repointed at it or at the drafter page. - Authentik's three stub pages fold into `Authentik.md`, with the process detail and the outpost reference split out so the parent stays under the length hint. Verified corrections (host census + live probe, 2026-10-19): - The MXFP4 checkpoint two pages called the "on-disk rollback" is gone: /home/dank/models/ holds StillDeadcode, rad and tpl.jinja. Stated once, on the era page that owns that payload; the swap page now links to it. - frank-medium-radiance-mxfp4: the 4.24/7 accept rate belongs to the DFlash2 arm measured on the FP8 target, not to the MXFP4 era; the 3-family soak run census is kept once (155 requests) instead of twice (~120 and 155). - Fleet shapes re-confirmed against the live endpoints before touching any page: 3x200000 fp8 KV, 2x200704, 2x262144. Index rows are regenerated, not hand-carved. Net -1,849 vault lines.
13 KiB
type, description, tags, timestamp
| type | description | tags | timestamp | ||||
|---|---|---|---|---|---|---|---|
| reference | Self-hosted job-search and resume tools: the landscape, local-LLM fit, and the recommended homelab stack. |
|
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:
- 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. - 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.
- 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-serverOpenAI-compatible endpoint (Reactive Resume and Resume Matcher consume it via base-URL override). - 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. - Raise Ollama's context to ~16k for resume/JD matching (the 4k default truncates long resume+JD prompts; don't go much higher).
- Networking: expose Ollama on the LAN (
OLLAMA_HOST); inside Docker on the same host usehttp://host.docker.internal:11434. - 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.
- 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.
- Never auto-submit. All the serious tools keep submission human by design. Mass auto-application burns standing with recruiters and ATS systems.
- Don't fork the CLI frameworks publicly for personal use (ai-job-search:
forks are public,
/setupwrites personal data into tracked files). - Protect stored secrets. JobSync: set
ENCRYPTION_KEY(openssl rand -base64 32) before adding API keys. Reactive Resume: AI credentials are encrypted server-side. - 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. - 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.
- Podman/Quadlet specifics: all Docker-compose stacks map directly to
Quadlet
.container/.networkunits 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 orhost.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