Career-Ops for beginners: Let an AI agent screen 700+ roles and generate 100+ tailored resumes

June 9, 2026

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):

ScenarioCommandWhat it does
Paste a JD URL/career-opsAutomated pipeline (evaluation + report + PDF + tracker)
Single evaluation/career-ops evaluateA-F scoring + 6-dimension analysis
Compare multiple/career-ops compareRank multiple offers
Scan roles/career-ops scan45+ preconfigured companies; run Ashby/Greenhouse/Lever APIs
Batch evaluation/career-ops batchRun concurrent claude -p workers
Generate PDF/career-ops pdfATS-optimized resume (Space Grotesk + DM Sans fonts)
Export to LaTeX/career-ops latexOverleaf-friendly .tex
Application tracking/career-ops trackerStatus overview
Fill application forms/career-ops applyAI-assisted form filling (doesn’t click Submit)
Deep research/career-ops deepCompany research
Interview preparation/career-ops interviewCompany-specific STAR+R stories
LinkedIn outreach/career-ops contactFind people + draft messages
Debrief mode/career-ops patternsRejection pattern analysis and strategy tweaks
Follow-up cadence/career-ops followupFollow-up schedule
Course/project evaluation/career-ops training / projectSelf-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:

ComponentRequirement
Node.js20+
AI programming CLIInstall at least one (Claude Code / OpenCode / Gemini CLI / Codex / Qwen / Copilot)
PlaywrightChromium browser (needed for PDF generation)
OSmacOS / Linux / Windows (WSL recommended)

Optional / enhancements:

ComponentUsed for
Go 1.21+Run the TUI Dashboard
Google AI Studio API KeyRun gemini-eval.mjs as a standalone script (free quota)
Chromium browserVerify whether an offer is still active (Playwright installs it automatically)
Various LLM API keysConnect 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:

  1. Is cv.md there? ✅
  2. Is config/profile.yml real (not .example)? ✅
  3. Is modes/_profile.md copied from _profile.template.md? ⚠️
  4. Is portals.yml real (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:

  1. Archetype detection — categorize into LLMOps / Agentic / PM / SA / FDE / Transformation
  2. A-F evaluation — 6 dimensions (Role summary / CV match / Level strategy / Comp research / Personalization / Interview prep)
  3. Generate report — write to reports/001-anthropic-2026-06-09.md
  4. Generate PDF — run Playwright rendering for an ATS resume; output to output/001-anthropic-cv.pdf
  5. Write to tracker — add a line to data/applications.md
  6. Update pipeline integrity — run node verify-pipeline.mjs to 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:

  1. Run 3–5 more evaluations; each time tell the agent “I don’t agree with this score because XX.”
  2. The agent will write what it learns into modes/_profile.md.
  3. 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.md or config/profile.yml. Don’t edit modes/_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:

  1. Reduce the batch size — run 10–20 at a time; don’t scan 100+ in one go.
  2. Local model fallback — structured tasks like ofertas (compare) / tracker / pdf can be swapped to local small models.
  3. 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 by modes/_shared.md (system). All your personalization from onboarding will survive 100 system updates. Recommended: read DATA_CONTRACT.md for the full picture.
  • Change archetypes: Tell the agent “change the archetypes to data engineering roles.” It will modify modes/_profile.md, not modes/_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.md accumulates 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”).

Updated June 9, 2026