Skip to content
CAI
Software that uses CAICheck a score

santifer/career-ops

50.4

Weak · 25 September 2026

134.3k

lines of production code

JavaScript

with TypeScript, Go

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a local-first, CLI-driven career operations toolkit that automates job search workflows including discovery, evaluation, and application tracking. It features a modular plugin architecture for ingesting leads from sources like email and job boards, and an AI-assisted pipeline for scoring roles and generating tailored CVs and cover letters. The system provides both a terminal-based dashboard and an experimental web UI for managing applications, with a strong emphasis on data privacy by keeping processing and storage local.

Features

Add Notion plugin to mirror application tracker

Introduces a new opt-in Notion plugin that mirrors your local application tracker to a Notion database and allows searching for job leads. The plugin exports tracker data (company, role, status, score) to an 'Applications' database and supports reading records back into the pipeline. It includes a fix to correctly parse slash-formatted scores (e.g., '4.2/5') to prevent data mangling during export.

plugins/notion · high confidence

Added plugin template scaffolding for community extensions

Introduced a new template structure under plugins/\_template to support the opt-in plugin system, providing the foundational files (manifest, entry point, documentation, and smoke tests) that define how community plugins are structured, installed, and governed within the career-ops ecosystem.

_plugins/\template · high confidence

Batch processing now supports multiple agent CLIs and advanced control flags

The batch runner has been upgraded from a Claude-only orchestrator to support multiple agent CLIs (Claude, OpenCode, Gemini, Qwen) via the new --cli flag, with model selection now configurable via --model and spend\_tier resolution. The batch workflow gains granular control with new flags: --limit to cap the number of processed offers, --min-score to skip PDF generation and tracker lines for low-scoring offers, --skip-pdf to disable PDF output entirely, and --resume-paused to recover offers halted by session or rate limits. Additionally, the runner now includes --status and --watch for progress monitoring, and --rate-limit-sleep for configuring adaptive retry delays. The underlying prompt has also been updated to support a complete A-G evaluation structure, agency confirmation gates, and language output preferences.

batch · high confidence

Creation of empty data directories

The data directory structure has been initialized with empty placeholder files (.gitkeep) for the root data folder, the offers subdirectory, and the parser-output subdirectory. This ensures these directories are tracked by version control and exist in the repository structure, likely to support future data storage or output generation for offers and parser results.

data · high confidence

Dashboard introduces light theme, progress analytics, and robust URL opening

The Go TUI dashboard now supports a Catppuccin Latte light theme with automatic detection based on the terminal background, alongside new screens for progress analytics and stats (score quality and seniority mix). It also adds a manual refresh shortcut, a discard reason picker with a learning loop, and improved reliability for opening URLs on Windows and Unix systems by surfacing failures in the UI instead of stderr.

dashboard · high confidence

Go TUI Dashboard i18n infrastructure and Spanish locale support

The dashboard's internal internationalization system has been established to support the Go TUI, introducing a static translation catalog that localizes UI strings, labels, and formats. This change adds Spanish (es) as a supported language alongside existing English and Turkish locales, enabling users to switch the interface language at runtime. The implementation includes runtime language management and comprehensive test coverage for status labels, relative date formatting, and sort mode labels across all supported languages.

dashboard/internal/i18n · high confidence

Initial release of the experimental web UI

The \web/\ directory is introduced as an opt-in, local-first web interface for career-ops, built on Next.js. It provides a view over the user's existing CLI data files (pipeline, applications, reports) without a separate database or parallel engine. Key capabilities include a sortable pipeline tracker, an AI-assisted job exploration scanner, and an apply flow that pre-fills forms but requires manual submission. The UI is gated by an origin allowlist for the local API and includes safety measures to prevent automatic submissions or unauthorized agent writes. This is an alpha feature; the core CLI workflow remains unchanged if the web UI is not used.

web · high confidence

Interview session transcript storage and format specification

The interview-prep module now includes a defined structure for storing machine-readable interview transcripts. A new README in the sessions directory specifies that transcripts are saved as individual Markdown files containing speaker labels, metadata (such as company, role, round type, and source), and optional competency tags. This change establishes the data format for outputs from 'debrief' and 'practice' modes, ensuring downstream analysis tools can parse interview history consistently while keeping actual session content gitignored for privacy.

