--- 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 ` (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