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

13 KiB
Raw Blame History

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.
research
job-search
resume
self-hosted
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.

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