santifer/career-ops
Open-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)
How career-ops is put together
career-ops is an AI-agent-driven job search pipeline that turns AI coding CLIs (Claude Code, Codex, OpenCode, etc.) into a job-application command center. The core is a large set of standalone Node.js ESM (.mjs) CLI scripts orchestrated via npm scripts: portal scanners (Greenhouse/Ashby/Lever), LLM-based offer evaluation (A–H report blocks), ATS-tailored CV/cover-letter PDF generation via Playwright-rendered HTML, and a markdown-file 'single source of truth' application tracker with integrity/dedup/reconcile tooling. Two secondary frontends consume the same on-disk data: a Go Bubble Tea terminal dashboard that parses applications.md and shells out to node for PDF generation, and a local-first Next.js 16/React 19 web experience whose pages read fresh local files at request time (force-dynamic). There is no database; all state lives in tracked markdown/YAML/JSON files, with file locking for concurrent writes.
Languages
Frameworks
Infrastructure
Major components
Evaluation pipeline
Evaluates job offers into structured A–H reports (CV match, comp research, posting-legitimacy Block G, interview prep) via LLM runners (openrouter-runner.mjs, gemini-eval.mjs, ollama-eval.mjs, openai-eval.mjs) with batch sub-agent processing.
Portal & job scanner
Scans 100+ pre-configured company portals across Ashby/Greenhouse/Lever/Wellfound plus HN and Interamt sources (scan.mjs, scan-ats-full.mjs, discover-ats.mjs, company-funded.mjs) with portal health/validation checks.
CV/PDF generation
Builds ATS-optimized tailored CVs and cover letters as HTML rendered to PDF through Playwright Chromium (build-cv-html.mjs, generate-pdf.mjs, generate-cover-letter.mjs, cv-templates.mjs), plus LaTeX variants.
Application tracker (data layer)
Maintains a markdown single-source-of-truth tracker with add/merge/dedup/normalize/status operations, locking (pipeline-lock.mjs), integrity verification (verify-pipeline.mjs, cv-sync-check.mjs), and reporting/analytics scripts.
Terminal dashboard (Go)
A Bubble Tea TUI that parses applications.md, computes progress/stats metrics, previews reports, updates statuses atomically, opens URLs/PDFs, and shells out to node generate-pdf.mjs.
Web experience (Next.js)
A local-first Next.js 16 app with jobs/pipeline/apply/explore providers, a form-proxy Apply flow that headlessly opens employer forms, pre-fills answers from the CV, and lets the user submit manually (never auto-submits).
Scaffolder / installer
The @santifer/career-ops npm package (scaffolder/) providing a one-command bin/cli.mjs installer that scaffolds career-ops into a user's repo.
Update & self-maintenance system
update-system.mjs implements check/apply/rollback migrations with dedicated migration tests (updater-migration-tests.mjs, upgrade-tests.mjs), alongside doctor.mjs environment diagnostics.
A lighter week centered on community onboarding, safer command-line inputs, and several fixes that stop the web app from cutting evaluations short or hiding results.
4 weeksWeek of 2026-08-24
Week of 2026-08-24latest
A lighter week centered on community onboarding, safer command-line inputs, and several fixes that stop the web app from cutting evaluations short or hiding results.
Week of 2026-08-17
The busiest week of the month: two new job-board sources, a wave of command-line input validation, and fixes for salary parsing, repost detection, and translated documentation.
Week of 2026-08-10
A large hardening week: security safeguards against server-side request forgery, a new dashboard column showing how old each job posting is, and broad fixes for non-Latin text handling.
Week of 2026-08-03
A focused week adding zero-login job board providers, better cover letter and resume customization, and fixes so user-supplied text survives template processing intact.
Over the past month this job-application toolkit saw a steady push to make it work reliably for people outside the default setup: non-Latin (Chinese, Ukrainian, Hindi) names and text are now handled correctly across resumes, cover letters, deduplication, and matching, and dozens of small bugs were fixed so tools fail with clear messages instead of silently misbehaving. New features kept arriving too — more international job boards, a warm-intro finder from LinkedIn connections, a requisition-age column on the dashboard, and smarter title filtering. The final week was quieter, focused on polishing the community contribution process, tightening command-line input checks, and fixing web evaluation bugs.
Week by week
2026-08-24A lighter week centered on community onboarding, safer command-line inputs, and several fixes that stop the web app from cutting evaluations short or hiding results.latest6 changes
Feature
Warm-intro finder from LinkedIn connections
A new tool reads your exported LinkedIn connections and finds people who could introduce you at companies you're targeting.
Feature
Adoption ladder for quiet pull requests
The community now has a documented path for gently nudging stalled contributions forward instead of letting them sit unnoticed.
Fix
Evaluations no longer killed at 285 seconds
Web-based evaluations used to be cut off after about five minutes and then reported incorrectly; they now run to completion.
Fix
One bad employer no longer hides its whole board
If a single employer's listing failed evaluation, the entire board was being hidden from view — that's fixed.
Feature
Smarter job-title filtering with stem: prefix
A new prefix lets you match the core of a job title when plain keywords would match too many unrelated postings.
Fix
Non-Latin company logos stop colliding
Company logos for names in scripts like Chinese or Cyrillic were overwriting each other because of an overly simplistic name normalization.
2026-08-17The busiest week of the month: two new job-board sources, a wave of command-line input validation, and fixes for salary parsing, repost detection, and translated documentation.6 changes
Feature
Three more job board integrations
Job descriptions can now be pulled from recruitee, Ashby, and (opt-in) SmartRecruiters boards.
Feature
Singapore's national job bank added
MyCareersFuture, Singapore's government-run job portal, is now a supported source of listings.
Fix
Salary ranges like '50.000' parsed correctly
European-style salaries using a period as a thousands separator were being read as decimals, badly skewing pay figures.
Fix
Concurrent openings no longer flagged as reposts
Legitimate duplicate openings at the same company were being wrongly reported as recycled job posts.
Fix
LinkedIn postings finally get a real verdict
The liveness check gained a LinkedIn step so jobs posted there get an actual answer instead of none.
Docs
Translated READMEs restored to full accuracy
Eleven translated guides had lost their human-in-the-loop wording and were brought back in line with the English original.
2026-08-10A large hardening week: security safeguards against server-side request forgery, a new dashboard column showing how old each job posting is, and broad fixes for non-Latin text handling.6 changes
Fix
Security guard against SSRF attacks
The archive-posting feature now blocks requests aimed at private internal network addresses, closing a common attack vector.
Feature
POSTED column shows requisition age
The dashboard now displays how long each job has been posted, helping you spot stale listings at a glance.
Feature
Apply page gets navigation and tracking
You can now go back from the Apply page and record directly that you applied to a role.
Fix
Non-Latin job titles matched properly
Role matching now tokenizes titles written in Chinese, Japanese, and other scripts instead of failing on them.
Fix
Analytics stops shaming offer-holders
Users who already had an offer were being told they had zero interviews and nudged to try harder — that message is corrected.
Fix
Blanket write permissions blocked
No runtime tool is allowed to grant itself unrestricted file-write access anymore.
2026-08-03A focused week adding zero-login job board providers, better cover letter and resume customization, and fixes so user-supplied text survives template processing intact.6 changes
Feature
Three zero-auth job providers added
Listings can now be scanned from Getro, Consider, and joinup.ch without needing any account or API key.
Fix
Cover letters fail loudly on broken templates
An unresolved placeholder in a cover-letter template now causes an error rather than shipping the raw token into your letter.
Fix
Special characters in candidate text preserved
Dollar-sign patterns in your own resume or letter text no longer get mangled during template substitution.
Feature
Custom sign-off block for cover letters
You can now configure your own signature/closing section for generated cover letters.
Fix
Doctor flags API keys overriding subscriptions
The health-check tool warns when a paid API key is silently overriding your Claude subscription plan.
Fix
YC job seeds crawl all pages
Startup job seeding previously stopped after page one of Y Combinator's listings and now walks every page.
Dependencies and code review
Dependency advisories
Security Watch
No known advisories across 4 scanned dependencies.
No known advisories in the scanned dependencies.
Code review
No concrete code-level issues confirmed.
Get this report every week for your repos.
GitZoid learns each repo, reports what changed, and flags what needs attention. One flat price for the whole team.
$19 a month, flat · First 10 outputs free · No card required