career-ops-hq/career-opsPublic

Open-source AI job search agent and job finder: scan job boards, score each job 1-5 against your CV before you apply, tailor an ATS-friendly resume and cover letter, get interview prep and a job application tracker. It helps you fill in each application; you press Submit. Runs locally in your AI coding CLI (Claude Code, Codex, OpenCode and more).

AI summary: A holistic toolset for tracking, optimizing, and strategically planning software engineering careers.

Stars
73.5K
+216 today
Forks
13.8K
Watchers
263
Open issues
232
Open PRs
163
Contributors
~486
Commits
2.6K
Branches
25

JavaScriptMITCreated Apr 4, 2026Last push todayLatest release career-ops-v1.35.0+631 stars this week+3.3K this month

Quick answers

What is career-ops?
A holistic toolset for tracking, optimizing, and strategically planning software engineering careers.
What does career-ops do?
Career Ops approaches personal career development with the rigorous methodology typically applied to software engineering operations. It provides a structured system to document accomplishments, track skill progression, and manage professional networks systematically. The project includes templates for brag documents, resume generation scripts, and strategic planning workflows. It integrates with Git to track contributions across various repositories, building a comprehensive portfolio automatically. By treating a career as an engineering project, it helps developers intentionally guide their professional growth rather than leaving it to chance.
Who is career-ops for?
Designed for software engineers, engineering managers, and technical professionals who want a structured approach to career growth. No specific prerequisites, though familiarity with Git and markdown is helpful.
How do I get started with career-ops?
git clone https://github.com/santifer/career-ops.git
How popular is career-ops on GitHub?
career-ops-hq/career-ops has 73,461 stars and 13,799 forks on GitHub, and gained 631 stars in the last 7 days.
What license does career-ops use?
career-ops-hq/career-ops is released under the MIT license.

Star history

since Jul 29, 2026
020K40K60KJul 2026Aug 2026Sep 2026Oct 2026
73.5K stars as of Oct 4, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Update history

2 recorded
  • Oct 4, 2026New release career-ops-v1.35.0 (previously career-ops-v1.34.0).
  • Oct 4, 2026Description changed from "Open-source AI job search agent: scan job portals, evaluate listings into a structured A-H report with a global 1-5 scor" to "Open-source AI job search agent and job finder: scan job boards, score each job 1-5 against your CV before you apply, ta".

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepOctMonWedFri2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 3 commits2026-04-05: 20 commits2026-04-06: 12 commits2026-04-07: 12 commits2026-04-08: 16 commits2026-04-09: 5 commits2026-04-10: 19 commits2026-04-11: 0 commits2026-04-12: 14 commits2026-04-13: 14 commits2026-04-14: 6 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 1 commit2026-04-18: 0 commits2026-04-19: 11 commits2026-04-20: 0 commits2026-04-21: 2 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 16 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 3 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 2 commits2026-05-04: 0 commits2026-05-05: 1 commit2026-05-06: 2 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 6 commits2026-05-13: 1 commit2026-05-14: 0 commits2026-05-15: 29 commits2026-05-16: 1 commit2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 5 commits2026-05-20: 1 commit2026-05-21: 0 commits2026-05-22: 6 commits2026-05-23: 1 commit2026-05-24: 0 commits2026-05-25: 2 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 5 commits2026-06-03: 4 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 6 commits2026-06-08: 1 commit2026-06-09: 25 commits2026-06-10: 13 commits2026-06-11: 35 commits2026-06-12: 10 commits2026-06-13: 3 commits2026-06-14: 0 commits2026-06-15: 7 commits2026-06-16: 4 commits2026-06-17: 9 commits2026-06-18: 24 commits2026-06-19: 3 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 18 commits2026-06-24: 7 commits2026-06-25: 14 commits2026-06-26: 12 commits2026-06-27: 2 commits2026-06-28: 10 commits2026-06-29: 41 commits2026-06-30: 7 commits2026-07-01: 11 commits2026-07-02: 28 commits2026-07-03: 19 commits2026-07-04: 27 commits2026-07-05: 14 commits2026-07-06: 25 commits2026-07-07: 32 commits2026-07-08: 11 commits2026-07-09: 2 commits2026-07-10: 41 commits2026-07-11: 12 commits2026-07-12: 3 commits2026-07-13: 23 commits2026-07-14: 23 commits2026-07-15: 19 commits2026-07-16: 43 commits2026-07-17: 9 commits2026-07-18: 3 commits2026-07-19: 3 commits2026-07-20: 27 commits2026-07-21: 23 commits2026-07-22: 7 commits2026-07-23: 7 commits2026-07-24: 2 commits2026-07-25: 2 commits2026-07-26: 0 commits2026-07-27: 54 commits2026-07-28: 35 commits2026-07-29: 25 commits2026-07-30: 35 commits2026-07-31: 18 commits2026-08-01: 0 commits2026-08-02: 15 commits2026-08-03: 7 commits2026-08-04: 51 commits2026-08-05: 2 commits2026-08-06: 0 commits2026-08-07: 37 commits2026-08-08: 5 commits2026-08-09: 1 commit2026-08-10: 12 commits2026-08-11: 30 commits2026-08-12: 41 commits2026-08-13: 32 commits2026-08-14: 34 commits2026-08-15: 7 commits2026-08-16: 3 commits2026-08-17: 32 commits2026-08-18: 39 commits2026-08-19: 7 commits2026-08-20: 70 commits2026-08-21: 42 commits2026-08-22: 16 commits2026-08-23: 4 commits2026-08-24: 1 commit2026-08-25: 34 commits2026-08-26: 61 commits2026-08-27: 22 commits2026-08-28: 29 commits2026-08-29: 6 commits2026-08-30: 6 commits2026-08-31: 21 commits2026-09-01: 18 commits2026-09-02: 66 commits2026-09-03: 29 commits2026-09-04: 13 commits2026-09-05: 56 commits2026-09-06: 16 commits2026-09-07: 9 commits2026-09-08: 9 commits2026-09-09: 3 commits2026-09-10: 2 commits2026-09-11: 7 commits2026-09-12: 6 commits2026-09-13: 7 commits2026-09-14: 15 commits2026-09-15: 9 commits2026-09-16: 7 commits2026-09-17: 28 commits2026-09-18: 27 commits2026-09-19: 3 commits2026-09-20: 1 commit2026-09-21: 25 commits2026-09-22: 28 commits2026-09-23: 26 commits2026-09-24: 33 commits2026-09-25: 87 commits2026-09-26: 16 commits2026-09-27: 13 commits2026-09-28: 25 commits2026-09-29: 6 commits2026-09-30: 26 commits2026-10-01: 39 commits2026-10-02: 18 commits2026-10-03: 55 commits2026-10-04: 15 commits2026-10-05: 0 commits2026-10-06: 0 commits2026-10-07: 0 commits2026-10-08: 0 commits2026-10-09: 0 commits2026-10-10: 0 commits
2,464 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Landmark project

    73,461 stars

  • Very active

    2,464 commits in 52 weeks

  • Community-driven

    ~486 contributors

  • Well documented

    High community health score

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

  • Repeat trending

    17 trending appearances

What career-ops does

