Releases: santifer/career-ops
career-ops: v1.12.0
1.12.0 (2026-06-18)
Features
- batch: add --status and --watch progress monitoring to batch-runner.sh (#922) (#966) (802552f)
- cli: add Antigravity CLI compatibility (61de18d)
- i18n: add Chinese language modes for China-market job seekers (#934) (#965) (207f960)
- pdf: render Japanese CVs with a lang="ja" CJK font fallback (#1053) (d0d57d1)
- providers: add Jobstreet and Glints providers for the Indonesian market (728d547), closes #1085
- providers: add RemoteOK, Remotive, Working Nomads, IBM board providers (349bacc), closes #1075
- providers: port Arbeitsagentur to an in-process provider (#1095) (504a2f0)
- scan: add content/description filter for providers (#974) (21d6c86)
Bug Fixes
- ashby: include secondaryLocations so EU-eligible roles surface (a84d3f5), closes #1073
- batch: reconcile pipeline.md inbox after batch runs (#712) (34c3d0e)
- dashboard: archetype regex matches English and Spanish reports (#977) (d619d3b)
- dashboard: open Windows targets without shell (#987) (6dc36fb)
- dashboard: report last-contact in calendar days, not hours-since-midnight (#1057) (4e05cfd)
- followup: resolve report path relative to tracker directory (752f3b9), closes #1070
- followup: use the real application date from notes, not the eval date (#1096) (#1097) (53785c8)
- gemini: validate evaluation report shape (#819) (a0aa264)
- latex: language-agnostic section validation + CJK guard (#1054) (b147504)
- merge-tracker: require company match for number-based dedup (2bb514f), closes #912
- pdf: auto-install Playwright chromium after update (eb504ad)
- pdf: use ATS-safe system fonts for clean CV text extraction (17033e8), closes #1074
- pipeline: add batch liveness sweep for unconfirmed entries (#750) (#973) (e9eba87)
- scan: sanitize external metadata before writes (#1098) (61bad36)
- security: harden local-parser against command/arg injection and scan-ats against SSRF (721f1a8)
- tracker: preserve notes column when rewriting rows without a trailing pipe (#1004) (0569518)
- update: materialize skill entrypoints without symlinks (#1067) (3ef63c8)
- updater: git-safety on abort + preserve user files on safety-violation rollback (#915) (#1099) (deef636)
career-ops: v1.11.0
1.11.0 (2026-06-15)
Features
- add first-class OpenCode support alongside Claude Code (#707) (2710fbe)
- cover: add optional salutation/greeting to cover letters (#1010) (99346c1)
- cover: load _profile.md so personalization governs the letter (#1012) (dff56d3)
- doctor: warn when Playwright MCP tools are not configured (#938) (0222224)
- tracker: map tracker columns by header name (#954) (57b34c0)
- tracker: SQLite derived index over applications.md — phase 1 (#919) (5465f16)
Bug Fixes
- cv: align certification org column width across rows (#931) (e27b051)
- deps: update npm dependencies to v1.61.0 (#1023) (5407247)
- eval: gate dead links before evaluation in oferta and auto-pipeline (#937) (ebf9a13)
- generate-pdf: inline local fonts as data: URLs so they actually embed (#952) (08d1e9a)
- merge-tracker: serialize concurrent tracker merges with a filesystem lock (#941) (0d57994)
- pdf: wait for load instead of networkidle during render (#929) (fd2ce04)
- remove story-bank.md from git tracking (#944) (67662b9)
- skill: surface latex mode in command menus (#928) (2803348)
- tests: run tracker-mutating scripts with --dry-run in script checks (#925) (1acf27d)
- tracker: prevent dedup from deleting distinct same-company roles (#950) (98b32a4)
- update: distribute missing runtime paths (#991) (85ae717)
- update: match Release Please component-prefixed tags in version check (#926) (6f0e289)
- update: rebuild dashboard binary after Go source changes (#953) (5382d37)
- update: use target updater manifest during apply (#983) (539e47b)
career-ops: v1.10.0
career-ops v1.10.0 — the community week
This release is different from any before it.
In the span of a few days, this project merged work from more than 20 different contributors — including a dozen first-timers. Career-ops now speaks its first right-to-left language, interviews you instead of asking you to write config files, writes your cover letters, runs inside Docker on locked-down machines, and recovers gracefully when your AI session hits its limits mid-batch. Almost none of it was written by me. That's the whole point of this project.
✨ Highlights
New capabilities
- 🇸🇦 Full Arabic support — career-ops's first RTL language, with real right-to-left engineering in the PDF template (mirrored layout, Arabic-capable font stack), not just translated strings (#764)
- 🎤 Interactive interview onboarding —
career-ops interviewbuilds your profile and CV by asking you questions, instead of requiring you to writecv.mdfirst (#909) - ✉️ Cover letter mode — the most-requested missing piece, rendered through the existing PDF pipeline with zero new dependencies (#807)
- 🐳 Docker support — run the full pipeline (Playwright included) on hosts where native installs are blocked (#625)
- 💰 Salary filtering in the zero-token scanner — conservative by design: jobs without salary data always pass (#677)
- 🔭 Reverse ATS discovery —
scan:fullsweeps public ATS APIs (Greenhouse, Lever, Ashby, and now Workday) to find matching roles across companies you haven't configured (#746) - 🛡️ Apply preflight gate — before drafting any application answer, career-ops verifies the posting is still live and matches your report. On any mismatch it asks you — it never guesses (#887)
- ⏸️ Batch pause on session limits — hitting your AI plan's limit now pauses the batch (keeping retry budgets) instead of burning every remaining offer to
failed. Resume with--resume-paused(#874) - Plus: SolidJobs provider + generic
job_boardsconfig (#853), scan-history TTL (#895),--rediscover-404for moved postings (#808), LaTeX CV renderer (#905), configurable follow-up cadence (#889), portals.yml validator (#886),doctor --jsonas the single onboarding source of truth (#888)
Important fixes
- 🔐 Security: SSRF guard hardening in the liveness checker — bracketed IPv6 literals, mapped IPv4,
0.0.0.0and trailing-dot hostnames could bypass the private-host guard (#917) - 🩹 v1.8.x upgrades repaired — updating from 1.8.x no longer leaves the install broken (
tracker-links.mjsmissing). If you're on 1.8.x: this release fixes the path forward — see the note below (#921) - 🧯 Batch workers no longer deadlock fighting over a shared browser in parallel runs (#809), and min-score skips no longer fall through to "completed" (#873)
- 📒 Two tracker data-loss fixes: number collisions can no longer overwrite an unrelated company's row (#867, #793)
- 🧾 PDF generation now validates section order against your
cv.md, not a hardcoded convention (#817) - Liveness checking no longer false-expires postings hiding behind anti-bot walls (#783)
i18n — 🇫🇷 French README (#906) · 🇵🇱 Polish README (#837) · 🇸🇦 Arabic README + modes (#764) · last root-level modes translated to English (#903)
⬆️ Upgrading from 1.8.x
The 1.8.x updater has a known gap (#920): run node update-system.mjs apply twice (the first run updates the updater itself), or check the issue for a one-line manual fix. From 1.9.0 onward this class of bug is covered by an automated migration test (#833 — thanks @ncoprod).
📈 And the project itself?
Growing faster than we can triage it, honestly:
live star telemetry by warpchart.dev
To everyone who opened an issue before a PR, rebased twice without complaining, or translated a README into their language: thank you. Every one of those stars is someone's job search getting a little less lonely.
— Santiago
📋 Full changelog
1.10.0 (2026-06-11)
Features
- apply: add preflight liveness and role-match gate (#887) (42bb9ab)
- batch: pause batch runner on Claude session limits (#874) (ae6beec)
- cover: add cover letter generation mode (#807) (493f822)
- cv: add build-cv-latex.mjs structured JSON to LaTeX renderer (#905) (b4af01f)
- dashboard: keep discard reason visible in pipeline preview (#914) (3200dfe)
- dashboard: sortable Location, Pay, and Last-contact columns in pipeline view (#798) (265a95b)
- dockerize project for hosts blocked from native Playwright install (#625) (66404a8)
- doctor: adopt doctor --json as the single onboarding state source (#888) (35e2124)
- followup: read cadence settings from profile.yml (#889) (8050c37)
- i18n: add full Arabic language support and modes (#764) (333bb81)
- modes: add interactive interview onboarding subcommand (#909) (46a5c59)
- scan: add --rediscover-404 fallback for moved tracked postings (#808) (7096dbc)
- scan: add configurable salary filtering to the zero-token scanner (#677) (a6ea02e)
- scan: add portals.yml schema validator (#886) (3340695)
- scan: add scan-ats-full.mjs — reverse-discover jobs from public ATS APIs (#746) (7801dc7)
- scan: add scan-history TTL and recheck policy (#895) (1db4cf2)
- scan: add SolidJobs provider and job_boards support (#853) (79862a9)
Bug Fixes
- apply: preserve form field contracts (#821) (2b38fd0)
- batch: append profile context to worker prompts (#815) (4989afc)
- batch: isolate workers from inherited MCP to prevent parallel deadlock (#809) (c8c0dbd)
- batch: stop after min-score skip instead of falling through to completed (#873) (888ca31)
- dashboard: resolve tracker-relative report links against the tracker directory (#780) (858fc93), closes #779
- doctor: single source of truth for onboarding state via doctor --json (#765) (eb536c4)
- flake: declare systems so the devShell resolves on macOS (#848) (e5f0903), closes #334...
career-ops: v1.9.0
1.9.0 (2026-06-09)
Features
- add npx career-ops scaffolder for one-command install (#856) (ce4fa58), closes #855
- add structured machine summaries to evaluations (#444) (19a1820)
- add Ukrainian language and market support (#323) (06d70d3)
- batch: add --model flag to batch-runner.sh (#504) (44def35)
- dashboard: /-key live search across pipeline rows (#526) (433f34f)
- i18n: add Turkish (TR) language modes (#341) (e87eb57)
- interview-prep: split prep by interviewer audience (#489) (d86b86c)
- make PDF auto-generation configurable via auto_pdf_score_threshold (#715) (fdbf4e1)
- scan: add --verify flag to drop expired postings before pipeline append (#487) (82f0c2e)
- scan: add local-parser provider and agent skip rules (#595) (b3ef0ae)
- scan: add optional always_allow tier to location_filter (#652) (d152da3), closes #650
- scan: add Workable, SmartRecruiters, Recruitee ATS parsers (#653) (ea7b2a6), closes #651
Bug Fixes
- batch: wait and retry batch workers on rate limits (#816) (f498ccf), closes #505
- dashboard: width-aware Markdown rendering with table wrapping in viewer (#513) (dc3a247)
- gemini: auto-merge Gemini evals into the tracker instead of a manual-edit reminder (#820) (6efac1a)
- make tracker report links relative to the tracker file (#760) (#761) (c0d42cd)
- pdf: don't spell out ambiguous ¥ currency symbol (4c415a9)
- pdf: normalize arrows, middots, and currency symbols for ATS extraction (#731) (f164eba), closes #730
- register the career-ops skill in Claude Code via user_invocable key (#801) (3ddb00c), closes #763
- release: sync VERSION file to 1.8.0 (541917f)
- scaffolder: don't pre-create user config so agent onboarding triggers (#858) (cd827be), closes #855
- scan: bootstrap providers/ on update + harden greenhouse detect() (#696) (4b12081)
- scan: raise Ashby provider timeout + add backoff retry (#755) (1aa6c63)
- scan: surface websearch-handoff companies in the run summary (#814) (137c7b3), closes #747
- scope npm package as @santifer/career-ops (#857) (87ef561)
- update-system: add tracker-links.mjs to SYSTEM_PATHS (8287cf4)
- update-system: apply() safety violation reverts cleanly and releases lock (#484) (980153c)
- update-system: bootstrap liveness-browser.mjs for v1.7→v1.8 upgrades (#725) (1ea95f2), closes #704
- update-system: rollback() removes paths absent from backup branch (#483) (f94a3be)
- update: distribute missing modes, locales and CLI configs via update-system (#868) (03b2c94)
- update: timestamp backup branches and roll back to the newest (#813) (1717f9c), closes #733
career-ops crossed 50,000 stars this week, two months after launch. Every feature in this release came from the community — Ukrainian and Turkish support, the ATS parsers, the npx installer, dozens of fixes. Thank you to everyone who shaped it.
career-ops: v1.8.0
1.8.0 (2026-05-15)
Features
Bug Fixes
- batch: workers read modes/_profile.md and config/profile.yml (#537) (150e223), closes #534
- deps: update dotenv to v17 (#499) (ce1330e)
- gemini-eval: include profile.yml and _profile.md in evaluation (#618) (73dc603), closes #617
- gemini-eval: redact API key from error logs, harden summary parsing (#582) (fdca4de)
- gemini-eval: switch default model to non-deprecated endpoint, surface 429 guidance (#615) (dd3e036), closes #614
- manifest: align plugin.json skills field with Claude Code plugin schema (#612) (a77d3f6)
- merge-tracker: preserve short specialty acronyms, require non-baseline overlap (#634) (5ed3b3d), closes #633
- modes: make /career-ops deep respect user language, not JD language (#568) (e5f0508)
- portals: update Weights & Biases entry to CoreWeave acquisition (#493) (1411cdc)
- release: sync VERSION file to 1.7.1 (2ebfcab)
- scan: validate Greenhouse URL hostname against allowlist to prevent SSRF (#602) (988f7bb)
- templates: align CV certification rows on a 3-column grid (#638) (082cd11)
- update-system: allow writing-samples/README.md as system-owned file (#562) (207fd07)
- update-system: bootstrap .agents/ for v1.6→v1.7 migration (#654) (4714504)
- update-system: defensive VERSION parsing for release-please marker (#547) (bf84886)
career-ops: v1.7.1
career-ops: v1.7.0
1.7.0 (2026-05-06)
Features
- adapt contacto mode by contact type (recruiter/HM/peer/interviewer) (9fd5a90)
- add --min-score flag to batch runner (#249) (cb0c7f7)
- add {{PHONE}} placeholder to CV template (#287) (e71595f)
- add Block G — posting legitimacy assessment (3a636ac)
- add Claude Code plugin manifests (path-stable) (62b767d)
- add follow-up cadence tracker mode (4308c37)
- add Gemini CLI native integration and evaluator script (#349) (0853486)
- add Gemini CLI native integration and evaluator script (closes #344) (0853486)
- add GitHub Actions CI + auto-labeler + welcome bot + /run skill (2ddf22a)
- add LaTeX/Overleaf CV export mode with pdflatex compilation (#362) (b824953)
- add LaTeX/Overleaf CV export mode with pdflatex compilation (closes #47) (b824953)
- add Nix flake devshell with Playwright support (c579fcd)
- add OpenCode slash commands for career-ops (#67) (93caaed)
- add scan.mjs — zero-token portal scanner (8c19b2b)
- add writing-samples folder for AI-detection-evading voice calibration (9ae201d)
- cv: add cv.output_format to route between html and latex generation (b82bb5f)
- dashboard: add Catppuccin Latte light theme with auto-detection (ff686c8)
- dashboard: add manual refresh shortcut (#246) (4b5093a)
- dashboard: add progress analytics screen (623c837)
- dashboard: add rejected and discarded pipeline tabs (7d05967)
- dashboard: add vim motions to pipeline screen (#262) (d149e54)
- dashboard: aligned tables and markdown syntax rendering in viewer (dbd1d3f)
- dashboard: show tracker IDs in pipeline list (8d289c6)
- expand portals.example.yml with 8 dev-tools companies + 23 search queries (#140) (b7f555d)
- i18n: add Japanese README + language modes for Japan market (20a2c81)
- latex: add tectonic engine auto-detect with pdflatex fallback (4b71b2c)
- multi-CLI support via open agent skill standard (#572) (7605a5e)
- portals: add Canada/Vancouver and automation companies to example template (590ba6e)
Bug Fixes
- 10 bug fixes — resource leaks, command injection, Unicode, navigation (cb01a2c)
- add data/ fallback to UpdateApplicationStatus (#55) (3512b8e)
- add stopword filtering and overlap ratio to roleMatch (#248) (4da772d)
- align portals.example.yml indentation for new companies (26a6751)
- ci: correct first-interaction@v3 input names (c5196a8)
- ci: gracefully handle missing dependency graph in dependency-review (#343) (7c5fecb)
- ci: gracefully handle missing dependency graph in dependency-review workflow (#352) (7c5fecb)
- ci: use pull_request_target for labeler on fork PRs (#260) (2ecf572)
- correct _shared.md → _profile.md reference in CUSTOMIZATION.md (closes #137) (a91e264)
- correct dashboard launch path in docs (#80) (2b969ee)
- dashboard: show dates in pipeline list (#298) (e5e2a6c)
- ensure data/ and output/ dirs exist before writing in scripts (#261) (4b834f6)
- filter expired WebSearch links before they reach the pipeline (#57) (ce1c5a3)
- improve default PDF readability (#85) (10034ec)
- liveness checks ignore nav/footer Apply text, expired signals win (3a3cb95)
- liveness: detect closed postings with applications-closed banner variants (7f8217e)
- merge-tracker: filter seniority and location stopwords + require overlap ratio in roleFuzzyMatch (7821113)
- pt: restore diacritical marks in PT-BR modes (#358) (3a4c596)
- pt: restore diacritical marks in PT-BR modes (#359) (3a4c596)
- release: sync VERSION and package.json via release-please-config (6a3dc22)
- remove wellfound, lever and remotefront from portals.example.yml (#286) (ecd013c)
- replace grep -P with POSIX-compatible grep in batch-runner.sh (637b39e)
- test-all.mjs scans only git-tracked files, avoids false positives (47c9f98)
- update-system: cross-check GitHub Releases API when VERSION file is stale (b0ee6eb)
- update-system: e...
v1.6.0
1.6.0 (2026-04-26)
Features
- add Gemini CLI native integration and evaluator script (#349) (0853486)
- add Gemini CLI native integration and evaluator script (closes #344) (0853486)
- add LaTeX/Overleaf CV export mode with pdflatex compilation (#362) (b824953)
- add LaTeX/Overleaf CV export mode with pdflatex compilation (closes #47) (b824953)
- cv: add cv.output_format to route between html and latex generation (b82bb5f)
- dashboard: add rejected and discarded pipeline tabs (7d05967)
- dashboard: show tracker IDs in pipeline list (8d289c6)
- latex: add tectonic engine auto-detect with pdflatex fallback (4b71b2c)
- portals: add Canada/Vancouver and automation companies to example template (590ba6e)
Bug Fixes
- ci: correct first-interaction@v3 input names (c5196a8)
- ci: gracefully handle missing dependency graph in dependency-review (#343) (7c5fecb)
- ci: gracefully handle missing dependency graph in dependency-review workflow (#352) (7c5fecb)
- liveness: detect closed postings with applications-closed banner variants (7f8217e)
- merge-tracker: filter seniority and location stopwords + require overlap ratio in roleFuzzyMatch (7821113)
- pt: restore diacritical marks in PT-BR modes (#358) (3a4c596)
- pt: restore diacritical marks in PT-BR modes (#359) (3a4c596)
- update-system: cross-check GitHub Releases API when VERSION file is stale (b0ee6eb)
- update-system: expand SYSTEM_PATHS to cover all language modes and current scripts (34fe3fb)
v1.5.0
v1.4.0
1.4.0 (2026-04-13)
Features
- add GitHub Actions CI + auto-labeler + welcome bot + /run skill (2ddf22a)
- dashboard: add Catppuccin Latte light theme with auto-detection (ff686c8)
- dashboard: add progress analytics screen (623c837)
- dashboard: add vim motions to pipeline screen (#262) (d149e54)
- dashboard: aligned tables and markdown syntax rendering in viewer (dbd1d3f)
Bug Fixes
- ci: use pull_request_target for labeler on fork PRs (#260) (2ecf572)
- correct _shared.md → _profile.md reference in CUSTOMIZATION.md (closes #137) (a91e264)
- replace grep -P with POSIX-compatible grep in batch-runner.sh (637b39e)
- test-all.mjs scans only git-tracked files, avoids false positives (47c9f98)
- use execFileSync to prevent shell injection in test-all.mjs (c99d5a6)