interview-prep · high confidence

Introduce 4 Day Week provider and provider authoring guide

Users can now scan the 4 Day Week job board (4dayweek.io) for reduced-hours roles via a new zero-auth provider that fetches its public JSON API, enforces strict host validation, and handles pagination. The \providers/\ directory also includes a new \ADDING\_A\_PROVIDER.md\ guide detailing the module contract, mandatory SSRF hardening, and defensive parsing requirements for future contributions.

providers · high confidence

Introduce AI-powered web search for job discovery

The Explore page now offers an 'AI search' mode alongside the existing free ATS network scan. This new capability allows users to describe a role in plain language via a natural-language input box, which triggers an AI agent to hunt the public web for matching opportunities. The UI includes a mode toggle to switch between the deterministic scan and the AI search, a live 'reasoning' panel that streams the AI's thought process, and a dedicated 'hunting' view with animated states. The feature integrates with the existing pipeline by surfacing unverified AI-found candidates as discovery cards that can be evaluated and added to the user's pipeline.

web/src/components/explore · high confidence

Introduce Inbox Triage workflow with free filtering and token-gated scoring

The inbox now features a dedicated triage interface that lets users filter incoming job postings using free, client-side facets (freshness, source, seniority, location, and keywords) before deciding which roles to save to a shortlist. The shortlist tray displays the estimated token cost for scoring and requires an explicit confirmation to spend tokens, ensuring no surprise charges. Each triage row shows a clear 'not scored' state for unprocessed items and an A–F badge once scoring completes, with the ability to skip or undo skips to manage the inbox.

web/src/components/inbox · high confidence

Introduce local job tracking and improved error feedback in the web UI

The web interface now tracks background jobs locally using a new \JobsProvider\ and \WorkerCard\ components, persisting job history in \localStorage\ so that interrupted or reloaded sessions are marked as errors rather than lost. Users will see cause-specific error hints (via \jobErrorHint\) instead of generic authentication prompts when jobs fail, and fencing notices are now displayed explicitly in the job card. The UI also displays per-run token costs and USD estimates for completed jobs, and humanizes internal agent tool steps (e.g., 'WebFetch' becomes 'Reading the posting') to provide clearer progress updates.

web/src/components/jobs · high confidence

Introduce local-first web UI with AI assistant and automated application workflows

This change introduces the experimental local-first web UI (opt-in alpha), providing a browser-based dashboard for job hunting. It adds an AI assistant (/api/assistant) that acts as a career co-pilot, capable of navigating the UI, filtering pipelines, evaluating jobs, and managing profile settings via a gated action registry. The UI includes an Analytics page to visualize pipeline stages, scores, and company activity. A comprehensive application workflow is added, allowing users to open, pre-fill, and drive application forms through agentic sessions (/api/apply/\*), with tailored CV and cover letter PDFs served via dedicated routes. The system is local-first, delegating heavy lifting to the user's own installed AI CLIs in headless mode, ensuring data privacy and avoiding external API keys.

web/src/app · high confidence

Introduce local-first web UI with application workflow and assistant

Adds the core local-first web interface components, including the AppShell layout, a mobile-responsive navigation drawer, and a floating Back to Top control. Introduces the Apply workflow, featuring an ApplyButton that gates access until a tailored CV PDF is ready, and an ApplyView form-proxy that reads, pre-fills, and displays employer application forms in plain language for user review. Adds an AssistantConsole for interactive help and navigation, a ConfigForm for managing local AI engine settings, and UI components for the CV editor, company logos, and job tracker management.

web/src/components · high confidence

Introduce opt-in plugin system for external integrations

Users can now extend career-ops with an opt-in plugin layer for integrations requiring API keys or external service access, such as the bundled Apify provider. Plugins are disabled by default; to enable them, users must add a configuration block in \config/plugins.yml\ and provide required environment variables in their \.env\ file. The system includes a curated registry for community plugins, integrity pinning via \plugins.lock\ to detect tampering, and strict egress controls (SSRF protection) for network requests. Bundled plugins like Apify serve as reference implementations, while users can install their own in the gitignored \plugins.local/\ directory.

plugins · high confidence

New ATS-friendly single-column CV template pack

