← All reportsPublic report

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…)

68k stars JavaScript View on GitHubprofiled 11d ago
Try GitZoid
400PRs this week
104Contributors
4Deps scanned
0Issues found
01 · Repo overview

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

JavaScript (Node ESM .mjs)TypeScriptGoTSX/JSX (React)

Frameworks

PlaywrightNext.js 16React 19Tailwind CSS v4Bubble TeaLipgloss

Infrastructure

Docker (Dockerfile, docker-compose.yml)Nix flake (flake.nix/flake.lock)Local-first file-based storage (markdown/YAML tracker)Playwright Chromium (postinstall install)

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.

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.

03 · Security check

Dependencies and code review

4 dependencies scanned

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