Changelog

Every release, in plain language. career-ops ships several times a week; this page reads straight from GitHub Releases and updates itself. Your data is never touched by an update — see the Data Contract.

vweb-v0.2.0

Latest

New

  • Experimental local-first web UI (opt-in alpha)
  • pipelineOptional per-offer note in the pipeline writer
  • webConfig microcopy humanized (P1.5)
  • webCost affordance — CostBadge muted (P1.6)
  • webDedupe bug reports at write — stable fingerprint + click-gated similar-issue search
  • webEmpty-state free-scan button (P0.1)
  • webExtract cleanChips to a tested module + tab/CR paste delimiter
  • webInbox triage — Abundance → Triage → Shortlist → Opt-in Score
  • webMobile tap-targets ≥44px + FAB clearance
  • webOrange hierarchy — brand-soft Mark-applied + inbox cost legend (P1.4)
  • webReport progressive disclosure (P0.3+P1.8)
  • webRicher bug-report diagnostics — data-shape fingerprint, core version, API errors

Fixed

  • Correctness sweep across tracker, providers, and eval reporting, closes #1527
  • webBump FOLLOW-UPS DUE tap-targets to 44px on mobile
  • webPin turbopack.root to prevent Windows postcss OOM
  • webPoint the 'Get one free' link at the free-AI-engine guide
  • webRestore the report-a-bug kit lost between the RC branch and main

v1.17.0

New

  • Add the opt-in experimental web UI surface (web/) — isolated versioning, CI and packaging
  • add/career-ops add — fetch a project/paper/role into cv.md and article-digest.md
  • agent-inboxQueue requests for the next session
  • applyPre-scan forms for knock-out questions before drafting
  • contactoShort-greeting variant for chat-style outreach
  • emailFormal application email drafts — draft-only, never sends
  • Experimental local-first web UI (opt-in alpha)
  • findResolve a company/role/number query to its full pipeline identity
  • followupSeed a pinned first follow-up when a row turns Applied
  • i18nAdd Korean career-ops modes
  • i18nTranslate interview modes to French, closes #1489
  • i18nTranslate interview modes to Spanish, closes #1490
  • ofertaFlag 'remote' location contradicted by JD-body signals
  • patternsRecruiting-process friction signal at company level
  • patternsTranscript-driven targeting correction (Step 1b) — closes #960
  • pipelineOptional per-offer note in the pipeline writer
  • portalsProbe non-ATS boards through the provider layer
  • profileCandidate contact-channel preference for outreach CTAs, closes #1556
  • providersAdd Get on Board (getonbrd) zero-auth provider
  • providersAmazon (amazon.jobs) and Avature zero-token providers
  • providersAvature self-heals jobOffset→offset pagination
  • providersBeesite (milch & zucker) + softgarden providers
  • providersDassault Systèmes zero-token provider (Exalead XML)
  • providersHonour api: on workday and smartrecruiters
  • providersSAP SuccessFactors (RMK) zero-token provider
  • providersSuccessFactors CSB strategy + bounded health-probe budget
  • registryAdd startup boards plugin
  • reserve-report-num--count N contiguous range reservation
  • scanReport unreachable boards with error classification + doctor sweep
  • verifyDetect duplicate and orphan reports
  • webConfig microcopy humanized (P1.5)
  • webCost affordance — CostBadge muted (P1.6)
  • webDedupe bug reports at write — stable fingerprint + click-gated similar-issue search
  • webEmpty-state free-scan button (P0.1)
  • webExtract cleanChips to a tested module + tab/CR paste delimiter
  • webInbox triage — Abundance → Triage → Shortlist → Opt-in Score
  • webMobile tap-targets ≥44px + FAB clearance
  • webOrange hierarchy — brand-soft Mark-applied + inbox cost legend (P1.4)
  • webReport progressive disclosure (P0.3+P1.8)
  • webRicher bug-report diagnostics — data-shape fingerprint, core version, API errors