A new template pack designed for Applicant Tracking Systems has been added to the templates/ats directory. This includes a main layout file (cv-template.ats.html) and partials for core sections (competencies, education, experience), featuring a single-column, linear structure with standard HTML tags and inline styles to ensure maximum compatibility with ATS parsers.

templates/ats · high confidence

New CostBadge component for displaying cost semantics

A new CostBadge component has been added to the web UI to visually indicate cost status using specific color and icon semantics: green with a leaf icon for free/positive actions, and a muted neutral tone with a coin icon for spend (token usage). This component ensures that spend indicators do not conflict with primary action colors (orange) and maintains accessible contrast across both light and dark themes.

web/src/components/cost · high confidence

New Follow-up Tracker with logging, history, and cadence settings

The web interface now includes a dedicated Follow-up Tracker page that displays a sortable, filterable list of applications with urgency indicators and next-touch dates. Users can log follow-up interactions (date, channel, contact, notes) via a dialog, pin custom next-follow-up dates to override the automatic schedule, and configure global cadence rules (e.g., days between nudges) that are saved to config/profile.yml and shared with the CLI.

web/src/components/followups · high confidence

New Gmail plugin to ingest job leads from email

A new bundled Gmail plugin has been added that pulls job leads from a specified Gmail label into the pipeline. It uses OAuth credentials (GMAIL\_CLIENT\_ID, GMAIL\_CLIENT\_SECRET, GMAIL\_REFRESH\_TOKEN) to fetch messages, extracts clean URLs from the email body, and validates authenticity via DMARC checks to prevent spoofed emails. The plugin filters out page assets (like logos) and tracking links, ensuring only relevant job postings are ingested. Configuration is done via config/plugins.yml, specifying the label and number of days to look back.

plugins/gmail · high confidence

New H-1B Sponsor Check plugin for US role evaluation

Added the \h1b-sponsor\ plugin, which allows users to verify an employer's actual US Department of Labor sponsorship history (LCA, PERM, and Green Card filings) before applying to US-based roles. The plugin resolves a company name to a sponsorship tier (strong, moderate, staffing-shop, weak, none, or unknown) based on filing volume, recency, and secondary-entity share. It operates primarily via a local, offline index downloaded from public DOL data, ensuring that sensitive visa-need queries never leave the user's machine by default; an opt-in HTTP backend is available via the \H1B\_API\_BASE\ environment variable. The plugin integrates with the \oferta\ evaluation workflow to attach factual sponsorship signals to Block G and includes a CLI for manual checks and an agent skill for automated usage.

plugins/h1b-sponsor · high confidence

New UI component library for dashboard elements

Added a new set of UI components (Badge, Button, Card, StatCard) to the web application. These components provide consistent styling for status indicators, interactive controls, panels, and statistical tiles, incorporating specific design tokens like brand gradients, rounded corners, and accessibility-focused tap targets.

web/src/components/ui · high confidence

New agentic form interpretation and drive capabilities for the Apply page

The Apply page now includes an agentic fallback that uses the LLM to interpret live job-application forms when deterministic extraction fails, and a drive loop that navigates the browser to reach or fill application forms. This adds new files in web/src/lib/apply (agent-interpret.ts, drive.ts, answer-prompt.mjs, cover.ts, cv-match.mjs, cv-selection.mjs, cv.ts, diagnose.ts, exit.mjs, extract.ts) that enable AI-assisted form parsing, safe CLI execution with fenced permissions, tailored cover-letter resolution, and robust navigation/diagnosis. Users benefit from improved form detection and filling on complex ATS pages, with clearer error messages and safer agent behavior.

web/src/lib/apply · high confidence

New analytics screens and pipeline view enhancements with comprehensive test coverage

The dashboard now includes a Progress screen for funnel and rate analytics, and a Stats screen for dimension-breakdown charts (archetypes, pay, quality/seniority distributions) with improved two-column layout and scroll clamping. The pipeline view adds sortable columns for Location, Pay, and Last-contact, a live /-key search, a POSTED column for requisition age, and hotkeys to view (d) and regenerate (D) the CV PDF. The integrated report viewer now supports markdown rendering with width-aware table wrapping, a cover letter hotkey (L), and an in-viewer status picker that pins the current status. These changes are accompanied by extensive tests for row width calculations, panel layout constraints, flash sanitization, and viewer behavior.

