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
LatestNew
- Experimental local-first web UI (opt-in alpha)
pipelineOptional per-offer note in the pipeline writerwebConfig microcopy humanized (P1.5)webCost affordance — CostBadge muted (P1.6)webDedupe bug reports at write — stable fingerprint + click-gated similar-issue searchwebEmpty-state free-scan button (P0.1)webExtract cleanChips to a tested module + tab/CR paste delimiterwebInbox triage — Abundance → Triage → Shortlist → Opt-in ScorewebMobile tap-targets ≥44px + FAB clearancewebOrange 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 mobilewebPin turbopack.root to prevent Windows postcss OOMwebPoint the 'Get one free' link at the free-AI-engine guidewebRestore the report-a-bug kit lost between the RC branch and main
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.mdagent-inboxQueue requests for the next sessionapplyPre-scan forms for knock-out questions before draftingcontactoShort-greeting variant for chat-style outreachemailFormal 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 identityfollowupSeed a pinned first follow-up when a row turns Appliedi18nAdd Korean career-ops modesi18nTranslate interview modes to French, closes #1489i18nTranslate interview modes to Spanish, closes #1490ofertaFlag 'remote' location contradicted by JD-body signalspatternsRecruiting-process friction signal at company levelpatternsTranscript-driven targeting correction (Step 1b) — closes #960pipelineOptional per-offer note in the pipeline writerportalsProbe non-ATS boards through the provider layerprofileCandidate contact-channel preference for outreach CTAs, closes #1556providersAdd Get on Board (getonbrd) zero-auth providerprovidersAmazon (amazon.jobs) and Avature zero-token providersprovidersAvature self-heals jobOffset→offset paginationprovidersBeesite (milch & zucker) + softgarden providersprovidersDassault Systèmes zero-token provider (Exalead XML)providersHonour api: on workday and smartrecruitersprovidersSAP SuccessFactors (RMK) zero-token providerprovidersSuccessFactors CSB strategy + bounded health-probe budgetregistryAdd startup boards pluginreserve-report-num--count N contiguous range reservationscanReport unreachable boards with error classification + doctor sweepverifyDetect duplicate and orphan reportswebConfig microcopy humanized (P1.5)webCost affordance — CostBadge muted (P1.6)webDedupe bug reports at write — stable fingerprint + click-gated similar-issue searchwebEmpty-state free-scan button (P0.1)webExtract cleanChips to a tested module + tab/CR paste delimiterwebInbox triage — Abundance → Triage → Shortlist → Opt-in ScorewebMobile tap-targets ≥44px + FAB clearancewebOrange 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 surviveinfraExempt web/ from the SYSTEM_PATHS coverage guard (isolation contract)merge-trackerDetect TSV score/status column order by header, closes #1427merge-trackerGuard tier-3 fuzzy dedup with req/job number, closes #1524onboardingAuto-copy template seeds in doctor --json (#782, #1369)pathsPrefer cygpath over wslpath in toBashPath()pdfUse CSS @page setup for marginspluginsHarden manifest path containment against symlink traversal- Prevent notion plugin from mangling slash-formatted scores
providersAvature parser tolerates two live tenant markup variantsprovidersHarden workday pagination against 429s, API caps, and dateless tenantsprovidersUpdate Glints API to v2-alc/searchJobsV3, document Jobstreet GraphQL migrationprovidersWorkday honors ctx.maxPages so the liveness probe stops cleanlyscanLoad .env credentials via optional dotenv importupdateMake updater timeout budgets configurableupdatePreserve local CLAUDE.md additions during /career-ops updateupdaterAdd .claude/settings.json to USER_PATHS, closes #1408webBump FOLLOW-UPS DUE tap-targets to 44px on mobilewebPin turbopack.root to prevent Windows postcss OOMwebPoint the 'Get one free' link at the free-AI-engine guidewebRestore the report-a-bug kit lost between the RC branch and main
New
- Add interview skill modes — plan, practice, debrief
applyATS auto-fill for Greenhouse / Ashby / Lever — prepare, don't submitdiscoverySeed company universe from VC portfolios (YC / a16z)…patternsATS channel yield analysis — algorithmic-monoculture awarepluginsSeed/successor model — community plugins can supersede a bundled referenceprovidersAdd HigherEdJobs RSS providerprovidersAdd JibeApply providerprovidersAdd NoDesk providerprovidersAdd Teamtailor zero-auth RSS providerregistryAdd career-ops-plugin-obsidian v0.1.0registryAdd career-ops-plugin-tavily v0.1.0registryAdd google-calendar plugin v0.1.0scanAdd seniority-tier classifier with optional skip_tiers fi…
Fixed
cv-templateKeep role titles from orphaning at page breaksdashboardMap tracker columns by header namefollowup-cadenceSchedule first responded follow-up with responded_initiallivenessAdd Ashby API rung so live jobs.ashbyhq.com postings aren't false-expiredpdfAnchor the output path-traversal guard to the repo root, not cwdpdfKeep a right gutter so right-aligned CV content isn't clippedpdfThread manifest metadata through render options
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 viewerdashboardHotkeys 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 providerprovidersAdd Hacker News "Who is hiring?" provider (Algolia API)providersAdd Himalayas providerprovidersAdd Jobicy providerprovidersAdd Jobspresso providerprovidersAdd Landing.jobs providerprovidersAdd Pinpoint ATS providerprovidersAdd Rippling ATS providerprovidersAdd The Hub providerprovidersAdd The Muse providerscanAdd detect-reposts.mjs repost detection from scan-history.tsvscanAdd JustJoin and NoFluffJobs providersscanPersist compensation to pipeline.mdscriptsAdd build:dashboard and serve:dashboard npm scriptsupdaterStructural SYSTEM_PATHS coverage check
Fixed
depsUpdate dependency playwright to v1.61.1evalBound research budget to a single-pass query capscanTighter company matching and dedup order for cooldown filtersecurityHarden batch tmpfile, PDF output path, and tracker cellstrackerShare header-name column mapping across all readers
New
- Add modes/_custom.md for user custom instructions
applyATS behavioural question matcher from story-bank.mdarchiveAdd archive-posting.mjs to save live job postings as PDFbatchAdd --limit flag + budget guidecliAdd first-class Codex supportcliAdd Grok Build CLI supportcliRegister Kimi as a supported CLI hostcvAdd opt-in profile photo for DACH/European CVsevalAdd openai-eval.mjs for any OpenAI-compatible endpointmodesAdd Danish (da) localemodesAdd EU SWE application calibration modemodesAdd recruiter-side application heuristicsollamaAdd local interactive Ollama evaluatorprovidersAdd Comeet ATS providerprovidersAdd Personio ATS providerprovidersAdd WeWorkRemotely RSS provider, closes #1241scanAdd early trust validation and job trust metadatascanPreserve job location in pipeline.md
Fixed
batchSingle-worker lock fallback + exit-127 shim-swap retrymodesBound subagent delegation to prevent research fan-out, closes #1235pluginDrop non-schema skills/permissions keys from plugin.jsonscanTrim title-filter keywords before the length checktemplateScope break-inside to atomic units to prevent CV pagination breaksupdaterResolve self-reexec checkout from the import closure, closes #1245
New
arbeitsagenturConfig-driven remoteMatch + server-side homeoffice filterbatchAdd --skip-pdf flag to batch-runner.shdashboardAdd in-viewer status picker overlaydashboardCustomizable columns with column pickerdashboardRecognize EUR/GBP/CHF pay and international cities in pipeline derivelivenessZero-token ATS API check before Playwright (closes #574)modesAdd Polish (pl) locale modesmodesOptional voice-dna.md writing guardrailportalsAdd verify-portals.mjs ATS slug validatorprovidersAdd BambooHR providerprovidersAdd Breezy HR scanner providerscanAdd --json output, --include-undated, and --shuffle to scan-ats-fulltrackerAdd `delete --num N` to remove an application row safely
Fixed
- Auto-create data/pipeline.md and harden Playwright doctor check
batchHarden status score handlingbatchUse awk instead of bc for score mathcontractExpand interview-prep/* coverage in DATA_CONTRACTdashboardRewrite 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 redirectrecruiteeKeep offer URLs on tenant custom domainsscanGuard title-filter keyword normalization against malformed configscanMatch short acronym title-filter keywords on word boundariestemplateEmit mailto:/tel: links for email and phone in CV headertemplatesDisable fi/fl ligatures for ATS-clean PDF text extraction
New
batchAdd --status and --watch progress monitoring to batch-runner.shcliAdd Antigravity CLI compatibilityi18nAdd Chinese language modes for China-market job seekerspdfRender Japanese CVs with a lang="ja" CJK font fallbackprovidersAdd Jobstreet and Glints providers for the Indonesian market, closes #1085providersAdd RemoteOK, Remotive, Working Nomads, IBM board providers, closes #1075providersPort Arbeitsagentur to an in-process providerscanAdd content/description filter for providers
Fixed
ashbyInclude secondaryLocations so EU-eligible roles surface, closes #1073batchReconcile pipeline.md inbox after batch runsdashboardArchetype regex matches English and Spanish reportsdashboardOpen Windows targets without shelldashboardReport last-contact in calendar days, not hours-since-midnightfollowupResolve report path relative to tracker directory, closes #1070followupUse the real application date from notes, not the eval dategeminiValidate evaluation report shapelatexLanguage-agnostic section validation + CJK guardmerge-trackerRequire company match for number-based dedup, closes #912pdfAuto-install Playwright chromium after updatepdfUse ATS-safe system fonts for clean CV text extraction, closes #1074pipelineAdd batch liveness sweep for unconfirmed entriesscanSanitize external metadata before writessecurityHarden local-parser against command/arg injection and scan-ats against SSRFtrackerPreserve notes column when rewriting rows without a trailing pipeupdateMaterialize skill entrypoints without symlinksupdaterGit-safety on abort + preserve user files on safety-violation rollback
New
- Add first-class OpenCode support alongside Claude Code
coverAdd optional salutation/greeting to cover letterscoverLoad _profile.md so personalization governs the letterdoctorWarn when Playwright MCP tools are not configuredtrackerMap tracker columns by header nametrackerSQLite derived index over applications.md — phase 1
Fixed
cvAlign certification org column width across rowsdepsUpdate npm dependencies to v1.61.0evalGate dead links before evaluation in oferta and auto-pipelinegenerate-pdfInline local fonts as data: URLs so they actually embedmerge-trackerSerialize concurrent tracker merges with a filesystem lockpdfWait for load instead of networkidle during render- Remove story-bank.md from git tracking
skillSurface latex mode in command menustestsRun tracker-mutating scripts with --dry-run in script checkstrackerPrevent dedup from deleting distinct same-company rolesupdateDistribute missing runtime pathsupdateMatch Release Please component-prefixed tags in version checkupdateRebuild dashboard binary after Go source changesupdateUse target updater manifest during apply
New
applyAdd preflight liveness and role-match gatebatchPause batch runner on Claude session limitscoverAdd cover letter generation modecvAdd build-cv-latex.mjs structured JSON to LaTeX rendererdashboardKeep discard reason visible in pipeline previewdashboardSortable 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 sourcefollowupRead cadence settings from profile.ymli18nAdd full Arabic language support and modesmodesAdd interactive interview onboarding subcommandscanAdd --rediscover-404 fallback for moved tracked postingsscanAdd configurable salary filtering to the zero-token scannerscanAdd portals.yml schema validatorscanAdd scan-ats-full.mjs — reverse-discover jobs from public ATS APIsscanAdd scan-history TTL and recheck policyscanAdd SolidJobs provider and job_boards support
Fixed
applyPreserve form field contractsbatchAppend profile context to worker promptsbatchIsolate workers from inherited MCP to prevent parallel deadlockbatchStop after min-score skip instead of falling through to completeddashboardResolve tracker-relative report links against the tracker directory, closes #779doctorSingle source of truth for onboarding state via doctor --jsonflakeDeclare systems so the devShell resolves on macOS, closes #334livenessStop false-expiring postings behind anti-bot wallsmerge-trackerRequire company match on exact entry-number dedupmerge-trackerUse token-union ratio in roleFuzzyMatch to stop cross-role dedup, closes #751patternsParse header-style and Detected-archetype formats in analyze-patternspdfReject CV section ordering that diverges from cv.md sourcepipelineAtomic report-number reservation for parallel workersreleaseAuto-sync VERSION via release-please generic extra-filereleaseSync VERSION file to 1.9.0securityClose SSRF guard bypasses in liveness-browserupdateBootstrap tracker-links.mjs and scaffolder/ for v1.8.x to v1.9.0 upgradesupdateRun curl version checks concurrently in check()updateUse curl in check() so updates work inside the Claude Code sandbox, closes #754
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.shdashboard/-key live search across pipeline rowsi18nAdd Turkish (TR) language modesinterview-prepSplit prep by interviewer audience- Make PDF auto-generation configurable via auto_pdf_score_threshold
scanAdd --verify flag to drop expired postings before pipeline appendscanAdd local-parser provider and agent skip rulesscanAdd optional always_allow tier to location_filter, closes #650scanAdd Workable, SmartRecruiters, Recruitee ATS parsers, closes #651
Fixed
batchWait and retry batch workers on rate limits, closes #505dashboardWidth-aware Markdown rendering with table wrapping in viewergeminiAuto-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 symbolpdfNormalize 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.0scaffolderDon't pre-create user config so agent onboarding triggers, closes #855scanBootstrap providers/ on update + harden greenhouse detect()scanRaise Ashby provider timeout + add backoff retryscanSurface websearch-handoff companies in the run summary, closes #747- Scope npm package as @santifer/career-ops
update-systemAdd tracker-links.mjs to SYSTEM_PATHSupdate-systemApply() safety violation reverts cleanly and releases lockupdate-systemBootstrap liveness-browser.mjs for v1.7→v1.8 upgrades, closes #704update-systemRollback() removes paths absent from backup branchupdateDistribute missing modes, locales and CLI configs via update-systemupdateTimestamp backup branches and roll back to the newest, closes #733
New
scanOptional location_filter in portals.yml + persist location to scan-history
Fixed
batchWorkers read modes/_profile.md and config/profile.yml, closes #534depsUpdate dotenv to v17gemini-evalInclude profile.yml and _profile.md in evaluation, closes #617gemini-evalRedact API key from error logs, harden summary parsinggemini-evalSwitch default model to non-deprecated endpoint, surface 429 guidance, closes #614manifestAlign plugin.json skills field with Claude Code plugin schemamerge-trackerPreserve short specialty acronyms, require non-baseline overlap, closes #633modesMake /career-ops deep respect user language, not JD languageportalsUpdate Weights & Biases entry to CoreWeave acquisitionreleaseSync VERSION file to 1.7.1scanValidate Greenhouse URL hostname against allowlist to prevent SSRFtemplatesAlign CV certification rows on a 3-column gridupdate-systemAllow writing-samples/README.md as system-owned fileupdate-systemBootstrap .agents/ for v1.6→v1.7 migrationupdate-systemDefensive VERSION parsing for release-please marker
Fixed
releaseSync VERSION file to 1.7.0update-systemInclude .agents/ in SYSTEM_PATHS
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 generationdashboardAdd Catppuccin Latte light theme with auto-detectiondashboardAdd manual refresh shortcutdashboardAdd progress analytics screendashboardAdd rejected and discarded pipeline tabsdashboardAdd vim motions to pipeline screendashboardAligned tables and markdown syntax rendering in viewerdashboardShow tracker IDs in pipeline list- Expand portals.example.yml with 8 dev-tools companies + 23 search queries
i18nAdd Japanese README + language modes for Japan marketlatexAdd 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 namesciGracefully handle missing dependency graph in dependency-reviewciGracefully handle missing dependency graph in dependency-review workflowciUse 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 variantsmerge-trackerFilter seniority and location stopwords + require overlap ratio in roleFuzzyMatchptRestore diacritical marks in PT-BR modesptRestore diacritical marks in PT-BR modesreleaseSync 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 staleupdate-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
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 generationdashboardAdd rejected and discarded pipeline tabsdashboardShow tracker IDs in pipeline listlatexAdd tectonic engine auto-detect with pdflatex fallbackportalsAdd Canada/Vancouver and automation companies to example template
Fixed
ciCorrect first-interaction@v3 input namesciGracefully handle missing dependency graph in dependency-reviewciGracefully handle missing dependency graph in dependency-review workflowlivenessDetect closed postings with applications-closed banner variantsmerge-trackerFilter seniority and location stopwords + require overlap ratio in roleFuzzyMatchptRestore diacritical marks in PT-BR modesptRestore diacritical marks in PT-BR modesupdate-systemCross-check GitHub Releases API when VERSION file is staleupdate-systemExpand SYSTEM_PATHS to cover all language modes and current scripts
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
New
- Add GitHub Actions CI + auto-labeler + welcome bot + /run skill
dashboardAdd Catppuccin Latte light theme with auto-detectiondashboardAdd progress analytics screendashboardAdd vim motions to pipeline screendashboardAligned 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