Files
serverAppConfigs/serverAppConfigs-docs/Research/AI Job Search and Resume Tools.md
T
Frank a5fe045b58 docs(vault): one fact, one owner — repair the doubled pages, single-source the facts
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.
2026-10-19 05:00:43 -07:00

215 lines
13 KiB
Markdown
Raw 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