dashboard/internal/ui · high confidence

New automation scripts for syntax checking, ATS export, and follow-up sweeps

Added three new scripts to the repository: \check-syntax.mjs\ validates the syntax of all \.mjs\ files using \node --check\ to catch errors early; \export-ats-text.mjs\ parses markdown CVs and YAML profile data into a structured, sanitized plain-text format optimized for copy-pasting into Applicant Tracking System forms; and \followup-sweep.sh\ provides an unattended automation recipe (designed for launchd or cron) that generates follow-up email and LinkedIn drafts based on application status without sending them automatically.

scripts · high confidence

New declarative HTML section partials for CV templates

The templates/sections directory now includes declarative HTML partials for rendering CV sections, including Awards, Certifications, Competencies, Education, Experience, Projects, and Skills. These new files define the structure and placeholders for each section, allowing for more flexible and customizable rendering of CV content in HTML format.

templates/sections · high confidence

New example files and documentation for career-ops data formats

Added a set of reference files in the examples directory to demonstrate expected data structures and conventions for users creating their own career-ops configurations. This includes \cv-example.md\ and \resume-example.md\ showing standard and US-market resume formats, \article-digest-example.md\ for project summaries, and \sample-report.md\ for evaluation outputs. A new \dual-track-engineer-instructor/\ folder provides a complete profile configuration (\profile.yml\) and CV (\cv.md\) for candidates with hybrid engineering and teaching careers, including guidance on handling multiple archetypes and compensation ranges. Additionally, \ats-normalization-test.md\ serves as a regression fixture for Unicode normalization in PDF generation, and the \latex-tex/\ directory contains \.tex\ fixtures for testing LaTeX content extraction and patching.

examples · high confidence

New local document intake folder for profile updates

A new \documents/\ directory has been added to support local profile intake. Users can now drop source files (CVs, LinkedIn exports, diplomas, references) into specific subfolders (\cv/\, \linkedin/\, \diplomas/\, \references/\). The system reads these files locally to propose source-annotated additions to the profile configuration, ensuring data privacy by keeping user documents on the machine. The process is idempotent, tracking processed sources to avoid re-proposing existing content.

documents · high confidence

New local-first CV ingestion and parsing workflow

Introduces a new CV ingest component that allows users to paste text or drop .md/.txt files for immediate local parsing, while supporting PDF and other formats via a configured local AI CLI. The component guides users through input, parsing, and review phases, then saves the parsed content and automatically navigates to the Explorer with pre-filled filters to trigger an initial job scan.

web/src/components/cv · high confidence

New local-first home dashboard with action queues

The home page now features a local-first 'Today' dashboard that consolidates your job search into a single action queue. It displays three key sections: 'Follow-ups due' for tracking pending communications, 'Awaiting your decision' for scored roles needing a status update, and 'Fresh matches this week' from free market scans. The interface includes a first-run takeover for initial CV upload, ensures all interactive elements meet 44px mobile tap-target standards, and uses Next.js Link components for navigation to improve routing performance.

web/src/components/home · high confidence

New npx-based one-command installer for career-ops

Users can now install the career-ops workspace with a single command (npx career-ops init), which clones the latest release, installs dependencies, and bootstraps skill entrypoints for supported AI coding tools including Claude Code, Gemini CLI, Codex, Qwen Code, OpenCode, GitHub Copilot CLI, Antigravity CLI, and Grok Build CLI. The installer detects which CLI is available on the user's PATH to tailor the post-install instructions, and deliberately avoids pre-creating configuration files (cv.md, profile.yml, portals.yml) so that the conversational onboarding experience triggers on first launch. It also handles filesystems that do not support symlinks by materializing skill entrypoint files.

scaffolder/bin · high confidence

New template system with named CV variants, cover letters, and jurisdictional data tables

The templates directory now includes a comprehensive set of system-layer files for career operations. Users can generate ATS-optimized CVs using five named HTML variants (Modern, Compact, Executive, Leadership, Jake) alongside a base template and a US-focused Resume variant, all selectable via configuration. LaTeX support has been expanded with a CJK-specific template requiring the Tectonic engine for Chinese, Japanese, and Korean typography. A new HTML cover letter template with themeable tokens is also provided. Additionally, the system introduces jurisdictional data tables for agency licensing, protected grounds, and AI screening disclosures to support legal compliance checks, along with example configurations for portal scanning, application states, and company blacklisting.

