Career-Ops: The Repo That Turns Claude Code Into a Job-Search Operating System
A deep dive into the agentic skill router, ATS-safe PDF pipeline, and human-in-the-loop architecture that turns flat files into a candidate’s command center.
- Career-Ops is built around an inversion: Claude Code is treated as the operator, while the repository becomes the workspace, policy layer, and memory system.
- Its strongest trick is routing, not automation volume, because mode files and intent detection decide what the agent should do before any application is drafted.
- The ATS PDF pipeline shows the project’s real discipline by optimizing for legacy parsers without sacrificing human readability.
- Career-Ops is less a job-search app than a candidate-owned operating system that evaluates, generates, tracks, and reviews in one closed loop.
A Job Search, but the Agent Is in Charge
Career-Ops is not trying to be a nicer job board or a faster autofill tool. It treats the repository itself as the interface, with Claude Code reading instructions from files, choosing modes, and moving through a workflow that looks more like an operating system than a script collection.
That inversion is the point. Instead of a person driving software to churn out applications, the repo gives the model a workspace, a policy layer, and a memory layer, then asks the human to review the output before anything goes out the door.
I spent months applying to jobs the hard way. So I engineered the system I wish I had. Companies use AI to filter candidates. I gave candidates AI to choose companies. Now it's open source.
How the Skill Router Decides What Happens Next
The first interesting file is .claude/skills/career-ops/SKILL.md. It acts like a router, detecting whether a pasted URL, a job description, or a request for a specific task should trigger evaluation, PDF generation, or a different mode entirely.
That matters because the system is not one long prompt pretending to be software. It is a routing layer for agent intent, with shared context loaded first and narrower instructions layered on top when the task demands it.
# Routing idea, simplified
- If input is a URL or job post text, enter auto-pipeline
- If the task is PDF generation, load pdf mode
- If the task is application writing, load apply mode
- Always prepend shared context before task-specific instructions
- Keep the active context narrow so the agent stays focused
The design choice is subtle but powerful. Less context is not just cheaper. In this repo, less context is also a way to get better judgment from the model.
The Real Brain Lives in Markdown
Career-Ops pushes the idea of executable docs further than most repos do. The modes/ directory holds task-specific instructions in Markdown, while _shared.md acts as the common base layer that every mode inherits.
That means behavior is distributed across plain text files instead of hidden in a monolith. The agent is not just reading docs. It is effectively reading policy, and that policy is modular.
Why the System Refuses to Spray and Pray
This project is deliberately anti-volume. The scoring logic is built to filter hard, with a North Star metric and weighted dimensions that make the system recommend against weak fits instead of pushing every lead through the pipe.
That restraint is not a disclaimer bolted on for optics. It is part of the product logic, and it shapes what the agent is allowed to generate next.
| Category | What it optimizes for | What it does not do |
|---|---|---|
| Career-Ops | Selective evaluation and candidate fit | Mass submission by default |
| Auto-apply bots | Volume and speed | Human review or quality control |
| Resume tailoring tools | Document customization | End-to-end search orchestration |
| Job trackers | Organization and visibility | Scoring, generation, or agent routing |
Important: This is NOT a spray-and-pray tool. Career-ops is a filter -- it helps you find the few offers worth your time out of hundreds. The system strongly recommends against applying to anything scoring below 4.0/5. Your time is valuable, and so is the recruiter's. Always review before submitting.
ATS Optimization as a Systems Problem
The sharp technical detail here is the normalization layer in generate-pdf.mjs. It strips or replaces characters like smart quotes, zero-width spaces, and em-dashes so applicant tracking systems do not choke on polished typography.
function normalizeTextForATS(text) {
return text
.replace(/[“”]/g, '"')
.replace(/[‘’]/g, "'")
.replace(/—/g, '-')
.replace(/[\u200B-\u200D\uFEFF]/g, '');
}
That is the story in miniature. The document still needs to look good for people, but it also has to survive a machine path that rewards plain, boring, predictable text.
Markdown as a Database, Tracker as Memory
Career-Ops stores applications in Markdown, reports in Markdown, and configuration in YAML. That keeps the system inspectable, portable, and easy for both the human and the agent to read without a database server in the middle.
Then analyze-patterns.mjs turns those files into a post-mortem layer. It uses text extraction and regex-based parsing to look for correlations between role archetypes and outcomes, which means the repo can learn from its own history without leaving plain files behind.
Applications.md -> Reports/*.md -> Pattern extraction -> Outcome correlations -> Evaluation heuristics
This is where the repo starts to feel like memory, not just storage. The tracker is not a spreadsheet replacement. It is the state of the system.
What Career-Ops Is Really Competing With
Career-Ops does not belong in the same bucket as a single-purpose resume tool. It is closer to a stack that fuses evaluation, generation, tracking, and policy into one agent-native workspace.
| Tool category | Typical strength | Career-Ops difference |
|---|---|---|
| AI resume tailoring | Makes one resume fit one role | Builds the tailoring step into a broader decision loop |
| Auto-apply bot | Maximizes throughput | Rejects weak roles and requires review |
| Job search CRM | Tracks applications | Tracks, scores, generates, and learns from outcomes |
| General AI assistant | Flexible but loose | Scoped by modes, thresholds, and shared policy files |
That is why the most useful comparison is philosophical, not feature-by-feature. Career-Ops is not trying to win the auto-apply race. It is trying to change the shape of the race.
Why This Repo Matters Beyond Job Hunting
The broader lesson is bigger than recruiting. Career-Ops shows that a repo can become a skill surface for an LLM, that Markdown can serve as state, and that constrained agent systems can be more useful than open-ended chat.
If that pattern spreads, a lot of software will start looking less like apps and more like operating environments for model-driven work. Career-Ops is a strong early example of that shift.
The irony: the system demonstrates the exact competencies the target roles require — multi-agent architecture, automation, LLMOps, and HITL design. And no, it is not gaming the system: Career-Ops automates analysis, not decisions. I read every report and review every PDF before sending.