Open-core · Local-first · 0.6.0
A career operating system with a truth floor
Job tools optimise keyword volume. Selfwright optimises truthful, defensible output and compounds everything you learn about companies, roles, and your own evidence into a private knowledge base.
Platform metrics
2,067
tests
33
fitness checks (28 in CI)
19
scan providers
0.6.0
current release
Measured, not claimed
Pulled from Selfwright's own eval suite, fitness functions, and acceptance-test docs — a snapshot, curated Jul 14, 2026. Refreshed by hand when it changes, not on every commit.
01
Eval-suite pass rate — fitness functions
- Tier-1 checks (CI-safe, no private data)
- 28 passed · 0 failed
- Tier-2 checks (need local truth-layer data)
- 5 skipped
Selfwright `pnpm fitness` @ 78b2542
02
Eval-suite pass rate — deterministic-core unit tests
- Tests passed
- 822 / 822 across 42 files
Selfwright `pnpm --filter @selfwright/core test` @ 78b2542
03
Runtime/cost — deterministic vs. LLM tier
- Deterministic tier (ATS, scoring, tailoring, fitness)
- $0 — no LLM call
- LLM tier (cover/research, co-piloted)
- $0 metered — subscription-based, no per-call API billing (ADR 0006)
Selfwright docs/metrics.md
The bet
Keyword density gets you past an ATS screen
It does not hold up in a second conversation with the same company, or when an interviewer probes the specific claim on the page. Selfwright starts from the opposite position.
The enforcing mechanism is the truth floor. Every cover letter, prep pack, research document, and interview drill traces back to a locked evidence registry. The co-pilot path assembles a grounded prompt and stops. A validator checks what comes back before you can use it. The honesty-wall system flags retired phrases. Drifts — the only sanctioned exception — are scored, ledgered, and confidence-banded before they touch any output.
The secondary payoff: every interview, debrief, and drill feeds the same evidence base. Your next application benefits from the last one.
How it works
What it does
Six capabilities, one evidence registry
-
01
Truth floor, in code
Every cover letter, prep pack, and interview drill traces back to a locked evidence registry (EVD-* ids). 33 fitness checks (28 enforced in CI) validate each artifact before you can use it. You cannot fabricate accidentally or at scale: every claim traces to a locked evidence registry, and any deviation is logged as an audited drift.
-
02
Deterministic scoring, zero LLM calls
A 7-dimension fit score and ATS parseability report run in milliseconds against your archetypes. No model call, no billing. The scoring math is plain TypeScript, test-covered, and deterministic across runs.
-
03
Co-piloted generation, no API keys
Selfwright assembles a truth-grounded prompt — evidence selected, archetype framing injected, JD context pulled in — and writes it to a file. You run the output in the Claude session you already have open. A validator checks what comes back. Your existing Claude subscription does the work.
-
04
Role discovery across 19 providers
Scans Greenhouse, Lever, Ashby, Workday (standard and bot-gated tenants via headless Chromium), SmartRecruiters, BambooHR, Adzuna, Arbeitnow, Oracle Fusion, Recruitee, and a generic JSON feed adapter (with schema.org JSON-LD auto-extraction), plus nine more. Fuzzy-deduplicates by company and title, scores each posting against your archetypes, and writes a prioritised queue. Runs weekly on a scheduled task.
-
05
Local-first, data stays put
Your truth layer, applications, compensation data, and contacts live in a private git repository on your machine. The data stays local; the only egress is to services you configure yourself, described in the security section below. The data-leak gate fails closed if the boundary is crossed — pre-commit and in CI.
-
06
Coaching loop that compounds
After each interview: log a debrief, run gap-scan, get a drill. Each round feeds the next. The evidence registry grows. Applications stop starting from scratch.
Architecture
TypeScript-first, hexagonal, tested
Stack
TypeScript strict, Vitest, Hono web server, Zod schemas, pnpm workspaces. The domain core is pure TypeScript with zero framework imports — enforced by a fitness function in CI.
Storage
Git markdown/YAML is the source of truth. PostgreSQL + pgvector is a rebuildable projection. Droppable anytime without data loss.
Generation
No API key required. The default path assembles a prompt and hands it to the Claude session you already have open. An optional headless adapter exists for scripted use.
Security
Named-entity data-leak gate derived from your private data at commit time. SSRF allowlists on every outbound call. CSRF synchronizer tokens on all write routes. Loopback-only web binding.
Where it runs
Any MCP-capable agent, plus a CLI
The skills run in Claude Code, Cursor, and OpenCode — any agent that speaks MCP. Claude Code is the primary target and gets the most testing; Cursor and OpenCode work but see less daily use. A standalone CLI runs the same commands with no agent in the loop.
The TypeScript core has no OS-specific code, so macOS, Linux, and Windows should all work. Day-to-day use has been on Windows, so that's the only platform verified end to end. Weekly automated scanning currently runs on Windows Task Scheduler; cron and launchd support for Linux and macOS are planned, not shipped.
Privacy
No telemetry. Ever.
A security audit confirmed zero analytics, zero phone-home, zero data sent to the maintainer or any vendor. Your career data — evidence registry, applications, compensation figures, contacts — stays in your private git repository on your machine.
The only outbound traffic is to services you configure yourself:
- → Job boards receive search terms only — no personal data, no stored session.
- → The model gateway is opt-in and off by default. When you enable it, prompts go to the provider you choose — same as running Claude yourself.
- → Push notifications go to your own ntfy topic with job IDs only, never PII.
The data-leak gate enforces this boundary on every commit and in CI — it fails closed, not open.
Context
How this compares to career-ops tools
Selfwright shares ground with other career-ops tools: local-first, zero telemetry, human-in-the-loop on every generated output. Three architectural choices set it apart: the truth floor is enforced in code (every artifact traces to a locked evidence registry; deviations log as audited drift); port boundaries are fitness-function-checked (the build fails if domain code touches infrastructure directly); the generation path needs no API key and no per-call billing.
The full breakdown is in the comparison doc in the Selfwright repo.
Built in public
Used for my own career development
Selfwright is the tool I built and run on real career data. The scanner queries live ATS boards. The fit scorer grades real job descriptions against my archetypes. After each interview, the coaching loop — debriefs, gap-scans, drills — feeds an evidence base that compounds. The data-leak gate has caught real mistakes.
The framework is Apache 2.0. Your truth layer stays on your machine. The evidence registry, applications, and contacts never leave your private git repository.