templates · high confidence

New token usage tracking and cost estimation utility

A new \utils/token-tracker.mjs\ module has been added to centralize token counting and cost calculation for AI model interactions. This utility introduces a \TokenAccumulator\ class that tracks token usage per step (such as 'scan', 'evaluation', and 'pdf payload') and a \formatBreakdown\ function that generates a detailed report of prompt/completion tokens, cached token usage, and estimated costs. It also includes a \RATES\ configuration object with pricing for MiniMax, OpenAI, Gemini, DeepSeek, and Anthropic models, along with a \normalizeOpenAIUsage\ helper to standardize API response formats, replacing previously duplicated logic across evaluator call sites.

utils · high confidence

New web/src/lib module suite for inbox, PDF, and CLI management

This change introduces a new set of modules in web/src/lib to handle core web application logic. It adds act-envelope.mjs and cv-envelope.mjs to parse structured output envelopes from AI agents, ensuring safe and robust extraction of action and PDF content. career-ops.ts centralizes data access for the inbox, applications, and PDF indexing, while cli-fencing.mjs and cli-fencing-probe.mjs enforce strict permission boundaries for headless CLI agents like Codex and Claude. Additionally, clean-chips.mjs improves keyword handling with a higher cap, and clis.ts expands supported AI runtimes to include Grok Build CLI, OpenCode, and others, with improved detection logic.

web/src/lib · high confidence

Seed startup discovery from VC portfolios (Y Combinator, a16z)

Added a new seeding mechanism that pulls public company lists from Y Combinator and Andreessen Horowitz (a16z) to instantly cover hundreds of startup companies in the job search pipeline. This feature introduces \seeds/vc-portfolios.mjs\ and accompanying documentation, allowing users to run \scan-ats-full.mjs --seeds yc\ or \--seeds a16z\ to discover ATS openings at these backed companies without waiting for them to appear in standard ATS directories. The implementation includes safe parsing, slug validation, and SSRF guards, integrating these new 'seed' companies into the existing discovery flow alongside tracked companies from \portals.yml\.

seeds · high confidence

Behavioural changes

The Apply page now allows users to navigate back to the page they came from after starting an application, and it records the application attempt in the user's history. This is achieved by introducing a new \ApplyProvider\ context that manages the application session state, including tracking the \from\ path and application identifier (\n\), and a new \ApplyBackdropMount\ component that renders a visual backdrop during the application process.

web/src/components/apply · high confidence

Dashboard data layer: concurrency safety, parsing fixes, and analytics logic

The dashboard's internal data layer now enforces shared-file locking on tracker writes to prevent race conditions when multiple processes update applications concurrently. Parsing logic has been hardened to correctly map tracker columns by header name (supporting localized headers and reordered columns) and to resolve report links relative to the tracker directory. The status update mechanism was fixed to rewrite only the Status cell, preventing corruption of other columns (e.g., Company names containing status substrings). Additionally, the progress funnel metrics now correctly include 'Hired' applications in all preceding stages, and the stats view distinguishes between tracked and evaluated counts to avoid misleading labels. PDF resolution now safely handles manifest entries and falls back to glob matching for company slugs, while pay derivation explicitly supports international currencies (EUR, GBP, CHF) and avoids misinterpreting funding/valuation figures as pay.

dashboard/internal/data · high confidence

Enhanced bug-report diagnostics and deduplication via stable fingerprints

The in-app bug reporter now captures richer diagnostic data, including core version, API error status, and structural data-shape counts (without exposing personal content), and generates a deterministic fingerprint based on the current route and recent error classes. This fingerprint enables the reporter to detect and suggest similar existing issues before filing, reducing duplicate reports, while the new report format ensures consistent, privacy-safe data for downstream triage tooling.

web/src/lib/report · high confidence

Local dashboard API now enforces same-origin and loopback access by default