Career Ops approaches personal career development with the rigorous methodology typically applied to software engineering operations. It provides a structured system to document accomplishments, track skill progression, and manage professional networks systematically. The project includes templates for brag documents, resume generation scripts, and strategic planning workflows. It integrates with Git to track contributions across various repositories, building a comprehensive portfolio automatically. By treating a career as an engineering project, it helps developers intentionally guide their professional growth rather than leaving it to chance.

Designed for software engineers, engineering managers, and technical professionals who want a structured approach to career growth. No specific prerequisites, though familiarity with Git and markdown is helpful.

  • Automated portfolio generation: Aggregates commits and PRs from GitHub to build a dynamic resume.
  • Brag document templates: Provides structured formats for recording key achievements for performance reviews.
  • Skill tracking dashboard: Visualizes proficiency levels across different technologies over time.
  • Network CRM: Acts as a lightweight CRM to manage professional contacts and mentorship relationships.
  • Goal setting workflows: Implements OKR-style tracking for personal career objectives.

Where teams use it

Performance review preparation

Helps engineers easily compile concrete data and achievements when asking for a promotion.

Job hunting

Automatically generates tailored resumes based on the specific skills required for different roles.

Continuous learning

Tracks progress on new technologies and suggests relevant resources based on career goals.

Professional networking

Manages follow-ups and maintains relationships with key industry contacts systematically.

Getting started: git clone https://github.com/santifer/career-ops.git

README

main branch

career-ops

The open-source AI job search agent.

English | Español | Deutsch | Français | Português (Brasil) | 한국어 | 日本語 | 简体中文 | 繁體中文 | Українська | Русский | Polski | Dansk | தமிழ் | العربية | हिन्दी | Türkçe

Santiago Fernández de Valderrama Aparicio  santifer

Months of sending CVs into silence.
So I built the filter I needed.

740 listings evaluated. 68 applied. 12 interviews. 1 offer.
I was its first user. I got the job. Then I open-⁠sourced it.

Paste a job. On your machine, it tells you if it's still open and if it fits.
It tailors your CV and drafts your answers. You press Submit.

The author's own search in the career-ops dashboard: scored listings, a red count of the ones marked do not apply, then a full evaluation report

My own search, partway through, with the UI in Spanish.

Companies use AI to filter candidates.
I just gave candidates AI to choose companies.

Six months later, I left that job.
Now we build career-ops, so you can land yours.

Try it on one job ↓ · Read the full story →


Hired with career-ops: public stories on the record

The people who came after me wrote down how they got hired.

Hired stories you can open and read

Every card is a public issue you can open. Landed yours? Leave your card →

⭐ If career-ops helped you, a star helps the next person find it.


WIRED      Business Insider

Vercel OSS Program

GitHub Trending: #1 repository of the day (Trendshift)      Featured on Product Hunt

Your turn

Paste one job you were about to apply to tonight. If it comes back do not apply, you just got the night back. If it comes back with a plan, you know what to do next.

npx @santifer/career-ops init

Open source. Local. In the AI CLI you already use. Free and local models included.

You don't have to search alone

The silence after you hit send is not about you. Enough people saw the same thing to write the practice down, in six lines:

Apply better to fewer. Signal over volume. Evidence over keywords. A human decides. Local-first. Dignity on both sides of the table.

The CareerOps manifesto: live count of signatories

A few of them, in their own words.

Three signatures of the CareerOps manifesto, in their own words

Every signature is a commit you can audit. Read them all, or add yours →


Hiring will not fix itself. The people going through it can, and they are already in the room, comparing notes and fixing each other's setups. This is where the fix gets written. A room, not a club. Let's build together.

Discord: live member count of the career-ops server

Sponsors

career-ops is free for candidates, forever. These companies sponsor the project:

SerpApi

SerpApi · Build a portfolio project with live search data. SerpApi gives developers structured JSON/Markdown from Google Search, Maps, Shopping, and other engines through a simple API call.

Sponsorship buys clearly labeled visibility, never influence: no amount of money changes the roadmap or places anything in the product. Sponsors never appear in evaluations, rankings or recommendations.

What career-ops does for you

Paste a job. It tells you whether that night is worth it.

  • Still open? It checks that the posting is still live before you write a word.
  • Not you? It scores the role against your real CV and tells you to skip a weak fit. You can override it.
  • Worth it? It drafts the CV, the cover letter and the answers. You read them. You send them.
  • Who do I talk to? It finds the person and drafts the note. It never sends it.
  • Where does it all go? Every application stays on your machine. Nothing is uploaded to us.
  • What should I learn? After a run of noes, it names the gap.

The first runs are rough. It does not know you yet. Talk to it: your CV, what you want, what you refuse. Think of it as a recruiter's first week.

On first launch it asks for all that in chat. Nothing to configure by hand.

What career-ops will not do

  • Auto-submit an application. It drafts the answer to every field; you review and click Submit. The script never POSTs (prepare-application.mjs).
  • Send an email. Drafts only. There is no mail transport anywhere in this codebase.
  • Phone home. No telemetry, no backend of ours. Your CV goes from your machine to the AI provider you chose, and nowhere else. The only public ledger is this repo: HIRED.md and its issues.
  • Push you to apply below 4.0/5. It will tell you not to. You can override it, and it will say so.

It reformulates your CV; it must never fabricate it. A check in code stops a PDF whose numbers or facts appear in neither your CV nor your article digest, but it cannot judge every rewording yet. Read every CV before you send it. Details in the FAQ.

Features

