docs: OKF v0.1 compliance pass + fact-check + 3 research briefs
- Migrate all 127 non-reserved docs to OKF v0.1 frontmatter (type/description/tags/timestamp); fix 13 YAML issues, 2 duplicate-FM blocks, strip reserved-page FM - Restructure log.md to OKF (## YYYY-MM-DD, newest-first) - Fact-check against scripts/AGENTS.md ground truth: fix 6 false 'Active' banners on retired runbooks, 96->114 GiB GTT, deployment.md vs deploy-plan.py/deploy-remote.sh, Deployment Flow frank-medium=Quadlet, Calibre 9.9.0->9.15.0 + CVE-2025-7404 conflation, Copyparty v1.20.24, RomM 5.3.0 breaking change - Move *arr docs to new FrankBook-Pro/ section (git mv, link-safe) - Write active runbook bodies from ground truth (frank-large, frank-small) - Add 3 research briefs + HTML report: Local TTS and Voice Cloning, AI Job Search and Resume Tools, Most Popular Self-Hosted AI Apps (Jun-Sep 2026) - Add upstream-version rows to ComfyUI/OpenWebUI/Hermes app docs - All 336 tests pass; 136 pages, 0 unresolved wikilinks
This commit is contained in:
1 parent
24f7a7772d
commit
93d1181fee
103 files changed
+2047
-4329
No files matched your search
@@ -0,0 +1,214 @@
|
||||
---
|
||||
type: research
|
||||
description: "Self-hosted AI job-search and resume-formatting applications: the 2026 landscape, local-LLM fit, and a 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
|
||||
Reference in new issue
Block a user