A new proxy middleware in web/src/proxy.ts now gates all /api requests, restricting access to same-origin and loopback addresses by default to mitigate CSRF and LAN reachability risks. Users can opt-in to allow additional trusted hosts or origins via the CAREER\_OPS\_WEB\_ALLOWED\_HOSTS and CAREER\_OPS\_ALLOWED\_ORIGINS environment variables, which is necessary for local companion clients like browser extensions that originate from chrome-extension:// URLs.

web/src · high confidence

New pipeline state management and client-side CV quality checks

This change introduces a new \PipelineProvider\ component that manages application and inbox state via a React context, fetching data from the \/api/pipeline\ endpoint and refreshing on window focus to keep the UI in sync. It also adds a \cvReadiness\ utility that performs deterministic, client-side checks on CV content (word count, experience, and skills) to provide advisory hints without blocking saves, alongside a \parseCvStream\ function to handle the parsing of CV ingest stream markers.

web/src/components/pipeline, web/src/lib/cv · high confidence

Upgrade test fixtures for state v1.18 with new application tracking fields

The test fixtures in test-fixtures/upgrade have been updated to include state-v1.18, introducing behavioral changes to the application tracker and reporting. The applications tracker now includes a 'Via' column to record referral sources (e.g., 'Hays'), and the expected output schema reflects this with 'has\_via\_column': true. Additionally, a new 'salary-observations.tsv' file tracks salary data, and the expected schema now includes 'salary\_observations': 2. The generated reports have also been enhanced with a 'Machine Summary' section containing structured YAML data about the role fit, risks, and next steps.

test-fixtures · high confidence

Fixes

Added .gitkeep files to batch/logs, jds, and output directories

Empty .gitkeep files have been added to the batch/logs, jds, and output directories. This ensures these directories are tracked by version control even when they are empty, preventing them from being ignored or removed by git.

batch/logs, jds, output · high confidence

Beta bug reporter now alerts users when duplicate search fails

The beta bug reporter's duplicate-check feature now distinguishes between a successful search that found no results and a search that failed to run (e.g., due to API errors or network issues). Previously, failures were silently treated as 'no similar issues found,' hiding live breaks from users. This change ensures users are informed when the system cannot verify if a bug already exists, preventing false negatives.

web/src/lib/beta · high confidence

Fixes Today queue ordering and status matching for awaiting decisions

The Today page now correctly displays scored but undecided applications by extracting a new \pickAwaitingDecision\ module that filters using the canonical status alias table (supporting all international variants like Turkish or Spanish) instead of a fragile English prefix regex, and sorts results by newest date first with score-based tie-breaking. This ensures the queue is deterministic and visible regardless of tracker language, replacing the previous behavior where results depended on arbitrary data row order.

web/src/lib/home · high confidence

Fixes for logo resolution, data root alignment, and follow-up urgency

The web application now mirrors several core logic modules to resolve long-standing discrepancies between the web UI and the local core. Company logos are resolved using a Unicode-aware ASCII folding algorithm (replacing a previous method that incorrectly deleted accented characters), and cache keys have been bumped to v4 to invalidate stale misses. The data root resolution now strictly matches the core's precedence rules, preventing the web and CLI from reading different data directories. Additionally, the follow-up dashboard now correctly filters by urgency (urgent/overdue) rather than tracker status, and a new file-locking mechanism prevents race conditions between the web UI and the core's seeder when writing follow-up data.

web/src/lib/core · high confidence

New shared library modules for CLI, CV, and evaluation logic

This change introduces a suite of new utility modules in the \lib/\ directory to consolidate and fix scattered logic across the codebase. \cli-flags.mjs\ provides shared helpers for robust CLI argument parsing, fixing issues where flags like \--flag=value\ were silently ignored or unrecognized flags fell through to default behavior. \ascii-fold.mjs\ standardizes name-to-ASCII folding for company matching, correcting bugs where accented characters caused mismatches. \cv-payload-schema.mjs\ defines a strict contract for CV payload keys, preventing silent data loss when builders encounter unknown or misspelled section keys. \context-budget.mjs\ implements token budget management and priority-based compression for LLM evaluators to stay within context limits. \is-main-module.mjs\ fixes a bug where CLI scripts failed to run when accessed via symlinks. Other new modules include \latex-content.mjs\ and \latex-escape.mjs\ for improved LaTeX CV generation, \local-today.mjs\ for correct local timezone date handling, \gemini-node-floor.mjs\ for enforcing Node.js version requirements for the Gemini integration, and \golden-budget-analysis.mjs\ for static token budget analysis.

