career-ops: the job filter that stops at the Submit button
career-ops turns AI coding CLIs such as Claude Code into a job-search command center, scanning job portals, scoring listings on an A-F rubric, and tailoring CVs.
At a glance
- What is it?
- An MIT-licensed agent that runs inside an AI coding CLI, scores each listing against your CV on a one to five scale, and drafts an application you are expected to send yourself. The install is one npx command.
- Who is it for?
- Adopt career-ops if your bottleneck is volume rather than wording, and put one of the free API keys in place before judging it. Do not adopt it expecting an application sender: the README says you press Submit and that the contact note is never sent, so the final click is yours and stays yours.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.
Star history
- santifer/career-ops82,398 ★ · +20,405
| Repository | 2026-07-28 | 2026-11-13 |
|---|---|---|
| santifer/career-ops | 62k | 82.4k |
20,405 Stars in the last 108 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
init asks who you are before it reads a single listing
Installation is one command (npx @santifer/career-ops init). Every later judgement is a comparison against your real CV, so an underspecified CV produces confident wrong skips rather than obvious failures. The unit of work is deliberately small: paste one job you were about to apply to tonight, and the expected result is a yes or no on whether that night was worth spending, not a search pipeline run on your behalf.
The rubric is called A-F in one place and A-H in another
Scoring is the core output, and the repository describes it two different ways. The project description frames the evaluation as a structured A-F rubric resolved into a 1.0 to 5.0 score. The package.json at version 1.38.0 describes the same step as a structured A-H report with a 1-5 score. For a reader this is not cosmetic. If you are comparing two shortlisted jobs you need the grade to mean the same thing in both reports, and the metadata will not tell you which set to expect. Open a real generated report and read the grade legend before you trust a skip. The number is between one and five under either description; it is the letters attached to it that differ.
prepare-application.mjs drafts every field and never POSTs
The refusal to send anything is specific and checkable rather than a promise in a manifesto. The README says the tool drafts the CV, the cover letter and the answers, and that you press Submit.
npx @santifer/career-ops initThe README says the contact note is drafted but never sent. Read together, these constraints define the product boundary: the tool does everything up to the irreversible action and nothing after it. The consequence for a job seeker is that the last thirty seconds of an application, the part where a wrong field or a typo earns a rejection, is the part this project cannot help with at all.
A weak fit is a skip you can override, not a verdict you cannot
Two of the documented behaviours are a refusal and an escape hatch. When a listing scores badly against your real CV, the tool tells you to skip a weak fit, and you can override that call. Finding someone to talk to is handled the same way: it locates the person and drafts the note, then stops. That is the design in a single sentence. The risk to watch is the override running the other way. A one to five score produced by a model reading a CV against a job description is a model output rather than a measurement, and a profile written in a hurry during the first launch will generate confident skips that do not deserve trust. Override the first few.
SerpApi sponsors the project and is excluded from the ranking
SerpApi is the project's named sponsor, described as giving developers structured JSON and Markdown from search, maps and shopping engines through a simple API call. The project draws the boundary in writing: sponsorship buys clearly labeled visibility, never influence, no amount of money changes the roadmap or places anything in the product, and sponsors never appear in evaluations, rankings or recommendations.
Local means your machine, not a free model in the cloud
Running locally does not mean running keyless. The documented setup copies an example environment file and fills in values, and the free path still needs an account somewhere.
cp .env.example .envGemini is the default route, with a rate-limited free tier on gemini-3.6-flash and gemini-3.5-flash plus gemini-2.5-pro listed as alternatives. OpenRouter is offered with a free tier of hundreds of models at zero cost. The README also points to "Free and local models included" in docs/RUNNING_ON_A_BUDGET.md.
The container exists because Chromium will not install everywhere
The Docker path is not packaging convenience, it is a workaround for a named host failure. The image is built on the Playwright base at version 1.64.1 jammy with Chromium already present, because the browser ships inside the image and runs under the image's userland instead of the host's. The compose file keeps a long-running shell so that exec is instant, gives the container one gigabyte of shared memory for Chromium, and holds node_modules in a named volume to avoid a host and container mismatch. It also records which host caused the problem: Ubuntu 26.04, where Playwright will not install. Two release trains also run in parallel, web v0.16.0 and career-ops v1.38.0, both tagged on 2026-10-23, with the last push on 2026-11-02, so any version reference has to say which train you mean.
Editorial conclusion
Adopt career-ops if your bottleneck is volume rather than wording, and put one of the free API keys in place before judging it. Do not adopt it expecting an application sender: the README says you press Submit and that the contact note is never sent, so the final click is yours and stays yours. The first thing to verify is the grade set in a real report, since the repository description calls it A-F and package.json calls it A-H.
Frequently asked questions
How does career-ops decide whether a job is worth applying to?
You paste a job description. It checks that the posting is still live, scores the role against your real CV to decide whether the fit is worth the night, and then drafts the CV, the cover letter and the answers. You read them and you send them.
How do you install career-ops?
Through npx, run in the AI coding CLI you already use, such as Claude Code, Codex, OpenCode or Antigravity.
Does career-ops need a paid API key to run?
Not necessarily. The project points to free and local models, and the example environment file documents a rate-limited free tier on Gemini plus an OpenRouter free tier with hundreds of models at zero cost. The README also mentions free and local models.
What is career-ops, in short?
An MIT-licensed open source job search agent that scans job portals, evaluates listings into a structured report with a one to five score, tailors your CV and tracks applications. It runs locally inside an AI coding CLI, and the project is free for candidates.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/santifer-career-ops)[](https://hysenlabs.com/projects/santifer-career-ops)Star history chart for your README
[](https://hysenlabs.com/projects/santifer-career-ops)Was this useful?