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.

8-10 min read • View on GitHub • More from santifer

A wide editorial scene shows a human hand near a control desk while a mechanical arm sorts job listings, scoring sheets, and a PDF page. A file cabinet labeled modes feeds the workflow, with a ledger beside it to suggest memory and tracking. The image explains how the repository acts like an operating system for an agent rather than a simple job-search app.
Career-Ops makes Claude Code feel less like a chat window and more like an operator sitting inside a repo-defined workspace.
Key Takeaways

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.

Santiago Fernández de Valderrama Aparicio, Creator of Career-Ops · GitHub - santifer/career-ops: AI-powered job search system built on ...

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.

The closed loop is the real product: route, evaluate, approve, render, track, learn.

# 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.

CategoryWhat it optimizes forWhat it does not do
Career-OpsSelective evaluation and candidate fitMass submission by default
Auto-apply botsVolume and speedHuman review or quality control
Resume tailoring toolsDocument customizationEnd-to-end search orchestration
Job trackersOrganization and visibilityScoring, 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.

Santiago Fernández de Valderrama Aparicio, Creator of Career-Ops · GitHub - santifer/career-ops

ATS Optimization as a Systems Problem

A close-up shows a resume page passing through a narrow conversion press. On the left, the page contains elegant typography and special Unicode characters. In the middle, tiny blades and filters strip out smart quotes, em dashes, and invisible characters. On the right, the page emerges as a clean ATS-safe document. The image explains how the repository preserves design for humans while normalizing text for machine parsers.
The PDF engine does not just export a file. It makes a document legible to brittle legacy systems.

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 categoryTypical strengthCareer-Ops difference
AI resume tailoringMakes one resume fit one roleBuilds the tailoring step into a broader decision loop
Auto-apply botMaximizes throughputRejects weak roles and requires review
Job search CRMTracks applicationsTracks, scores, generates, and learns from outcomes
General AI assistantFlexible but looseScoped 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.

Santiago Fernández de Valderrama Aparicio, Creator of Career-Ops · Career-Ops: How I Built My Own AI Job Search Tool