Fixed

  • Correctness sweep across tracker, providers, and eval reporting, closes #1527
  • dedupRequire exact company+role match so distinct same-company roles survive
  • infraExempt web/ from the SYSTEM_PATHS coverage guard (isolation contract)
  • merge-trackerDetect TSV score/status column order by header, closes #1427
  • merge-trackerGuard tier-3 fuzzy dedup with req/job number, closes #1524
  • onboardingAuto-copy template seeds in doctor --json (#782, #1369)
  • pathsPrefer cygpath over wslpath in toBashPath()
  • pdfUse CSS @page setup for margins
  • pluginsHarden manifest path containment against symlink traversal
  • Prevent notion plugin from mangling slash-formatted scores
  • providersAvature parser tolerates two live tenant markup variants
  • providersHarden workday pagination against 429s, API caps, and dateless tenants
  • providersUpdate Glints API to v2-alc/searchJobsV3, document Jobstreet GraphQL migration
  • providersWorkday honors ctx.maxPages so the liveness probe stops cleanly
  • scanLoad .env credentials via optional dotenv import
  • updateMake updater timeout budgets configurable
  • updatePreserve local CLAUDE.md additions during /career-ops update
  • updaterAdd .claude/settings.json to USER_PATHS, closes #1408
  • webBump FOLLOW-UPS DUE tap-targets to 44px on mobile
  • webPin turbopack.root to prevent Windows postcss OOM
  • webPoint the 'Get one free' link at the free-AI-engine guide
  • webRestore the report-a-bug kit lost between the RC branch and main

v1.16.0

New

  • Add interview skill modes — plan, practice, debrief
  • applyATS auto-fill for Greenhouse / Ashby / Lever — prepare, don't submit
  • discoverySeed company universe from VC portfolios (YC / a16z)…
  • patternsATS channel yield analysis — algorithmic-monoculture aware
  • pluginsSeed/successor model — community plugins can supersede a bundled reference
  • providersAdd HigherEdJobs RSS provider
  • providersAdd JibeApply provider
  • providersAdd NoDesk provider
  • providersAdd Teamtailor zero-auth RSS provider
  • registryAdd career-ops-plugin-obsidian v0.1.0
  • registryAdd career-ops-plugin-tavily v0.1.0
  • registryAdd google-calendar plugin v0.1.0
  • scanAdd seniority-tier classifier with optional skip_tiers fi…

Fixed

  • cv-templateKeep role titles from orphaning at page breaks
  • dashboardMap tracker columns by header name
  • followup-cadenceSchedule first responded follow-up with responded_initial
  • livenessAdd Ashby API rung so live jobs.ashbyhq.com postings aren't false-expired
  • pdfAnchor the output path-traversal guard to the repo root, not cwd
  • pdfKeep a right gutter so right-aligned CV content isn't clipped
  • pdfThread manifest metadata through render options

v1.15.0

New

  • Add opt-in plugin system (engine + supply-chain governance + registry)
  • Add optional profile photo support for resume template
  • dashboardAdd cover letter hotkey to report viewer
  • dashboardHotkeys to view (d) and regenerate (D) the CV PDF
  • OpenRouter runner — free models, auto-blacklist, no Claude CLI required
  • providersAdd 4 Day Week provider (public zero-auth API)
  • providersAdd Arbeitnow provider
  • providersAdd Hacker News "Who is hiring?" provider (Algolia API)
  • providersAdd Himalayas provider
  • providersAdd Jobicy provider
  • providersAdd Jobspresso provider
  • providersAdd Landing.jobs provider
  • providersAdd Pinpoint ATS provider
  • providersAdd Rippling ATS provider
  • providersAdd The Hub provider
  • providersAdd The Muse provider
  • scanAdd detect-reposts.mjs repost detection from scan-history.tsv
  • scanAdd JustJoin and NoFluffJobs providers
  • scanPersist compensation to pipeline.md
  • scriptsAdd build:dashboard and serve:dashboard npm scripts
  • updaterStructural SYSTEM_PATHS coverage check

Fixed

  • depsUpdate dependency playwright to v1.61.1
  • evalBound research budget to a single-pass query cap
  • scanTighter company matching and dedup order for cooldown filter
  • securityHarden batch tmpfile, PDF output path, and tracker cells
  • trackerShare header-name column mapping across all readers

v1.14.0

New

  • Add modes/_custom.md for user custom instructions
  • applyATS behavioural question matcher from story-bank.md
  • archiveAdd archive-posting.mjs to save live job postings as PDF
  • batchAdd --limit flag + budget guide
  • cliAdd first-class Codex support
  • cliAdd Grok Build CLI support
  • cliRegister Kimi as a supported CLI host
  • cvAdd opt-in profile photo for DACH/European CVs
  • evalAdd openai-eval.mjs for any OpenAI-compatible endpoint
  • modesAdd Danish (da) locale
  • modesAdd EU SWE application calibration mode
  • modesAdd recruiter-side application heuristics
  • ollamaAdd local interactive Ollama evaluator
  • providersAdd Comeet ATS provider
  • providersAdd Personio ATS provider
  • providersAdd WeWorkRemotely RSS provider, closes #1241
  • scanAdd early trust validation and job trust metadata
  • scanPreserve job location in pipeline.md

Fixed

  • batchSingle-worker lock fallback + exit-127 shim-swap retry
  • modesBound subagent delegation to prevent research fan-out, closes #1235
  • pluginDrop non-schema skills/permissions keys from plugin.json
  • scanTrim title-filter keywords before the length check
  • templateScope break-inside to atomic units to prevent CV pagination breaks
  • updaterResolve self-reexec checkout from the import closure, closes #1245

v1.13.0

New

  • arbeitsagenturConfig-driven remoteMatch + server-side homeoffice filter
  • batchAdd --skip-pdf flag to batch-runner.sh
  • dashboardAdd in-viewer status picker overlay
  • dashboardCustomizable columns with column picker
  • dashboardRecognize EUR/GBP/CHF pay and international cities in pipeline derive
  • livenessZero-token ATS API check before Playwright (closes #574)
  • modesAdd Polish (pl) locale modes
  • modesOptional voice-dna.md writing guardrail
  • portalsAdd verify-portals.mjs ATS slug validator
  • providersAdd BambooHR provider
  • providersAdd Breezy HR scanner provider
  • scanAdd --json output, --include-undated, and --shuffle to scan-ats-full
  • trackerAdd `delete --num N` to remove an application row safely

Fixed

  • Auto-create data/pipeline.md and harden Playwright doctor check
  • batchHarden status score handling
  • batchUse awk instead of bc for score math
  • contractExpand interview-prep/* coverage in DATA_CONTRACT
  • dashboardRewrite only the Status cell on status update
  • Images not rendering in PDF output due to about:blank origin
  • Normalize report links from data files
  • providersHarden lever/ashby/workday against SSRF via redirect
  • recruiteeKeep offer URLs on tenant custom domains
  • scanGuard title-filter keyword normalization against malformed config
  • scanMatch short acronym title-filter keywords on word boundaries
  • templateEmit mailto:/tel: links for email and phone in CV header
  • templatesDisable fi/fl ligatures for ATS-clean PDF text extraction

v1.12.0

New

  • batchAdd --status and --watch progress monitoring to batch-runner.sh
  • cliAdd Antigravity CLI compatibility
  • i18nAdd Chinese language modes for China-market job seekers
  • pdfRender Japanese CVs with a lang="ja" CJK font fallback
  • providersAdd Jobstreet and Glints providers for the Indonesian market, closes #1085
  • providersAdd RemoteOK, Remotive, Working Nomads, IBM board providers, closes #1075
  • providersPort Arbeitsagentur to an in-process provider
  • scanAdd content/description filter for providers

Fixed

  • ashbyInclude secondaryLocations so EU-eligible roles surface, closes #1073
  • batchReconcile pipeline.md inbox after batch runs
  • dashboardArchetype regex matches English and Spanish reports
  • dashboardOpen Windows targets without shell
  • dashboardReport last-contact in calendar days, not hours-since-midnight
  • followupResolve report path relative to tracker directory, closes #1070
  • followupUse the real application date from notes, not the eval date
  • geminiValidate evaluation report shape
  • latexLanguage-agnostic section validation + CJK guard
  • merge-trackerRequire company match for number-based dedup, closes #912
  • pdfAuto-install Playwright chromium after update
  • pdfUse ATS-safe system fonts for clean CV text extraction, closes #1074
  • pipelineAdd batch liveness sweep for unconfirmed entries
  • scanSanitize external metadata before writes
  • securityHarden local-parser against command/arg injection and scan-ats against SSRF
  • trackerPreserve notes column when rewriting rows without a trailing pipe
  • updateMaterialize skill entrypoints without symlinks
  • updaterGit-safety on abort + preserve user files on safety-violation rollback

v1.11.0

New

  • Add first-class OpenCode support alongside Claude Code
  • coverAdd optional salutation/greeting to cover letters
  • coverLoad _profile.md so personalization governs the letter
  • doctorWarn when Playwright MCP tools are not configured
  • trackerMap tracker columns by header name
  • trackerSQLite derived index over applications.md — phase 1

Fixed

  • cvAlign certification org column width across rows
  • depsUpdate npm dependencies to v1.61.0
  • evalGate dead links before evaluation in oferta and auto-pipeline
  • generate-pdfInline local fonts as data: URLs so they actually embed
  • merge-trackerSerialize concurrent tracker merges with a filesystem lock
  • pdfWait for load instead of networkidle during render
  • Remove story-bank.md from git tracking
  • skillSurface latex mode in command menus
  • testsRun tracker-mutating scripts with --dry-run in script checks
  • trackerPrevent dedup from deleting distinct same-company roles
  • updateDistribute missing runtime paths
  • updateMatch Release Please component-prefixed tags in version check
  • updateRebuild dashboard binary after Go source changes
  • updateUse target updater manifest during apply

v1.10.0

New

  • applyAdd preflight liveness and role-match gate
  • batchPause batch runner on Claude session limits
  • coverAdd cover letter generation mode
  • cvAdd build-cv-latex.mjs structured JSON to LaTeX renderer
  • dashboardKeep discard reason visible in pipeline preview
  • dashboardSortable Location, Pay, and Last-contact columns in pipeline view
  • Dockerize project for hosts blocked from native Playwright install
  • doctorAdopt doctor --json as the single onboarding state source
  • followupRead cadence settings from profile.yml
  • i18nAdd full Arabic language support and modes
  • modesAdd interactive interview onboarding subcommand
  • scanAdd --rediscover-404 fallback for moved tracked postings
  • scanAdd configurable salary filtering to the zero-token scanner
  • scanAdd portals.yml schema validator
  • scanAdd scan-ats-full.mjs — reverse-discover jobs from public ATS APIs
  • scanAdd scan-history TTL and recheck policy
  • scanAdd SolidJobs provider and job_boards support

Fixed

  • applyPreserve form field contracts
  • batchAppend profile context to worker prompts
  • batchIsolate workers from inherited MCP to prevent parallel deadlock
  • batchStop after min-score skip instead of falling through to completed
  • dashboardResolve tracker-relative report links against the tracker directory, closes #779
  • doctorSingle source of truth for onboarding state via doctor --json
  • flakeDeclare systems so the devShell resolves on macOS, closes #334
  • livenessStop false-expiring postings behind anti-bot walls
  • merge-trackerRequire company match on exact entry-number dedup
  • merge-trackerUse token-union ratio in roleFuzzyMatch to stop cross-role dedup, closes #751
  • patternsParse header-style and Detected-archetype formats in analyze-patterns
  • pdfReject CV section ordering that diverges from cv.md source
  • pipelineAtomic report-number reservation for parallel workers
  • releaseAuto-sync VERSION via release-please generic extra-file
  • releaseSync VERSION file to 1.9.0
  • securityClose SSRF guard bypasses in liveness-browser
  • updateBootstrap tracker-links.mjs and scaffolder/ for v1.8.x to v1.9.0 upgrades
  • updateRun curl version checks concurrently in check()
  • updateUse curl in check() so updates work inside the Claude Code sandbox, closes #754

v1.9.0

New

  • Add npx career-ops scaffolder for one-command install, closes #855
  • Add structured machine summaries to evaluations
  • Add Ukrainian language and market support
  • batchAdd --model flag to batch-runner.sh
  • dashboard/-key live search across pipeline rows
  • i18nAdd Turkish (TR) language modes
  • interview-prepSplit prep by interviewer audience
  • Make PDF auto-generation configurable via auto_pdf_score_threshold
  • scanAdd --verify flag to drop expired postings before pipeline append
  • scanAdd local-parser provider and agent skip rules
  • scanAdd optional always_allow tier to location_filter, closes #650
  • scanAdd Workable, SmartRecruiters, Recruitee ATS parsers, closes #651

Fixed

  • batchWait and retry batch workers on rate limits, closes #505
  • dashboardWidth-aware Markdown rendering with table wrapping in viewer
  • geminiAuto-merge Gemini evals into the tracker instead of a manual-edit reminder
  • Make tracker report links relative to the tracker file
  • pdfDon't spell out ambiguous ¥ currency symbol
  • pdfNormalize arrows, middots, and currency symbols for ATS extraction, closes #730
  • Register the career-ops skill in Claude Code via user_invocable key, closes #763
  • releaseSync VERSION file to 1.8.0
  • scaffolderDon't pre-create user config so agent onboarding triggers, closes #855
  • scanBootstrap providers/ on update + harden greenhouse detect()
  • scanRaise Ashby provider timeout + add backoff retry
  • scanSurface websearch-handoff companies in the run summary, closes #747
  • Scope npm package as @santifer/career-ops
  • update-systemAdd tracker-links.mjs to SYSTEM_PATHS
  • update-systemApply() safety violation reverts cleanly and releases lock
  • update-systemBootstrap liveness-browser.mjs for v1.7→v1.8 upgrades, closes #704
  • update-systemRollback() removes paths absent from backup branch
  • updateDistribute missing modes, locales and CLI configs via update-system
  • updateTimestamp backup branches and roll back to the newest, closes #733

v1.8.0

New

  • scanOptional location_filter in portals.yml + persist location to scan-history

Fixed

  • batchWorkers read modes/_profile.md and config/profile.yml, closes #534
  • depsUpdate dotenv to v17
  • gemini-evalInclude profile.yml and _profile.md in evaluation, closes #617
  • gemini-evalRedact API key from error logs, harden summary parsing
  • gemini-evalSwitch default model to non-deprecated endpoint, surface 429 guidance, closes #614
  • manifestAlign plugin.json skills field with Claude Code plugin schema
  • merge-trackerPreserve short specialty acronyms, require non-baseline overlap, closes #633
  • modesMake /career-ops deep respect user language, not JD language
  • portalsUpdate Weights & Biases entry to CoreWeave acquisition
  • releaseSync VERSION file to 1.7.1
  • scanValidate Greenhouse URL hostname against allowlist to prevent SSRF
  • templatesAlign CV certification rows on a 3-column grid
  • update-systemAllow writing-samples/README.md as system-owned file
  • update-systemBootstrap .agents/ for v1.6→v1.7 migration
  • update-systemDefensive VERSION parsing for release-please marker

v1.7.1

Fixed

  • releaseSync VERSION file to 1.7.0
  • update-systemInclude .agents/ in SYSTEM_PATHS

v1.7.0

New

  • Adapt contacto mode by contact type (recruiter/HM/peer/interviewer)
  • Add --min-score flag to batch runner
  • Add {{PHONE}} placeholder to CV template
  • Add Block G — posting legitimacy assessment
  • Add Claude Code plugin manifests (path-stable)
  • Add follow-up cadence tracker mode
  • Add Gemini CLI native integration and evaluator script
  • Add Gemini CLI native integration and evaluator script (closes #344)
  • Add GitHub Actions CI + auto-labeler + welcome bot + /run skill
  • Add LaTeX/Overleaf CV export mode with pdflatex compilation
  • Add LaTeX/Overleaf CV export mode with pdflatex compilation (closes #47)
  • Add Nix flake devshell with Playwright support
  • Add OpenCode slash commands for career-ops
  • Add scan.mjs — zero-token portal scanner
  • Add writing-samples folder for AI-detection-evading voice calibration
  • cvAdd cv.output_format to route between html and latex generation
  • dashboardAdd Catppuccin Latte light theme with auto-detection
  • dashboardAdd manual refresh shortcut
  • dashboardAdd progress analytics screen
  • dashboardAdd rejected and discarded pipeline tabs
  • dashboardAdd vim motions to pipeline screen
  • dashboardAligned tables and markdown syntax rendering in viewer
  • dashboardShow tracker IDs in pipeline list
  • Expand portals.example.yml with 8 dev-tools companies + 23 search queries
  • i18nAdd Japanese README + language modes for Japan market
  • latexAdd tectonic engine auto-detect with pdflatex fallback
  • Multi-CLI support via open agent skill standard
  • portalsAdd Canada/Vancouver and automation companies to example template

Fixed

  • 10 bug fixes — resource leaks, command injection, Unicode, navigation
  • Add data/ fallback to UpdateApplicationStatus
  • Add stopword filtering and overlap ratio to roleMatch
  • Align portals.example.yml indentation for new companies
  • ciCorrect first-interaction@v3 input names
  • ciGracefully handle missing dependency graph in dependency-review
  • ciGracefully handle missing dependency graph in dependency-review workflow
  • ciUse pull_request_target for labeler on fork PRs
  • Correct _shared.md → _profile.md reference in CUSTOMIZATION.md (closes #137)
  • Correct dashboard launch path in docs
  • dashboardShow dates in pipeline list
  • Ensure data/ and output/ dirs exist before writing in scripts
  • Filter expired WebSearch links before they reach the pipeline
  • Improve default PDF readability
  • Liveness checks ignore nav/footer Apply text, expired signals win
  • livenessDetect closed postings with applications-closed banner variants
  • merge-trackerFilter seniority and location stopwords + require overlap ratio in roleFuzzyMatch
  • ptRestore diacritical marks in PT-BR modes
  • ptRestore diacritical marks in PT-BR modes
  • releaseSync VERSION and package.json via release-please-config
  • Remove wellfound, lever and remotefront from portals.example.yml
  • Replace grep -P with POSIX-compatible grep in batch-runner.sh
  • Test-all.mjs scans only git-tracked files, avoids false positives
  • update-systemCross-check GitHub Releases API when VERSION file is stale
  • update-systemExpand SYSTEM_PATHS to cover all language modes and current scripts
  • Use candidate name from profile.yml in PDF filename
  • Use execFileSync to prevent shell injection in test-all.mjs
  • Use fileURLToPath for cross platform compatible paths in tracker scripts
  • Use hi@santifer.io in English README

Faster

  • Compress hero banner from 5.7MB to 671KB

v1.6.0

New

  • Add Gemini CLI native integration and evaluator script
  • Add Gemini CLI native integration and evaluator script (closes #344)
  • Add LaTeX/Overleaf CV export mode with pdflatex compilation
  • Add LaTeX/Overleaf CV export mode with pdflatex compilation (closes #47)
  • cvAdd cv.output_format to route between html and latex generation
  • dashboardAdd rejected and discarded pipeline tabs
  • dashboardShow tracker IDs in pipeline list
  • latexAdd tectonic engine auto-detect with pdflatex fallback
  • portalsAdd Canada/Vancouver and automation companies to example template

Fixed

  • ciCorrect first-interaction@v3 input names
  • ciGracefully handle missing dependency graph in dependency-review
  • ciGracefully handle missing dependency graph in dependency-review workflow
  • livenessDetect closed postings with applications-closed banner variants
  • merge-trackerFilter seniority and location stopwords + require overlap ratio in roleFuzzyMatch
  • ptRestore diacritical marks in PT-BR modes
  • ptRestore diacritical marks in PT-BR modes
  • update-systemCross-check GitHub Releases API when VERSION file is stale
  • update-systemExpand SYSTEM_PATHS to cover all language modes and current scripts

v1.5.0

New

  • Add --min-score flag to batch runner
  • Add {{PHONE}} placeholder to CV template
  • dashboardAdd manual refresh shortcut

Fixed

  • Add stopword filtering and overlap ratio to roleMatch
  • dashboardShow dates in pipeline list
  • Ensure data/ and output/ dirs exist before writing in scripts
  • Remove wellfound, lever and remotefront from portals.example.yml

v1.4.0

New

  • Add GitHub Actions CI + auto-labeler + welcome bot + /run skill
  • dashboardAdd Catppuccin Latte light theme with auto-detection
  • dashboardAdd progress analytics screen
  • dashboardAdd vim motions to pipeline screen
  • dashboardAligned tables and markdown syntax rendering in viewer

Fixed

  • ciUse pull_request_target for labeler on fork PRs
  • Correct _shared.md → _profile.md reference in CUSTOMIZATION.md (closes #137)
  • Replace grep -P with POSIX-compatible grep in batch-runner.sh
  • Test-all.mjs scans only git-tracked files, avoids false positives
  • Use execFileSync to prevent shell injection in test-all.mjs