lib · high confidence

Restored and enhanced the 'Report a bug' feature in the beta banner

The beta banner now includes a fully functional 'Report a bug' workflow that was previously missing. Users can click the button to open a pre-filled GitHub issue form, which includes a client-side search for similar existing issues to help prevent duplicates. The feature respects user privacy by only sending data after explicit confirmation and includes specific error handling to inform users if the duplicate check fails, ensuring they can still submit their report.

web/src/components/beta · high confidence

Test coverage

Added provider and shared-module test coverage; Added visual regression and PDF reading-order tests for CV templates; Expanded test fixtures for deduplication, title matching, and provider parsing; New test suite for core application logic and analysis scripts; Test infrastructure and coverage for web application logic.

Dependencies

Major dependency upgrades and scaffolder package introduction

This release introduces the \@santifer/career-ops\ scaffolder package for one-command installation and updates core dependencies across the project. The main \package.json\ upgrades \playwright\ to 1.63.0, \js-yaml\ to 5.3.0, \dotenv\ to 17.0.0, and adds \@google/generative-ai\ 0.24.1. The \web\ sub-package is updated to use Next.js 16.3.3, React 19.2.5, Tailwind CSS 4.2.2, and PostCSS 8.5.18, with overrides applied to resolve nested \postcss\ and \sharp\ security advisories. The \dashboard\ Go module upgrades to Go 1.25.0 and bumps \github.com/charmbracelet/x/ansi\ to 0.11.8 and \golang.org/x/sys\ to 0.47.0.

(dependencies) · high confidence

Playwright browser automation dependency upgraded to v1.63.0

The project's Playwright dependency has been updated from version 1.62.1 to 1.63.0. This upgrade is reflected in the dependency manifests and Dockerfile pins, ensuring that the browser-based job search scanning and liveness checks run against the latest stable Playwright release.

(repo-wide) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 36 → 50 (+14.0)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 30 → 33 (+2.9)
  • Architecture 86 (new)
  • Maturity 75 → 72 (-3.2)
  • Readiness 25 → 75 (+49.3)
  • Security 64 → 78 (+14.3)
  • Accessibility 55 (new)

Resolved (371)

  • (anonymous) (cognitive 16) (scan.mjs)
  • (anonymous) (cognitive 17) (providers/comeet.mjs)
  • (anonymous) (cognitive 25) (scan-ats-full.mjs)
  • (anonymous) (cognitive 26) (scan.mjs)
  • (anonymous) (cognitive 26) (upskill.mjs)
  • (anonymous) (cognitive 30) (providers/smartrecruiters.mjs)
  • (anonymous) (cognitive 57) (scan.mjs)
  • (anonymous) (cyclomatic 16) (providers/comeet.mjs)
  • (anonymous) (cyclomatic 16) (upskill.mjs)
  • (anonymous) (cyclomatic 17) (scan-ats-full.mjs)
  • (anonymous) (cyclomatic 18) (scan.mjs)
  • (anonymous) (cyclomatic 21) (providers/smartrecruiters.mjs)
  • (anonymous) (cyclomatic 32) (scan.mjs)
  • Change coupling: dedup-tracker.mjs ↔ merge-tracker.mjs (dedup-tracker.mjs)
  • Change coupling: dedup-tracker.mjs ↔ normalize-statuses.mjs (dedup-tracker.mjs)
  • Change coupling: doctor.mjs ↔ test-all.mjs (doctor.mjs)
  • Change coupling: followup-cadence.mjs ↔ test-all.mjs (followup-cadence.mjs)
  • Change coupling: merge-tracker.mjs ↔ normalize-statuses.mjs (merge-tracker.mjs)
  • Change coupling: merge-tracker.mjs ↔ verify-pipeline.mjs (merge-tracker.mjs)
  • Change coupling: normalize-statuses.mjs ↔ verify-pipeline.mjs (normalize-statuses.mjs)
  • …and 351 more

