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.
v1.21.0
LatestNew
applyWarn before reapplying to a repeat company, closes #1920cover-letterSupport --format and --report CLI arguments, closes #1828dashboardManifesto shortcut, help entry and footer linkemailAdd confirmed-time no-show follow-up variant, closes #1859interview-prepCross-reference coffee chat notes against interview intel, closes #1940interview-redflagFlag scope/compensation mismatch as a separate fifth dimension, closes #1942interview-redflagSuggest a ready-to-copy blacklist row at Reconsider level, closes #1854interview/planWire the existing Panel Intel table into multi-panelist rounds, closes #1857ledgerImmutable n: ordinal per signature + first-contribution question for new signerslivenessAdd Workday to the zero-token ATS liveness API rungofertaBlock G signal for benefits terminology country mismatch, closes #1935onboardingRoute to the manifesto from the README and the first successful scanpdfAdd role name to the tailored PDF filename for multi-role trackingprovidersAdd Oracle Recruiting Cloud zero-auth providerreportsUnified Risk Summary block joining the five company-risk signals, closes #1737salary-gapTrack compensation figures stated per interview round, closes #1852scanPersist and surface the scanner trust signal to pipeline and history, closes #1743scanTrack portal health over time and surface coverage decay, closes #1744
Fixed
cv-templateKeep role header with its bullets when a location line is presentdoctorWarn when Node is below 22.5 instead of passing silently, closes #1829envrcOnly load the Nix flake when Nix is installedinterview-redflagDrop GitHub PR references from candidate-facing output templatesledger-botMake the first-contribution confirmation copy match what shipsledger-botRestore the 'done' confirmation now that the certificate render is liveonboardingRelay the manifesto note in agent-mediated updatespdfDrop empty Projects section instead of rendering a bare headerrole-matcherKeep base titles distinct from specialized-suffix siblings, closes #1881scan-ats-fullRespect data/blacklist.md, closes #1911scanQuiet dotenv so --json stdout stays parseable, closes #1906- Unify atomic report number allocation, closes #1733 #1801 #1835 #1895
update-systemAttribute the post-update manifesto link (utm_source=updater)update-systemSurface commit failures instead of silently swallowing them, closes #1844upskillKeep fetched JD text as a string in the targeted --url-text path, closes #1894
New
onboardingSurface the CareerOps Manifesto after updates and setup
Fixed
upskillCorrect inverted known-skill suppression in targeted mode
New
batchApply compensation reliability checks to batch workersbrowser-extractConfigurable jd-mode text cap via --max-charscalibrationFunnel-velocity.mjs — own funnel vs market benchmarks (#1693, part 1)cvFact validator — block invented metrics in generated CVsdashboardAdd Spanish (es) locale to the i18n catalog, closes #1764dashboardDiscard reason picker with learning loop, closes #1380dashboardI18n extraction for the Go TUI (split from #1666)emailATS-broken fallback scenario — recover a stuck applicationi18nAdd Traditional Chinese (zh-TW) modesi18nChinese salary reliability checks — zh mirror of the compensation tiersimg-to-pdfConvert a screenshot into a PDF for ATS uploadsinterview-prepURL entry path for a role that was never evaluated, closes #1816invite-matchFuzzy-match interview-invite emails to tracker entries- Language.output preference — output language decoupled from market modes
latexOpt-in latex-tex in-place tailoring of user-owned .tex CVs- Make CLAUDE.md a thin @AGENTS.md wrapper — single canonical agent spec
modesWire the opt-in CLI extractor into the oferta + auto-pipeline JD pathsofertaBlock G signal 7 — AI-buzzword vs infrastructure mismatchofertaCompany-type + compensation-reliability tiers in evaluationsopenrouterPrompt-cache the static system prefix via cache_controlpdfDeterministic HTML CV renderer to cut PDF-step token burnpdfJD skill-gap checker before CV generation, zero-LLM, closes #1558pipelineOpenai-tailor.mjs — headless CV tailoring for the no-agent pathproviders4dayweek auto-detect with spoof-safe host matching (#1657 follow-up)providersAdd LaraJobs zero-auth RSS providerprovidersAdd Meituan careers providerprovidersAdd Tencent careers zero-auth providerregistryRegister serper and theirstack provider plugins (#1645, #1697)registrySplit plugins-registry.json into per-plugin filesreply-watchPaste-reply.mjs manual input path for users without Gmail, closes #1802scanData/blacklist.md — user-owned do-not-apply listscanOpt-in max_posting_age_days freshness gatescanPersist provider postedAt to pipeline and scan-historyscanSuppress duplicate roles via company aliases- Spend_tier config for model-agnostic model routing + batch pre-screen gate
templatesConfig-selectable CV and cover-letter templatestrackerAssessment-log.mjs — skills-assessment events with staleness signaltrackerRecognize "—"/"-" as valid score-cell N/A sentinels, closes #1799upskillAggregate skill-gap analysis from tracked reports (#1520, phase 1)upskillTargeted single-posting mode with SSRF-guarded fetch, closes #1739
Fixed
analyzerResolve report paths relative to the tracker filecoverResolve the cover-letter template through the shared resolver- Gitignore data/active-interviews.md (user interview data)
- Ignore logo cache directory
livenessTreat off-posting redirects as uncertain, not active- Load profile and custom rules deterministically in all mode paths
merge-trackerPreserve empty interior cells in tracker-row parsingpdfClean temporary HTML when browser launch failspdfRender markdown bold in CV summary as (ATS-safe)portalsValidator accepts provider-plugin ids like the runtime doesprovidersSupport explicit api: override for ashby/lever with host-pinned guardsreserve-report-numSupport report numbers past 999scanRestore browser-like headers on Workday CXS requests, closes #1811templatesAllowlist the template format to prevent path traversaltestNormalize CRLF at read time for doc assertionstestsClose CodeQL command-injection findings in the test harnesstestsSkip web-reader tests when web/ is absent on core-only installstrackerDetect and prevent duplicate tracker # numbersupdate-systemAdd .claude/hooks/ to USER_PATHSupdate-systemKeep the updater self-loading to survive old→new re-exec
New
patternsPer-agency advance-rate analysis from the Via channeltrackerVia channel — end employer vs recruiter/agency intermediary
Fixed
depsUpdate npm dependenciestrackerRetrofit remaining positional readers onto the shared header-aware parserweb44px tap-targets at the component levelwebContrast tokens — AA across both themeswebPortals copy + analytics semanticswebUx-audit cleanup — CostBadge global CSS + last sub-44 stragglers
New
- Classify application replies and generate review digest, closes #1585
dashboardHired canonical status + job-landed celebration flowi18nAdd German translations of interview modesi18nAdd Hindi language support with dedicated modes and documentationi18nAdd Indonesian (id) modesinterview-prepStructured Panel Intel tableinterviewCompany red-flag detector from transcript signal- Match employer reply candidates to application tracker, closes #1584
ofertaEmployment classification risk signal in Block G, closes #1630- Offer-prep mode — contract reading companion at Offer stage, closes #1608
offer-prepNegotiation reply-draft step — draft-only email from Items to raisepatternsPer-agency advance-rate analysis from the Via channelpdfAllow intentional CV section reordering via --allow-reorderprovidersAdd Lever EU instance (jobs.eu.lever.co)providersCornerstone OnDemand (csod) + RheinmetallprovidersEchoJobs zero-auth JSON aggregator providerprovidersPhenom People (phenom) + Radancy TalentBrew (radancy)providersTKMS, Heckler & Koch, and Deutsche Bahn providersregistryAdd career-ops-plugin-markdown v0.1.0salaryMode wiring — advertised_comp + observation appendssalarySalary-gap.mjs — append-only compensation observation analyzerscanJD-content fingerprinting — flag agency+direct cross-listings, closes #1597scanOpt-in CLI page extractor (browser-extract.mjs)scanPersist per-run scan counters to data/scan-runs.tsvscanScope content_filter per title-category via by_title_keywordscoringCulture-screen dimension with structural cappingstatsLifetime pipeline stats aggregator- Titles mode — suggest adjacent job titles from the CV, closes #1632
trackerSet-status.mjs — canonical CLI for tracker status updates, closes #1428trackerVia channel — end employer vs recruiter/agency intermediary
Fixed
dashboardDuplicate tracker headers resolve last-occurrence to match JS readerdepsUpdate npm dependenciesmodesEnforce modes/_custom.md overrides across mode files, closes #1618modesWire modes/_custom.md into the read path — house rules were write-onlypdfExplain the agentic HTML flow in generate-pdf.mjs usage output- Prevent role-matcher from collapsing different seniorities, closes #1616
scan-ats-fullReject unrecognized CLI flags with usage helptrackerRetrofit remaining positional readers onto the shared header-aware parserupdateRaise local git timeout default 30s -> 120s for cloud-evicted treesweb44px tap-targets at the component levelwebContrast tokens — AA across both themeswebPortals copy + analytics semanticswebUx-audit cleanup — CostBadge global CSS + last sub-44 stragglers
New
- 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