Feature Description
A-H Evaluation Role summary, CV match (with how much each requirement matters for this posting, and whether that weight came from the JD's own wording, its structure, or an estimate, labelled per requirement; an estimate can never be top-band), level strategy, comp research, personalization, interview prep (STAR+R) -- plus a Block G posting-legitimacy check (is it still open, is it a repost: observations, not verdicts), and a Work-Auth signal that flags an explicit no-sponsorship JD as a hard blocker
Human-in-the-Loop AI evaluates and recommends, you decide and act. The system never submits an application -- you always have the final call
ATS PDF Generation ATS-readable CVs tailored to each JD from your own experience, in Space Grotesk + DM Sans design
Cover Letter Generator Research-backed cover letters with keyword mirroring, four interactive angle prompts (why/problems/approach/tone), draft-in-chat approval gate, and A4 PDF via the same HTML + Playwright pipeline as CVs. Auto-drafts on every evaluation; complete and generate on demand via /career-ops cover
Beyond the CV Company research (deep) surfaces AI strategy, recent moves, engineering culture, and the angle your profile should take. Contact discovery (contacto) identifies the hiring manager, recruiter, or team peer worth reaching out to and drafts a ≤300-character LinkedIn message tuned to each contact type. Formal application email drafts (email) turn an evaluated report or pasted JD into a subject line, body, and attachment checklist without sending, submitting, or clicking anything. Applications get you in the queue; research gets you a conversation.
Pattern Analysis Rejection patterns and per-ATS-channel advance rates (analyze-patterns.mjs), lifetime funnel stats (stats.mjs), repost detection, a possible sign of a ghost job (detect-reposts.mjs)
Everything else it does
Feature Description
Auto-Pipeline Paste a URL, get a full evaluation + PDF + tracker entry
Interview Story Bank Accumulates STAR+Reflection stories across evaluations -- 5-10 master stories you can adapt to the behavioral questions you get
Negotiation Scripts Salary negotiation frameworks, geographic discount pushback, competing offer leverage
Application Email Drafts Formal recruiter/referral/cold application emails from a report or pasted JD, with subject line, attachment checklist, source-backed fit points, and a profile-driven contact block. Draft-only -- career-ops never sends, submits, or clicks anything.
Portal Scanner 100+ companies pre-configured (Anthropic, OpenAI, ElevenLabs, Retool, n8n...) + custom queries across Ashby, Greenhouse, Lever, Wellfound
Funded Company Discovery Review-first company:funded command surfaces recently funded companies and source diagnostics from structured public feeds without editing your data
Batch Processing Parallel evaluation with headless CLI workers (claude -p / opencode run)
Dashboard TUI Terminal UI to browse, filter, and sort your pipeline
Pipeline Integrity Automated merge, dedup, status normalization, health checks
Interview Suite Time-blocked prep plans, practice sessions with feedback, post-interview debriefs (interview/), and a company red-flag detector (interview-redflag)
Offer Stage Contract reading companion -- clause walk plus a lawyer question list (offer-prep) -- and a desired/advertised/actual salary-gap analyzer (salary-gap.mjs)
Follow-ups & Replies Follow-up cadence calculator and seeded reminders (followup-cadence.mjs, followup-seed.mjs); employer reply classification into tracker updates (reply-watch)
Plugin System Opt-in integrations (Gmail, Notion, Apify + a community registry), disabled by default -- see docs/PLUGINS.md

Quick Start

Fastest way, one command:

npx @santifer/career-ops init

💡 npx ships with Node.js: it runs the installer once, without installing anything globally. No Node yet? Install it first. (Already using a Claude Code / Gemini / Codex CLI? Then you already have it.)

This clones the latest release into ./career-ops and installs dependencies. Then:

cd career-ops
claude   # or codex / qwen / opencode / agy / grok — open your AI CLI here

On first launch, career-ops walks you through setup (your CV, profile and target roles) just by chatting. Nothing to edit by hand.

Prefer to set it up manually? (git clone)
git clone https://github.com/career-ops-hq/career-ops.git
cd career-ops && npm install
npx playwright install chromium   # only needed for PDF generation
# On a non-Debian/Ubuntu Linux distro (Fedora, Arch, ...), Chromium's system
# libraries aren't installed by the line above — install them yourself with
# your distro's package manager if PDF generation fails to launch the browser
# (Playwright's own docs list the required libraries per platform).

# 2. Check setup
npm run doctor                     # Validates all prerequisites

# 3. Configure
cp config/profile.example.yml config/profile.yml  # Edit with your details
cp templates/portals.example.yml portals.yml       # Customize companies

# 4. Add your CV
# Create cv.md in the project root with your CV in markdown

# 5. Open your AI CLI in this directory
claude   # or codex / opencode / qwen / agy / grok

# Then ask your CLI to adapt the system to you:
# "Change the archetypes to backend engineering roles"
# "Translate the modes to English"
# "Add these 5 companies to portals.yml"
# "Update my profile with this CV I'm pasting"

# 6. Start using
# Paste a job URL or JD text to trigger auto-pipeline
# If your CLI supports slash commands, use /career-ops (or its CLI-specific alias)
# In Codex, ask for the same mode in plain language, e.g.:
# "Run the career-ops scan mode"
# "Run the career-ops pipeline mode for data/pipeline.md"
# "Run the career-ops pdf mode for the latest evaluated role"
# "Run the career-ops tracker mode and summarize the current statuses"

Scanning through an outbound proxy

Node's ordinary fetch() may ignore HTTP_PROXY, HTTPS_PROXY and NO_PROXY in a proxy-only sandbox. Provider requests can use those variables with CAREER_OPS_TRUST_PROXY_EGRESS=1 node scan.mjs. This uses a request-scoped proxy dispatcher; unrelated requests are unaffected, and NO_PROXY destinations still use the local private-address guard.

Set this flag only when the configured proxy itself blocks connections to private, loopback and metadata addresses. When a proxy resolves the destination remotely, career-ops cannot verify that final address locally; the proxy must enforce that part of the SSRF boundary. Without this explicit trust setting, provider requests keep their normal direct transport and a DNS failure names the proxy setup needed. Proxy URLs containing credentials must use HTTPS; credential-free HTTP proxies remain supported. The flag requires Node.js 18.17 or newer. Existing installations keep direct transport after a system update; proxy environment variables alone do not enable it. Before enabling the flag, run npm install in the career-ops directory to install the added undici dependency. It is loaded only for an opted-in request with a configured proxy, so direct scanning continues to work even before that dependency is installed.

Global install

npm i -g @santifer/career-ops

This installs the career-ops binary globally so you can run it directly instead of via npx. Unlike npx @santifer/career-ops init (which bootstraps a project directory), the global install gives you a persistent career-ops command available anywhere in your terminal.

Which one should you use?

  • npx @santifer/career-ops init: best for first use; creates a dedicated project folder.
  • npm i -g @santifer/career-ops: best once you have a project folder and want to run career-ops commands directly.

The system is designed to be customized by your AI coding CLI itself. Modes, archetypes, scoring weights, negotiation scripts -- just ask it to change them. It reads the same files it uses, so it knows exactly what to edit.

See docs/SETUP.md for the full setup guide, docs/RUNNING_ON_A_BUDGET.md for instructions on running career-ops cheaply using custom or local models (and docs/FREE_TIER.md for running it at zero cost on Antigravity CLI's free tier), docs/AUTOMATION.md for scheduling recurring scans and a zero-token triage-to-shortlist recipe, docs/APPLY_AUTOFILL.md for details on the ATS auto-fill flow, docs/LINKEDIN_JOIN.md for cross-referencing a LinkedIn connections export against the companies in your funnel, and docs/FAQ.md for answers to common setup questions, including how story provenance prevents invented numbers. Design principles live in ARCHITECTURE.md; runtime flows in docs/ARCHITECTURE.md.

Usage

career-ops uses a shared command router. In CLIs that register slash commands, it looks like this:

/career-ops           → Show all available commands
/career-ops {JD}      → AUTO-PIPELINE: evaluate + report + PDF + tracker (paste text or URL)
/career-ops pipeline  → Process pending URLs from inbox (data/pipeline.md)
/career-ops oferta    → Evaluation only, blocks A to H (no auto PDF)
/career-ops ofertas   → Compare and rank multiple offers
/career-ops contacto  → LinkedIn power move: find contacts + draft message
/career-ops deep      → Deep research prompt about company
/career-ops interview-prep → Generate company-specific interview prep doc
/career-ops interview    → Interactive profile/CV onboarding interview
/career-ops master-profile → Import, review, and validate your Master Career Profile
/career-ops eu-swe    → Calibrate a European SWE application before CV/apply/interview
/career-ops interview/plan → Time-blocked prep plan for an upcoming interview
/career-ops interview/practice → Practice interview, one question at a time with feedback
/career-ops interview/debrief → Post-interview debrief: close gaps, predict next round
/career-ops interview-redflag → Analyze employer warning signs before joining a company
/career-ops pdf       → PDF only, ATS-optimized CV
/career-ops text      → Tailored markdown CV (mirrors cv.md, no PDF)
/career-ops latex     → Export CV as LaTeX/Overleaf .tex
/career-ops latex-tex → Tailor your own resume.tex in place (opt-in; cv.md stays default)
/career-ops cover     → Cover letter: standalone JD paste or /career-ops cover {slug}
/career-ops email     → Formal application email draft (draft-only; never sends, submits, or clicks)
/career-ops add       → Add a project/paper/role to your CV (fetch + preview + confirm)
/career-ops expand    → Auto-discover and add missing competencies from profile links
/career-ops training  → Evaluate course/cert against North Star
/career-ops project   → Evaluate portfolio project idea
/career-ops tracker   → Application status overview
/career-ops agent-inbox → Queue/drain requests for the next session (data/agent-inbox.md)
/career-ops apply     → Live application assistant (reads form + generates answers)
/career-ops scan      → Scan portals and discover new offers
/career-ops discover  → Resolve a company list to scannable ATS boards + append to portals.yml (zero-token)
/career-ops batch     → Batch processing with parallel workers
/career-ops patterns  → Analyze rejection patterns and improve targeting
/career-ops offer-prep → Read a received offer/contract with the candidate: clause walk + lawyer questions (not legal advice)
/career-ops titles    → Suggest adjacent job titles from your CV to broaden the search
/career-ops upskill   → Aggregate skill-gap analysis from your evaluated reports
/career-ops followup  → Follow-up cadence tracker: flag overdue, generate drafts
/career-ops reply-watch → Classify employer replies and suggest tracker updates
/career-ops outcome   → Record application outcome & archive artifacts
/career-ops calibrate → Advisory report: do your evaluation scores predict your real outcomes? Reads /outcome data; never changes scoring
/career-ops update    → Update career-ops system files with diff preview + compat check

Or just paste a job URL or description directly -- career-ops auto-detects it and runs the full pipeline.

In Codex, slash commands are not guaranteed. Use the same mode names in a prompt instead, or call them from codex exec.

How It Works

You paste a job URL or description
        │
        ▼
┌──────────────────┐
│  Archetype       │  Classifies: LLMOps / Agentic / PM / SA / FDE / Transformation
│  Detection       │
└────────┬─────────┘
         │
┌────────▼─────────┐
│  A-H Evaluation  │  Match, gaps, comp research, STAR stories, legitimacy
│  (reads cv.md)   │
└────────┬─────────┘
         │
    ┌────┼────┐
    ▼    ▼    ▼
 Report  PDF  Tracker
  .md   .pdf  entry

Antigravity CLI Integration

career-ops supports Antigravity CLI natively, the same way it supports Claude Code and OpenCode. All slash commands are available through the shared skill entrypoint, using the same modes/*.md evaluation logic.

Google has transitioned consumer Gemini CLI access to Antigravity CLI. GEMINI.md is now a no-op compatibility guard so Antigravity does not duplicate the full project instructions when it reads both AGENTS.md and GEMINI.md.

Native Antigravity CLI

# 1. Run in the career-ops directory
cd career-ops
agy

# 2. Use the unified /career-ops command with subcommands:
/career-ops "Senior AI Engineer at Anthropic..."
/career-ops pipeline
/career-ops scan
/career-ops pdf
/career-ops tracker

The skill is defined using the open standard in .agents/skills/career-ops/SKILL.md and symlinked/referenced for each supported CLI (e.g. .claude/, .cursor/, .qwen/, .antigravitycli/, .grok/).

Codex Integration

career-ops supports Codex through the same shared router, but the invocation model is different from CLIs that auto-register slash commands. For the full guide, see docs/CODEX.md.

Interactive Codex

cd career-ops
codex

Slash commands are not guaranteed in Codex. If /career-ops is unavailable, ask Codex to run the mode directly in plain language:

Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123
Run the career-ops scan mode and summarize new matches.
Run the career-ops pipeline mode for data/pipeline.md.
Run the career-ops pdf mode for the latest evaluated role.
Run the career-ops tracker mode and summarize the current statuses.

One-shot Codex (codex exec)

codex exec "Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123"
codex exec "Run career-ops scan mode in this repo and summarize new matches."
codex exec "Run career-ops pipeline mode for data/pipeline.md."
codex exec "Run career-ops pdf mode for the latest evaluated role."
codex exec "Run career-ops tracker mode and summarize the current statuses."

Grok Build CLI Integration

career-ops supports Grok Build CLI natively, the same way it supports Claude Code and OpenCode. AGENTS.md is auto-loaded as project rules, and all slash commands are available through the shared skill entrypoint.

Native Grok Build CLI

# 1. Run in the career-ops directory
cd career-ops
grok

# 2. Use the unified /career-ops command with subcommands:
/career-ops "Senior AI Engineer at Anthropic..."
/career-ops pipeline
/career-ops scan
/career-ops pdf
/career-ops tracker

For headless batch workers, use grok -p "prompt" (add --yolo to auto-approve tool executions).

Pi Integration

career-ops supports Pi natively, with no wrapper file to maintain: Pi reads AGENTS.md from the repo root as project context and discovers the shared skill at .agents/skills/career-ops/SKILL.md on its own. The router is then available as /skill:career-ops.

Native Pi

# 1. Run in the career-ops directory
cd career-ops
pi

# 2. Use the shared skill with subcommands:
/skill:career-ops "Senior AI Engineer at Anthropic..."
/skill:career-ops pipeline
/skill:career-ops scan
/skill:career-ops pdf
/skill:career-ops tracker

One-shot Pi (pi -p)

pi -p "Evaluate this JD with career-ops auto-pipeline: https://company.com/jobs/123"
pi -p "Run career-ops scan mode and summarize new matches."
pi -p "Run career-ops tracker mode and summarize the current statuses."

If a Pi build gates project resources behind a trust decision, run /trust once inside the repo and restart pi so the project skill loads (/trust applies to future Pi processes), or start with -a, which trusts a single run and needs no restart.

Standalone Gemini API Script (No CLI install needed)

# 1. Get a free API key at https://aistudio.google.com/apikey
cp .env.example .env
# Edit .env, set GEMINI_API_KEY=your_key_here

# 2. Install dependencies
npm install

# 3. Evaluate a job description
node gemini-eval.mjs "We are looking for a Senior AI Engineer..."
node gemini-eval.mjs --file ./jds/my-job.txt
node agent-inbox.mjs add "..."   # queue a request for the next session
npm run gemini:eval -- "JD text here"

Free tier: Both options work without billing. Native CLI uses Google OAuth; the API script uses gemini-3.6-flash (rate limits are model- and tier-dependent; see Google AI docs for current quotas).

Pre-configured Portals

The scanner comes with 100+ companies ready to scan and 35+ search queries across major job boards. Copy templates/portals.example.yml to portals.yml and add your own:

AI Labs: Anthropic, OpenAI, Mistral, Cohere, LangChain, Pinecone Voice AI: ElevenLabs, PolyAI, Parloa, Hume AI, Deepgram, Vapi, Bland AI AI Platforms: Retool, Airtable, Vercel, Temporal, Glean, Arize AI Contact Center: Ada, LivePerson, Sierra, Decagon, Talkdesk, Genesys Enterprise: Salesforce, Twilio, Gong, Dialpad LLMOps: Langfuse, Weights & Biases, Lindy, Cognigy, Speechmatics Automation: n8n, Zapier, Make.com European: Factorial, Attio, Tinybird, Clarity AI, Travelperk

Job boards searched: 55+ provider modules cover ATS APIs, board-wide feeds, XML/RSS feeds, markdown feeds, and local parsers. See Supported job boards for the full table.

By default node scan.mjs (a.k.a. npm run scan) trusts what each ATS feed returns. Some companies leave stale postings in their public API even after the role is closed, so those expired entries can leak into pipeline.md. Pass --verify to launch Playwright after the API pass and drop expired postings before they hit the pipeline:

node scan.mjs --verify          # zero-token discovery + Playwright liveness check

The verification is sequential and only runs against new offers (after dedup), so the cost stays bounded.

Dashboard TUI

The built-in terminal dashboard lets you browse your pipeline visually:

npm run serve:dashboard   # launch the TUI
npm run build:dashboard   # optional: build the standalone binary

Features: 6 filter tabs, 4 sort modes, grouped/flat view, lazy-loaded previews, inline status changes.

There is also an experimental web UI (alpha and opt-in: nothing runs unless you start it): see web/README.md.

Project Structure

career-ops/
├── AGENTS.md                    # Canonical agent instructions (all CLIs)
├── CLAUDE.md                    # Claude Code wrapper (imports AGENTS.md)
├── CODEX.md                     # Codex wrapper (imports AGENTS.md)
├── OPENCODE.md                  # OpenCode wrapper (imports AGENTS.md)
├── GEMINI.md                    # Legacy no-op guard to avoid Antigravity duplicate context
├── cv.md                        # Your CV (create this)
├── article-digest.md            # Your proof points (optional)
├── config/
│   └── profile.example.yml      # Template for your profile
├── modes/                       # Skill modes
│   ├── _shared.md               # Shared context (customize this)
│   ├── oferta.md                # Single evaluation
│   ├── pdf.md                   # PDF generation
│   ├── cover.md                 # Cover letter generation
│   ├── email.md                 # Formal application email drafts
│   ├── scan.md                  # Portal scanner
│   ├── batch.md                 # Batch processing
│   └── ...
├── templates/
│   ├── cv-template.html         # ATS-optimized CV template
│   ├── portals.example.yml      # Scanner config template
│   └── states.yml               # Canonical statuses
├── batch/
│   ├── batch-prompt.md          # Self-contained worker prompt
│   └── batch-runner.sh          # Orchestrator script
├── dashboard/                   # Go TUI pipeline viewer
├── data/                        # Your tracking data (gitignored)
├── reports/                     # Evaluation reports (gitignored)
├── output/                      # Generated PDFs (gitignored)
├── fonts/                       # Space Grotesk + DM Sans
├── docs/                        # Setup, customization, budget guide, architecture
└── examples/                    # Sample CV, report, proof points

External Data Directory (Optional)

By default, user-layer data (such as cv.md, portals.yml, and data/ / reports/ / output/ folders) lives inside the project root folder.

To separate your personal data from the code (making it easier to switch branches, pull updates, or test multiple profiles), you can configure an external data directory using the following precedence:

  1. Environment Variables: Set the CAREER_OPS_ROOT or CAREER_OPS_DATA_DIR environment variable:
    export CAREER_OPS_ROOT=~/my-career-data
  2. Marker File: Create a .career-ops-data file in the repository root containing the path to your data directory.
  3. Default: Defaults to the repository root.

Once resolved, all user files are resolved and written relative to that folder, while prompt files and scripts continue to resolve relative to the repository.

  • Tracker Override: You can also set CAREER_OPS_TRACKER to override the applications tracker file path directly.
  • Writes: All write operations (such as merges) canonically target {DATA_ROOT}/data/applications.md.
  • Scanner config: portals.yml is read and validated at {DATA_ROOT}/portals.yml, so node validate-portals.mjs checks the same file scan.mjs reads.
  • Generated documents: tailored CVs and cover letters are written under {DATA_ROOT}/output/, and the PDF manifest that links them to a report lives at {DATA_ROOT}/data/pdf-index.tsv. While CAREER_OPS_TRACKER is unset, the tracker workspace that bounds those writes is the data root, not the checkout.
  • PDFs under a tracker override: generate-pdf.mjs resolves CAREER_OPS_TRACKER before it derives the workspace, so with the override set the workspace is the folder that holds that tracker (or the folder above it, when the tracker sits in a data/ folder). The CV's HTML and every PDF must then sit inside that workspace, and the manifest moves to its data/pdf-index.tsv. Cover letters still target {DATA_ROOT}/output/, so they are refused when that folder falls outside the tracker's workspace.
  • Code layer stays put: node_modules/, providers/, modes/ and the scripts themselves always resolve against the repository, never the data root.

The Go dashboard TUI, Node.js scripts, and AI agent modes all automatically respect this resolution hierarchy.

Tech Stack

Claude Code Node.js Playwright Go Bubble Tea

  • Agent: AI coding CLI with shared skills and modes (AGENTS.md + CLI wrapper)
  • PDF: Playwright + HTML template
  • Cover letters: HTML template + Playwright (A4 PDF, same pipeline as CVs)
  • Scanner: Playwright + Greenhouse API + WebSearch
  • Dashboard: Go + Bubble Tea + Lipgloss (Catppuccin Mocha theme)
  • Data: Markdown tables + YAML config + TSV batch files

Latest release

Built with Claude Code

Also runs on any agent-skill-standard CLI. See Supported CLIs.
Claude Code OpenCode Antigravity CLI Codex Qwen Kimi GitHub Copilot Grok Build CLI Pi
Node.js Go Playwright Bubble Tea MIT Trademark Policy

Also Open Source

  • cv-santiago -- The portfolio website (santifer.io) with AI chatbot, LLMOps dashboard, and case studies. If you need a portfolio to showcase alongside your job search, fork it and make it yours.

FAQ

What is career-ops? career-ops (career-ops.org, also known as careerops) is an open-source AI job search that runs locally in your AI coding CLI (Claude Code, Codex, OpenCode and others) and leaves every decision to you. It evaluates job offers against your CV, generates ATS-tailored PDFs, finds the right person to contact, and tracks everything in one place: you always have the final call. It is the first reference implementation of the CareerOps Manifesto.

Can the tailored CV invent things? It must not, and the prompts say so: reformulate, never fabricate. generate-pdf blocks a CV whose numbers or facts are missing from your sources, unless you pass --skip-fact-check. It does not yet check job titles or judge rewording. Two open issues track that: #2677 (job titles must match cv.md) and #1411 (fail-closed faithfulness check). Until they merge, read every CV before you send it. The Legal Disclaimer says the same in longer words.

Can I run career-ops for free, or on a cheaper / local model? Yes. career-ops is CLI-agnostic and runs on free and local models (OpenRouter free models, Ollama or any OpenAI-compatible endpoint), so you are not tied to a paid subscription. See docs/RUNNING_ON_A_BUDGET.md for the full setup.

I pay for Claude Pro/Max but career-ops is burning API credits. Why? Because an ANTHROPIC_API_KEY in your environment takes precedence over your logged-in subscription: the CLI uses the key and bills per token. Run echo $ANTHROPIC_API_KEY, and if it prints anything, remove it from your shell profile, restart the terminal and run /login. Batch mode is the exception, since claude -p workers do not use the interactive login: run claude setup-token once and export the result as CLAUDE_CODE_OAUTH_TOKEN. Full walkthrough in docs/RUNNING_ON_A_BUDGET.md.

Which AI CLIs does career-ops work with? career-ops runs on any major AI coding CLI (Claude Code, Codex, Gemini / Antigravity, OpenCode, Grok, Qwen and more) through the open Agent Skill Standard, so it is never locked to a single vendor. Use the CLI you already have.

How do I install career-ops on Windows? career-ops runs on Windows. Platform-specific setup and the known sharp edges (Git Bash discovery, line endings, Task Scheduler) are in docs/WINDOWS.md. If skills fail to load with a symlink error during install, the fix is in docs/FAQ.md. Full steps are in docs/SETUP.md.

Does career-ops auto-apply to jobs for me? No. career-ops is a filter, not a spray-and-pray auto-applier. The AI evaluates, ranks and drafts; you review and decide. It drafts and fills; it never submits. You press Submit. That human-in-the-loop design is the whole point.

Is career-ops free and open source? Yes. career-ops is free and open source, and for the candidate it always will be. It is the first reference implementation of the CareerOps Manifesto. Read it, and if it says what you believe, sign it.

About the Author

I'm Santiago Fernández de Valderrama Aparicio (santifer), a former founder: I built and sold a business that still runs with my name on it. I built career-ops to manage my own job search, and it worked: it landed me a Head of Applied AI role. Six months later I left that role to focus on building career-ops full time.

Curious how a repo this size is maintained with a fleet of AI agents and a human deciding every merge? Read Agentic maintenance: how career-ops is run by a fleet of AI agents.

My portfolio and other open source projects → santifer.io

Wikidata: Santiago Fernández de Valderrama Aparicio · career-ops.

Disclaimer

career-ops is a local, open-source tool, NOT a hosted service. By using this software, you acknowledge:

  1. You control your data. Your CV, contact info, and personal data stay on your machine and are sent directly to the AI provider you choose (Anthropic, OpenAI, etc.). We do not collect, store, or have access to any of your data.
  2. You control the AI. The default prompts instruct the AI not to auto-submit applications, but AI models can behave unpredictably. If you modify the prompts or use different models, you do so at your own risk. Always review AI-generated content for accuracy before submitting.
  3. You comply with third-party ToS. You must use this tool in accordance with the Terms of Service of the career portals you interact with (Greenhouse, Lever, Workday, LinkedIn, etc.). Do not use this tool to spam employers or overwhelm ATS systems.
  4. No guarantees. Evaluations are recommendations, not truth. AI models may hallucinate skills or experience. The authors are not liable for employment outcomes, rejected applications, account restrictions, or any other consequences.

See LEGAL_DISCLAIMER.md for full details. This software is provided under the MIT License "as is", without warranty of any kind.

Contributors

Every person who has shipped code, docs, translations or tests is listed in CONTRIBUTORS.md, including non-code contributions, which the graph above cannot show.

Got hired using career-ops? Share your story!

License & Trademark

The code is licensed under MIT. The "career-ops" name and brand are governed by the Trademark Policy, permissive for community use, reserved for commercial product naming and endorsement.

Star history

Live star telemetry of career-ops-hq/career-ops

Created and maintained by Santiago Fernández de Valderrama Aparicio (@santifer)

Let's Connect

Website

Recent activity

commits and pull requests

Recent open issues

view all

Discussions

all 210

Releases and announcements

51 total
  1. web: v0.13.0web-v0.13.0Oct 1, 2026

    ## [0.13.0](https://github.com/career-ops-hq/career-ops/compare/web-v0.12.0...web-v0.13.0) (2026-10-01) ### Features * add Hermes Agent headless CLI support ([#4623](https://github.com/career-ops-hq/career-ops/issues/4623)) ([a6b867a](https://github.com/career-ops-hq/career-ops/commit/a6b867adbc634cb61cc103ac8af350932878baf3)) * **cli:** register Pi as a supported CLI host ([#4157](https://github.com/career-ops-hq/career-ops/issues/4157)) ([#4157](https://github.com/career-ops-hq/career-ops/issues/4157)) ([74c5d17](https://github.com/career-ops-hq/career-ops/commit/74c5d178a631540a9966122fef29db02b28918dc)) * **explorer:** free banded title-vs-profile fit hint on discovery cards ([#3261](https://github.com/career-ops-hq/career-ops/issues/3261)) ([b080539](https://github.com/career-ops-hq/career-ops/commit/b0805395cc8d462bc9a6a36c0b2ea8921c522e50)) * **ui:** stream matched job cards into results during scan ([#4200](https://github.com/career-ops-hq/career-ops/issues/4200)) ([78e13ca](https://github.com/career-ops-hq/career-ops/commit/78e13ca707a567d2d6b2dc5df5c65828104ee20a)) * **web:** add city or location filter to Explore ([#4397](https://github.com/career-ops-hq/career-ops/is

  2. career-ops v1.35.0: The Wider Netcareer-ops-v1.35.0Oct 1, 202614 downloads

    <!-- co:release-notes:career-ops-v1.35.0 --> This release widens where career-ops looks: nine new job sources, from the applicant systems of US school districts to OCC Mundial in Mexico. It carries work from 86 people, 50 of them contributing for the first time. ### Highlights - **Nine new job sources.** AppliTrack, NEOGOV, Red Rover and SchoolSpring, used by US K-12 districts and community colleges, by @raymondwilliamskc (#4360). HiringRoom by @cRolandoJr (#4460), OCC Mundial by @VictorMeneses77 (#3748), and Eploy, PeopleSoft Candidate Gateway and PrevueAPS by @Schlaflied (#4055, #3739, #3919). BambooHR, already supported, is now part of the full scan (`scan:full`), by @ilyakanevskiy (#4365). - **A master career profile you review fact by fact.** `node career-profile.mjs import --review` reads your CV and lets you approve, edit or skip each fact; only approved facts are saved, and `validate` checks the result. Also available as `/career-ops master-profile`. By @Kilaa13 (#4456). - **CV details.** An optional professional title under your name by @Zoubeir23 (#3763), an optional one-line `context` for each experience entry by @lesiashu (#4049), and a guard that stops `generate-pdf`

  3. web: v0.12.0web-v0.12.0Sep 24, 2026

    ## [0.12.0](https://github.com/career-ops-hq/career-ops/compare/web-v0.11.0...web-v0.12.0) (2026-09-24) ### Features * **web:** resizable assistant panel and a composer that grows with its content ([#4258](https://github.com/career-ops-hq/career-ops/issues/4258)) ([8be08ce](https://github.com/career-ops-hq/career-ops/commit/8be08ce362d45556b12bb659fd66360cd409ebb3)) ### Bug Fixes * run the web test suite on the minimum supported Node ([#4065](https://github.com/career-ops-hq/career-ops/issues/4065)) ([533a4a8](https://github.com/career-ops-hq/career-ops/commit/533a4a8dc0802fffc5a87afb3d380776bde6da14)) * **web/explore:** honest, configurable scan timeout with partial results ([#4191](https://github.com/career-ops-hq/career-ops/issues/4191)) ([220ecd8](https://github.com/career-ops-hq/career-ops/commit/220ecd876bcb49152068ecc098f55e5be0f8b542)) * **web:** a failed atomic write leaves a full copy of cv.md behind, unignored ([#3245](https://github.com/career-ops-hq/career-ops/issues/3245)) ([#3246](https://github.com/career-ops-hq/career-ops/issues/3246)) ([2d37f77](https://github.com/career-ops-hq/career-ops/commit/2d37f77fb6b29db1c43970e39df5f5f918ddc7e6)) * **web:** add verti

  4. career-ops v1.34.0: The Quiet Updatecareer-ops-v1.34.0Sep 24, 202634 downloads

    <!-- co:release-notes:career-ops-v1.34.0 --> This is the first release since I started working on career-ops full time. The update prompt now shows up only when a new version is actually out. Until now, almost any change landing on `main` could trigger it, often every day. This release also carries work from 63 people, 43 of them contributing for the first time. ### Highlights - **Update prompts only for new versions.** `update-system.mjs` installs the latest published release instead of `main`, `check` asks only when a newer release exists, and saying no lasts until the next version instead of forever. Tracking `main` stays available with `--channel main`. Built on @obielin's release resolution in #3845. - **Fewer live offers marked as closed.** Liveness now checks company pages with a Greenhouse `gh_jid`, SmartRecruiters, Arbeitsagentur and We Work Remotely through their public APIs (#4444), and a careers page that loads its ATS in an iframe is no longer read as a dead posting (#4439), both by @luochen211. - **Sharper scans.** Domain-level detection of aggregator reposts by @vaishaldsouza (#4263), an opt-in strict location filter that fails closed on empty locations by @Zoubeir

  5. web: v0.11.0web-v0.11.0Sep 16, 2026

    ## [0.11.0](https://github.com/career-ops-hq/career-ops/compare/web-v0.10.0...web-v0.11.0) (2026-09-16) ### Features * **web:** opt-in origin allowlist for the local dashboard API ([#3597](https://github.com/career-ops-hq/career-ops/issues/3597)) ([0754973](https://github.com/career-ops-hq/career-ops/commit/075497329a55d7c1e5184cfffb21fd0efeaf13ba)) ### Bug Fixes * **tracker:** resolve addition columns by name so score and status cannot transpose ([00b0296](https://github.com/career-ops-hq/career-ops/commit/00b0296c6071eb955f38404e60a10ceaccad45b5)) * **url-key:** preserve existing fragment comparison params ([02e632e](https://github.com/career-ops-hq/career-ops/commit/02e632e634280ef7224ec268279adbbe9f0650ce)) * **url-key:** preserve hash-route posting identity ([52f314c](https://github.com/career-ops-hq/career-ops/commit/52f314cd268bd0b2de56b71ba236ce288138dac0)) * **url-key:** preserve hash-route posting identity ([965fff3](https://github.com/career-ops-hq/career-ops/commit/965fff30149eff1da2f6b1a937ca3738260b9a2e)) * **web:** detect a real tailored CV/cover on disk, not just the tracker flag ([0fb2080](https://github.com/career-ops-hq/career-ops/commit/0fb2080db1a5c90b365

Code frequency

additions and deletions
+48.6K-48.6KWeek of 2026-03-29: +6,259 linesWeek of 2026-03-29: -12 linesWeek of 2026-04-05: +11,014 linesWeek of 2026-04-05: -1,168 linesWeek of 2026-04-12: +2,513 linesWeek of 2026-04-12: -242 linesWeek of 2026-04-19: +1,933 linesWeek of 2026-04-19: -327 linesWeek of 2026-04-26: +739 linesWeek of 2026-04-26: -206 linesWeek of 2026-05-03: +681 linesWeek of 2026-05-03: -1,003 linesWeek of 2026-05-10: +3,179 linesWeek of 2026-05-10: -858 linesWeek of 2026-05-17: +3,034 linesWeek of 2026-05-17: -406 linesWeek of 2026-05-24: +6 linesWeek of 2026-05-24: -2 linesWeek of 2026-05-31: +1,137 linesWeek of 2026-05-31: -47 linesWeek of 2026-06-07: +11,707 linesWeek of 2026-06-07: -1,538 linesWeek of 2026-06-14: +6,310 linesWeek of 2026-06-14: -518 linesWeek of 2026-06-21: +7,534 linesWeek of 2026-06-21: -404 linesWeek of 2026-06-28: +48,615 linesWeek of 2026-06-28: -1,643 linesWeek of 2026-07-05: +35,897 linesWeek of 2026-07-05: -11,140 linesWeek of 2026-07-12: +7,244 linesWeek of 2026-07-12: -958 linesWeek of 2026-07-19: +10,231 linesWeek of 2026-07-19: -782 linesWeek of 2026-07-26: +38,807 linesWeek of 2026-07-26: -2,646 linesWeek of 2026-08-02: +12,108 linesWeek of 2026-08-02: -1,177 linesWeek of 2026-08-09: +28,038 linesWeek of 2026-08-09: -2,671 linesWeek of 2026-08-16: +40,262 linesWeek of 2026-08-16: -3,356 linesWeek of 2026-08-23: +27,893 linesWeek of 2026-08-23: -8,668 linesWeek of 2026-08-30: +36,698 linesWeek of 2026-08-30: -2,411 linesWeek of 2026-09-06: +6,811 linesWeek of 2026-09-06: -778 linesWeek of 2026-09-13: +6,683 linesWeek of 2026-09-13: -763 linesWeek of 2026-09-20: +37,319 linesWeek of 2026-09-20: -8,543 linesWeek of 2026-09-27: +48,428 linesWeek of 2026-09-27: -3,152 linesWeek of 2026-10-04: +7,386 linesWeek of 2026-10-04: -621 linesMar 29, 2026Oct 4, 2026
+448.5K lines added, -56K removed over the last year.

Commits per week

last 52 weeks
2160Week of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 3 commitsWeek of 2026-04-05: 84 commitsWeek of 2026-04-12: 35 commitsWeek of 2026-04-19: 13 commitsWeek of 2026-04-26: 19 commitsWeek of 2026-05-03: 5 commitsWeek of 2026-05-10: 37 commitsWeek of 2026-05-17: 13 commitsWeek of 2026-05-24: 2 commitsWeek of 2026-05-31: 9 commitsWeek of 2026-06-07: 93 commitsWeek of 2026-06-14: 47 commitsWeek of 2026-06-21: 53 commitsWeek of 2026-06-28: 143 commitsWeek of 2026-07-05: 137 commitsWeek of 2026-07-12: 123 commitsWeek of 2026-07-19: 71 commitsWeek of 2026-07-26: 167 commitsWeek of 2026-08-02: 117 commitsWeek of 2026-08-09: 157 commitsWeek of 2026-08-16: 209 commitsWeek of 2026-08-23: 157 commitsWeek of 2026-08-30: 209 commitsWeek of 2026-09-06: 52 commitsWeek of 2026-09-13: 96 commitsWeek of 2026-09-20: 216 commitsWeek of 2026-09-27: 182 commitsWeek of 2026-10-04: 15 commitsOct 12, 2025Oct 4, 2026
2.5K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 3 commitsSun 1:00 — 4 commitsSun 2:00 — 3 commitsSun 3:00 — 1 commitsSun 4:00 — 5 commitsSun 5:00 — 3 commitsSun 6:00 — 6 commitsSun 7:00 — 6 commitsSun 8:00 — 20 commitsSun 9:00 — 12 commitsSun 10:00 — 22 commitsSun 11:00 — 10 commitsSun 12:00 — 7 commitsSun 13:00 — 20 commitsSun 14:00 — 12 commitsSun 15:00 — 13 commitsSun 16:00 — 4 commitsSun 17:00 — 0 commitsSun 18:00 — 4 commitsSun 19:00 — 6 commitsSun 20:00 — 7 commitsSun 21:00 — 3 commitsSun 22:00 — 4 commitsSun 23:00 — 5 commitsMon 0:00 — 9 commitsMon 1:00 — 2 commitsMon 2:00 — 4 commitsMon 3:00 — 1 commitsMon 4:00 — 5 commitsMon 5:00 — 8 commitsMon 6:00 — 1 commitsMon 7:00 — 3 commitsMon 8:00 — 5 commitsMon 9:00 — 26 commitsMon 10:00 — 16 commitsMon 11:00 — 15 commitsMon 12:00 — 11 commitsMon 13:00 — 21 commitsMon 14:00 — 16 commitsMon 15:00 — 20 commitsMon 16:00 — 36 commitsMon 17:00 — 26 commitsMon 18:00 — 32 commitsMon 19:00 — 29 commitsMon 20:00 — 23 commitsMon 21:00 — 9 commitsMon 22:00 — 22 commitsMon 23:00 — 15 commitsTue 0:00 — 14 commitsTue 1:00 — 6 commitsTue 2:00 — 15 commitsTue 3:00 — 16 commitsTue 4:00 — 23 commitsTue 5:00 — 8 commitsTue 6:00 — 9 commitsTue 7:00 — 14 commitsTue 8:00 — 11 commitsTue 9:00 — 13 commitsTue 10:00 — 23 commitsTue 11:00 — 31 commitsTue 12:00 — 32 commitsTue 13:00 — 27 commitsTue 14:00 — 22 commitsTue 15:00 — 11 commitsTue 16:00 — 23 commitsTue 17:00 — 31 commitsTue 18:00 — 12 commitsTue 19:00 — 23 commitsTue 20:00 — 33 commitsTue 21:00 — 8 commitsTue 22:00 — 16 commitsTue 23:00 — 8 commitsWed 0:00 — 8 commitsWed 1:00 — 14 commitsWed 2:00 — 7 commitsWed 3:00 — 16 commitsWed 4:00 — 9 commitsWed 5:00 — 13 commitsWed 6:00 — 7 commitsWed 7:00 — 9 commitsWed 8:00 — 7 commitsWed 9:00 — 15 commitsWed 10:00 — 13 commitsWed 11:00 — 24 commitsWed 12:00 — 20 commitsWed 13:00 — 21 commitsWed 14:00 — 39 commitsWed 15:00 — 23 commitsWed 16:00 — 26 commitsWed 17:00 — 14 commitsWed 18:00 — 10 commitsWed 19:00 — 17 commitsWed 20:00 — 30 commitsWed 21:00 — 7 commitsWed 22:00 — 11 commitsWed 23:00 — 6 commitsThu 0:00 — 9 commitsThu 1:00 — 12 commitsThu 2:00 — 16 commitsThu 3:00 — 12 commitsThu 4:00 — 10 commitsThu 5:00 — 4 commitsThu 6:00 — 6 commitsThu 7:00 — 10 commitsThu 8:00 — 11 commitsThu 9:00 — 21 commitsThu 10:00 — 27 commitsThu 11:00 — 19 commitsThu 12:00 — 15 commitsThu 13:00 — 32 commitsThu 14:00 — 31 commitsThu 15:00 — 37 commitsThu 16:00 — 24 commitsThu 17:00 — 30 commitsThu 18:00 — 22 commitsThu 19:00 — 39 commitsThu 20:00 — 21 commitsThu 21:00 — 17 commitsThu 22:00 — 8 commitsThu 23:00 — 21 commitsFri 0:00 — 10 commitsFri 1:00 — 14 commitsFri 2:00 — 11 commitsFri 3:00 — 13 commitsFri 4:00 — 12 commitsFri 5:00 — 10 commitsFri 6:00 — 10 commitsFri 7:00 — 34 commitsFri 8:00 — 10 commitsFri 9:00 — 12 commitsFri 10:00 — 21 commitsFri 11:00 — 33 commitsFri 12:00 — 30 commitsFri 13:00 — 43 commitsFri 14:00 — 29 commitsFri 15:00 — 20 commitsFri 16:00 — 22 commitsFri 17:00 — 37 commitsFri 18:00 — 22 commitsFri 19:00 — 13 commitsFri 20:00 — 30 commitsFri 21:00 — 7 commitsFri 22:00 — 12 commitsFri 23:00 — 11 commitsSat 0:00 — 16 commitsSat 1:00 — 9 commitsSat 2:00 — 7 commitsSat 3:00 — 10 commitsSat 4:00 — 4 commitsSat 5:00 — 4 commitsSat 6:00 — 5 commitsSat 7:00 — 3 commitsSat 8:00 — 14 commitsSat 9:00 — 10 commitsSat 10:00 — 8 commitsSat 11:00 — 14 commitsSat 12:00 — 29 commitsSat 13:00 — 7 commitsSat 14:00 — 18 commitsSat 15:00 — 8 commitsSat 16:00 — 10 commitsSat 17:00 — 8 commitsSat 18:00 — 3 commitsSat 19:00 — 3 commitsSat 20:00 — 11 commitsSat 21:00 — 7 commitsSat 22:00 — 13 commitsSat 23:00 — 4 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Jul 3, 2026daily#10+13
Jun 10, 2026daily#24+18
Jun 9, 2026daily#19+20
Jun 7, 2026daily#15+82
Apr 21, 2026daily#16+102
Apr 20, 2026daily#24+95
Apr 17, 2026daily#23+87
Apr 16, 2026daily#22+109
Apr 13, 2026daily#22+126
Apr 12, 2026daily#18+292
Apr 11, 2026daily#15+344
Apr 10, 2026daily#10+317
Apr 9, 2026daily#4+545
Apr 8, 2026daily#2+978
Apr 7, 2026daily#3+1,102
  • public-apis/public-apis

    A collective list of free APIs

    486.1K stars · Python

  • jwasham/coding-interview-university

    A complete computer science study plan to become a software engineer.

    362.3K stars

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    272.8K stars · JavaScript

  • NousResearch/hermes-agent

    The agent that grows with you

    251.2K stars · Python

  • react/react

    The library for web and native user interfaces.

    250.9K stars · JavaScript

  • n8n-io/n8n

    Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

    206.7K stars · TypeScript