New (971)

  • (anonymous) (cognitive 22) (upskill.mjs)
  • 4dayweek.normalize4dwJob (cognitive 23) (providers/4dayweek.mjs)
  • 4dayweek.normalize4dwJob (cyclomatic 24) (providers/4dayweek.mjs)
  • Change coupling: _types.js ↔ scan.mjs (providers/_types.js)
  • ClassTooLong: PipelineModel (dashboard/internal/ui/screens/pipeline.go)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • FileTooLong: ./check-jd-archive.mjs (check-jd-archive.mjs)
  • FileTooLong: ./linkedin-join.mjs (linkedin-join.mjs)
  • FileTooLong: components/assistant-console.tsx (web/src/components/assistant-console.tsx)
  • FileTooLong: data/career.go (dashboard/internal/data/career.go)
  • FileTooLong: i18n/catalog.go (dashboard/internal/i18n/catalog.go)
  • FileTooLong: screens/pipeline.go (dashboard/internal/ui/screens/pipeline.go)
  • FileTooLong: screens/viewer.go (dashboard/internal/ui/screens/viewer.go)
  • FunctionTooLong: aggregate-tokens.main (batch/aggregate-tokens.mjs)
  • FunctionTooLong: analyze-patterns.analyze (analyze-patterns.mjs)
  • FunctionTooLong: analyze-patterns.runSelfTest (analyze-patterns.mjs)
  • FunctionTooLong: apply-provider.ApplyProvider (web/src/components/apply/apply-provider.tsx)
  • FunctionTooLong: build-cv-html.runSelfTest (build-cv-html.mjs)
  • …and 951 more

Changes since last survey

  • 300 commits — 146 feature/other, 154 fixes

By area

  • (root) — 129 commits
  • (repo) — 97 commits
  • web/src — 12 commits
  • .github/scripts — 8 commits
  • .github/workflows — 4 commits
  • batch/batch-prompt.md — 3 commits
  • docs/avatar-santifer.png — 3 commits
  • docs/manifesto-wall.svg — 3 commits
  • batch/batch-runner.sh — 2 commits
  • dashboard/internal — 2 commits
  • docs/plans — 2 commits
  • modes/apply.md — 2 commits
  • providers/deutschebahn.mjs — 2 commits
  • tests/providers — 2 commits
  • batch/README.md — 1 commit
  • docs/CV_VISUAL_TESTING.md — 1 commit
  • docs/SOURCE_INDEXING_LOG.md — 1 commit
  • docs/SUPPORTED_JOB_BOARDS.md — 1 commit
  • docs/avatar-santiago-pixel.png — 1 commit
  • lib/latex-escape.mjs — 1 commit

Notable commits

  • fix: Merge branch 'main' into Fix/4179-smartrecruiters-phantom-empty-board
  • fix: Merge branch 'main' into codex/upstream-fix-url-key-hash-route
  • fix: Merge branch 'main' into fix-inbox-facet-chip-padding
  • fix: Merge branch 'main' into fix/3913-open-failure-flash
  • fix: Merge branch 'main' into fix/3913-open-failure-flash
  • fix: Merge branch 'main' into fix/4265-update-readme-usage
  • fix: Merge branch 'main' into fix/4265-update-readme-usage
  • fix: Merge branch 'main' into fix/4265-update-readme-usage
  • fix: Merge branch 'main' into fix/batch-escape-ampersand
  • fix: Merge branch 'main' into fix/batch-runner-windows-jd-path
  • fix: Merge branch 'main' into fix/batch-runner-windows-jd-path
  • fix: Merge branch 'main' into fix/clean-markers-help
  • fix: Merge branch 'main' into fix/deutschebahn-manfred-transient-timeout
  • fix: Merge branch 'main' into fix/empty-tracker-exit-code
  • fix: Merge branch 'main' into fix/flash-control-chars
  • fix: Merge branch 'main' into fix/flash-control-chars
  • fix: Merge branch 'main' into fix/jsonld-jobposting-extraction
  • fix: Merge branch 'main' into fix/liveness-closed-role-expired
  • fix: Merge branch 'main' into fix/liveness-closed-role-expired
  • fix: Merge branch 'main' into fix/opencode-provider-config
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

santifer/career-ops was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 25 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 9a8667b39cb7c632e8b55dd62c836c8427e92069 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-dd72cc24c749.