One-line summary: If you’re already using Claude Code to write code, why not use it to help you get hired? Career-Ops turns an AI programming CLI into a job-search command center — paste a JD URL, automatically evaluate it, generate ATS-friendly resumes, and track progress. The author personally screened 740+ offers, generated 100+ tailored resumes, and ultimately landed an offer as Head of Applied AI.
Project overview
Career-Ops (a.k.a. careerops) is an AI-driven job-hunting pipeline. GitHub: santifer/career-ops, MIT License. Its core idea is:
Turn any AI programming CLI into a complete job-search command center.
It’s not “yet another AI resume-rewriting tool,” and it’s not a bulk-application bot. Career-Ops is built around the philosophy of doing less: out of hundreds of offers, it helps you filter to the few that are genuinely worth applying to, using A-F scoring, 6 major evaluation dimensions, ATS-optimized PDF output, and fully automated tracking.
Core capabilities (15 slash commands):
| Scenario | Command | What it does |
|---|---|---|
| Paste a JD URL | /career-ops | Automated pipeline (evaluation + report + PDF + tracker) |
| Single evaluation | /career-ops evaluate | A-F scoring + 6-dimension analysis |
| Compare multiple | /career-ops compare | Rank multiple offers |
| Scan roles | /career-ops scan | 45+ preconfigured companies; run Ashby/Greenhouse/Lever APIs |
| Batch evaluation | /career-ops batch | Run concurrent claude -p workers |
| Generate PDF | /career-ops pdf | ATS-optimized resume (Space Grotesk + DM Sans fonts) |
| Export to LaTeX | /career-ops latex | Overleaf-friendly .tex |
| Application tracking | /career-ops tracker | Status overview |
| Fill application forms | /career-ops apply | AI-assisted form filling (doesn’t click Submit) |
| Deep research | /career-ops deep | Company research |
| Interview preparation | /career-ops interview | Company-specific STAR+R stories |
| LinkedIn outreach | /career-ops contact | Find people + draft messages |
| Debrief mode | /career-ops patterns | Rejection pattern analysis and strategy tweaks |
| Follow-up cadence | /career-ops followup | Follow-up schedule |
| Course/project evaluation | /career-ops training / project | Self-improvement paths |
Supported AI programming CLIs: Claude Code / OpenCode / Gemini CLI / Codex / Qwen / GitHub Copilot / Kimi — as long as it follows open agent skill standard.
Multilingual support: Default is English. Also available: German (modes/de/) / French (modes/fr/) / Japanese (modes/ja/) / Turkish (modes/tr/) / Simplified Chinese (README.cn.md) / Traditional Chinese (README.zh-TW.md).
Track record: The author santifer used it to evaluate 740+ offers, generate 100+ tailored resumes, and ultimately received an offer for Head of Applied AI.
Difficulty / time / outcomes
- Difficulty: ⭐⭐ (moderate; you need to be comfortable using an AI programming CLI like Claude Code)
- Time: 30–60 minutes for first onboarding (including cv.md prep + profile configuration)
- Outcomes:
- Get a real, end-to-end AI job-search pipeline working
- Understand the agent architecture design: “User Layer vs System Layer”
- Learn to do precise job hunting using A-F scoring + STAR+R stories
- See how to assemble an open-source AI agent project that’s been covered by WIRED / Business Insider
- Bonus: pick up 15 slash commands and use them every day during your job search
Target audience
- Developers who are currently job hunting / switching jobs / exploring opportunities
- Already using Claude Code / OpenCode / Gemini CLI
- Want to switch from “spray-and-pray” to “apply precisely,” and don’t want to waste time on junk offers
- Want to see what a production-grade AI agent project with 7k+ stars looks like
TIP
The most expensive thing during the job-search period is tokens. Career-Ops batch mode screening 10+ offers is very satisfying, but running 100 offers through the Claude/Anthropic official API can easily land you in the $20–40 per night range; four figures per month in token cost is pretty normal.
My setup (sharing, not recommending): I use Defapi, using an Anthropic-compatible protocol. You just change the base URL in one line:
# Assuming you use Claude Code, edit in ~/.claude/settings.json or in env
ANTHROPIC_BASE_URL=https://api.defapi.org
ANTHROPIC_API_KEY=sk-xxxxx # Get it from the defapi.org dashboard
Defapi’s models are basically compatible with all three common protocols — v1/chat/completions (OpenAI) / v1/messages (Anthropic) / v1beta/models (Gemini) — no code changes on the agent side. Evaluation prompts, STAR stories, and tracker schemas all stay the same. It’s the same model; you just buy it more cheaply, and your monthly token bill can be cut in half immediately. We’ll expand on this in FAQ Q5.
Core dependencies and environment
Minimum requirements:
| Component | Requirement |
|---|---|
| Node.js | 20+ |
| AI programming CLI | Install at least one (Claude Code / OpenCode / Gemini CLI / Codex / Qwen / Copilot) |
| Playwright | Chromium browser (needed for PDF generation) |
| OS | macOS / Linux / Windows (WSL recommended) |
Optional / enhancements:
| Component | Used for |
|---|---|
| Go 1.21+ | Run the TUI Dashboard |
| Google AI Studio API Key | Run gemini-eval.mjs as a standalone script (free quota) |
| Chromium browser | Verify whether an offer is still active (Playwright installs it automatically) |
| Various LLM API keys | Connect to Claude / OpenAI / Anthropic protocols |
TIP
You don’t necessarily need a Claude Max subscription. Career-Ops is “LLM-protocol driven.” As long as the API supports v1/messages or v1/chat/completions, it can be plugged in (see the TIP after the “Target audience” section above for the exact setup).
Complete project structure tree
career-ops/
├── AGENTS.md # Agent common instructions (across CLIs)
├── CLAUDE.md # Claude Code specific (imports AGENTS.md)
├── GEMINI.md # Gemini CLI specific
├── cv.md # Your resume (created by you; key file)
├── article-digest.md # Your proof of highlights (optional)
├── config/
│ └── profile.example.yml # Your personal profile template
├── modes/ # 15 skill modes
│ ├── _shared.md # Shared system-layer context
│ ├── _profile.template.md # User-layer customization (put your personal archetype here)
│ ├── oferta.md # Single-offer evaluation
│ ├── pdf.md # PDF generation
│ ├── scan.md # Role scanning
│ ├── batch.md # Batch processing
│ ├── auto-pipeline.md # URL → evaluation + PDF + tracker
│ ├── de/ # German mode
│ ├── fr/ # French mode
│ ├── ja/ # Japanese mode
│ └── tr/ # Turkish mode
├── templates/
│ ├── cv-template.html # ATS-optimized CV template
│ ├── cv-template.tex # LaTeX template
│ ├── portals.example.yml # 45+ preconfigured companies
│ └── states.yml # Application status dictionary
├── data/ # Application data (gitignored)
│ ├── applications.md # Main tracking table
│ ├── pipeline.md # Inbox for pending URLs
│ ├── scan-history.tsv # Scan de-duplication
│ └── follow-ups.md # Follow-up history
├── reports/ # Evaluation reports (gitignored)
├── output/ # Generated PDFs (gitignored)
├── jds/ # JD text stored here (optional)
├── interview-prep/ # Interview preparation
│ ├── story-bank.md # Accumulated STAR+R stories
│ └── {company}-{role}.md # Company-specific intel
├── batch/
│ ├── batch-prompt.md # Worker prompt
│ ├── batch-runner.sh # Orchestration script
│ └── tracker-additions/ # Items to merge into the main tracking table
├── dashboard/ # Go TUI (Bubble Tea)
│ ├── main.go
│ └── internal/
├── fonts/ # Space Grotesk + DM Sans
├── providers/ # LLM provider configuration
├── docs/ # Multilingual docs + media coverage
├── examples/ # Sample CV / reports / highlights
└── *.mjs # Scripts for scanning / verification / merging / health checks
As a user, you only need to touch four files: cv.md / config/profile.yml / modes/_profile.md / portals.yml — that’s your User Layer. System updates won’t change them. Everything else is handled by the agent.
Step-by-step instructions
Step 1: Clone + install
git clone https://github.com/santifer/career-ops.git
cd career-ops
npm install
npx playwright install chromium # needed for PDF generation
WARNING
Do not skip npx playwright install chromium. Later, /career-ops pdf uses Playwright rendering. If Chromium is missing, you’ll get a “browser not found” error.
Step 2: Run health check
npm run doctor
It will verify the Node.js version, Playwright, key files, and directory permissions. If it fails, the “doctor” will tell you what’s missing — fix it, then run again.
Step 3: Create your cv.md
This is the source of the entire pipeline — without it, the agent can’t evaluate offers.
Create cv.md in the project root:
# Your Name
**Email:** [email protected]
**Location:** Berlin, Germany (CET)
**LinkedIn:** linkedin.com/in/you
**GitHub:** github.com/you
## Summary
Senior backend engineer with 6 years building distributed systems...
(Target: 2–3 paragraphs; write what you do + your strongest one or two things)
## Experience
### Staff Engineer — Company A (2023 - Present)
- Led migration of X to Y, reducing Z by 40%
- (Try to include numbers; this section will be used by the agent to match the JD)
### Senior Engineer — Company B (2020 - 2023)
- ...
## Education
...
## Skills
Backend: Go, Python, PostgreSQL, Kafka
AI/ML: PyTorch, LangChain, RAG
...
TIP
Don’t want to write it yourself? After launching Claude Code, tell it things like “I’ll paste my old resume” / “Here’s my LinkedIn URL” / “I’ll describe it and you help me write it.” The agent will convert it into cv.md. The README includes prompts for three onboarding paths.
Step 4: Configure config/profile.yml
cp config/profile.example.yml config/profile.yml
Open config/profile.yml and fill in:
personal:
name: "Your Name"
email: "[email protected]"
location: "Berlin, Germany"
timezone: "CET"
targeting:
roles:
- "Senior Backend Engineer"
- "Staff Engineer"
- "AI Platform Engineer"
comp_target:
base_min: 130000
base_target: 160000
currency: "EUR"
remote_preference: "remote-first"
deal_breakers:
- "no on-call"
- "no Java"
- "no < 20 person startups"
# If you want to use Chinese / German / French / Japanese / Turkish modes, add this line
# language:
# modes_dir: modes/de
WARNING
Do not manually edit modes/_shared.md. System updates will overwrite it. Any personal archetype, negotiation talk track, compensation targets — write all of that to modes/_profile.md or config/profile.yml. This is the Data Contract rule emphasized repeatedly in the README.
Step 5: Configure portals.yml
cp templates/portals.example.yml portals.yml
By default it includes 45+ companies and 19 search queries, covering:
# AI Labs
- anthropic
- openai
- mistral
- cohere
# Voice AI
- elevenlabs
- vapi
- deepgram
# AI Platforms
- retool
- airtable
- vercel
- temporal
If you want to add companies you’re specifically targeting, add them to portals.yml. Job board coverage includes Ashby / Greenhouse / Lever / Wellfound / Workable / RemoteFront.
Step 6: Have the agent “Onboard” you
# Choose one of the AI CLIs you installed
claude # Claude Code
# or
gemini # Gemini CLI
# or
opencode # OpenCode
# or
codex # Codex
In the CLI, say:
Help me set up career-ops. I just cloned it — cv.md and config/profile.yml are filled in.
Please check whether my onboarding is complete, and what else I should add.
The agent will run a boot check:
- Is
cv.mdthere? ✅ - Is
config/profile.ymlreal (not.example)? ✅ - Is
modes/_profile.mdcopied from_profile.template.md? ⚠️ - Is
portals.ymlreal (not.example)? ✅
Any ❌ will put you into guided mode, prompting you step-by-step, one-on-one.
TIP
On the first run, the agent will proactively ask: “What’s one career achievement you’re most proud of? What are your deal-breakers? What’s your superpower?” — spend 5 minutes answering carefully. This will be written into modes/_profile.md, and the accuracy of later evaluation scores depends entirely on it. It’s like onboarding a new recruiter in your first week; in the second week it understands you better than most human recruiters.
Step 7: First evaluation
Paste a JD URL to the agent:
/career-ops https://jobs.anthropic.com/staff-software-engineer-applied-ai
The agent runs a fully automated pipeline:
- Archetype detection — categorize into LLMOps / Agentic / PM / SA / FDE / Transformation
- A-F evaluation — 6 dimensions (Role summary / CV match / Level strategy / Comp research / Personalization / Interview prep)
- Generate report — write to
reports/001-anthropic-2026-06-09.md - Generate PDF — run Playwright rendering for an ATS resume; output to
output/001-anthropic-cv.pdf - Write to tracker — add a line to
data/applications.md - Update pipeline integrity — run
node verify-pipeline.mjsto check
You should see, after 30–60 seconds, a complete evaluation report plus an ATS resume PDF.
WARNING
Your first evaluation score won’t be accurate. The system doesn’t know you yet, so it may give high or low scores. Don’t worry: run 3–5 evaluations, then tell the agent based on the results “This score is too high, because XX” / “I never mentioned I have XX experience.” The agent will learn and write it into modes/_profile.md. The more you use it, the more precise it becomes.
Step 8: First scan
/career-ops scan
Or equivalently:
node scan.mjs # zero tokens; pure API fetch
node scan.mjs --verify # API + Playwright second verification; filters expired roles
With 45+ preconfigured companies and 19 search queries, one scan typically yields 200–500 new roles, directly adding them to the inbox data/pipeline.md. Then claude -p workers run evaluations concurrently — processing 100+ offers in one night is not a dream.
Step 9: Run the TUI dashboard (optional)
If you want to view progress in a terminal UI:
cd dashboard
go build -o career-dashboard .
./career-dashboard --path ..
It has 6 filter tabs, 4 sorting modes, grouped/flat views, lazy-loaded previews, and selecting an item changes its status. Catppuccin Mocha theme — it looks great.
Step 10: Update the system (important!)
Career-Ops iterates fast; new modes and company configs come out every few weeks.
# In the project root, ask the agent to check
claude # tell it: "check whether there are new career-ops versions"
The agent will automatically run node update-system.mjs check and output JSON like this:
{"status": "update-available", "local": "1.3.0", "remote": "1.4.0", "changelog": "..."}
It will tell you: “v1.3.0 → v1.4.0 is available. Your data (CV / profile / tracker / reports) won’t be touched. Do you want to update?” To update:
node update-system.mjs apply # update
node update-system.mjs rollback # roll back if you’re unhappy
Common troubleshooting
Q1: cv.md not found / agent stuck on onboarding
The most common reason is that cv.md isn’t placed in the project root:
# confirm it’s in the root
ls -la cv.md
# you should see something like -rw-r--r-- cv.md
# if it’s missing, create it (in the project root)
cd career-ops
touch cv.md
# then fill in the content
Q2: PDF generation fails: "browser not found"
Playwright isn’t installed, or Chromium wasn’t installed:
npx playwright install chromium
# if you’re in China and the network is slow, you can add a mirror
PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright npx playwright install chromium
Q3: Evaluation scores are too high / too low
This happens in the first week. Fix it by:
- Run 3–5 more evaluations; each time tell the agent “I don’t agree with this score because XX.”
- The agent will write what it learns into
modes/_profile.md. - Pay special attention to what’s been filled in
modes/_profile.md: your compensation floor, remote preference, role positioning, and reverse cases.
Important: Put personalized content into
modes/_profile.mdorconfig/profile.yml. Don’t editmodes/_shared.md— system updates will overwrite the latter.
Q4: WebSearch / WebFetch verification accuracy
Not accurate. Career-Ops has an internal rule: you must verify offers with Playwright to confirm they’re still active:
# use slash command; internally it runs Playwright
/career-ops verify --url <JD_URL>
In batch mode (
claude -p), Playwright isn’t available, so it will be marked**Verification:** unconfirmed (batch mode). You’ll need to manually review.
Q5: Batch evaluation token usage explodes
If you evaluate 100+ offers, token bills can easily exceed $20 in one night. There are three ways to fix it:
- Reduce the batch size — run 10–20 at a time; don’t scan 100+ in one go.
- Local model fallback — structured tasks like
ofertas(compare) /tracker/pdfcan be swapped to local small models. - Get a half-price API by using Defapi — protocol-compatible; it uses the same model as the official side, so your monthly bill is cut dramatically in half (see the TIP after the “Target audience” section for the specific configuration).
Q6: Switching to German / French / Japanese / Turkish modes
# 1. Edit config/profile.yml
language:
modes_dir: modes/de # or fr / ja / tr
Or simply tell the agent: “Run in German mode.” The agent will switch to the evaluation logic under modes/de/ (including localized DACH-market terms like 13. Monatsgehalt / Probezeit / AGG / Tarifvertrag).
WARNING
After switching to modes/de/, your applications to English roles will also run German evaluations. Unless you only apply to German roles, keep the default English mode and switch manually only when applying to German roles.
Q7: Tracker status fields contain dirty formatting like **Applied**
Tracker statuses were bolded manually. Fix it:
node normalize-statuses.mjs # normalize statuses
node dedup-tracker.mjs # de-duplicate
node verify-pipeline.mjs # health check
After that, edit templates/states.yml to add canonical statuses.
Further reading / advanced directions
- User Layer vs System Layer: This is the most interesting engineering design in Career-Ops —
modes/_profile.md(user) is never overwritten bymodes/_shared.md(system). All your personalization from onboarding will survive 100 system updates. Recommended: readDATA_CONTRACT.mdfor the full picture. - Change archetypes: Tell the agent “change the archetypes to data engineering roles.” It will modify
modes/_profile.md, notmodes/_shared.md. - Multilingual switching: When applying to DE/FR/JP/TR roles, switch to
modes/{de,fr,ja,tr}/; evaluation logic will be localized automatically (local terms like CDI / 賞与 / commuting allowance). - TUI dashboard advanced: The dashboard is written in Go + Bubble Tea + Lipgloss, with a Catppuccin Mocha color scheme. Source is in
dashboard/internal/. If you want custom filters/sorting, just edit it. - STAR+R story bank:
interview-prep/story-bank.mdaccumulates your “Situation + Task + Action + Result + Reflection” stories across evaluations. After 3–5 evaluations, you’ll have 5–10 stories that can handle almost any behavioral interview question. - Fork the portfolio companion: The author’s portfolio is also open source — santifer/cv-santiago — with an AI chat bot + an LLMOps board + case studies. Fork it and customize it as your own.
GitHub repo: santifer/career-ops. Multilingual docs are in README.{cn,es,ja,ko-KR,pt-BR,ru,ua,zh-TW}.md. The design philosophy is explained in DATA_CONTRACT.md. Media coverage is in docs/press/. The roadmap is in ROADMAP.md (if you can’t find it in the repo, ask the agent: “show me your roadmap”).