CareerTwin, a Single-Seeker Career Evidence and Job-Search Workbench
A self-hosted workbench where one seeker owns one evidence-centred profile and any number of opportunities, applications, tasks and generated career artifacts. Its match score is a versioned alignment measure with coverage and uncertainty, never a hiring probability: it separates required, preferred and eligibility requirements, states how much of each is covered by confirmed evidence, and explains every component reproducibly. The agent side is bounded and evidence-cited, every proposed canonical write needs explicit approval, and the whole product works without any AI provider. It does not rank candidates for employers, infer protected traits, scrape unrestricted job sites, auto-apply or send outreach. Live at v0.14.5 on a single VPS; no external job-search outcome is claimed.
Business Context
The value of a job search is decided by positioning, and positioning is decided by evidence: which claims a seeker can back, which gaps are real, and which opportunities are worth the hours. CareerTwin keeps that ledger on the seeker side. A match score that states its coverage and uncertainty tells the seeker what to fix rather than whom to beat; a recommendation matrix over repeated gaps across a target portfolio turns dozens of postings into a short list of capabilities to build or to evidence; drafts grounded in confirmed evidence remove the fabricated line that gets an application discarded. The self-hosted boundary is the condition for all of it: production secrets, documents, databases and backups never enter the public repository, tenant filters and PostgreSQL row-level security are both enforced, uploads are scanned before extraction, and URL capture pins every destination and redirect to resist SSRF and DNS rebinding.
Strategic Value
The product is complete and live, and its record says exactly what is and is not established. Release gates on v0.14.5: 82 backend tests, strict MyPy and Ruff, six agent contracts, 22 frontend tests, dependency and secret audits, CodeQL, container scans, an SBOM, and a representative load contract of 10 users over 1,000 opportunities at 8.059 ms p95 against a 2.5 s limit. Production runs detached at the reviewed commit with two release images; PostgreSQL 17.11 and pgvector 0.8.6 are verified together with collation equality, an isolated 39-table restore of an owner-only encrypted backup, and O*NET 30.3 active with 1,150 concepts and 12,684 relations. Two gates stay honestly open and are tracked as issues: operator-consented activation of the official ESCO 1.2.1 archive, and a product-scoped managed model key followed by a real production agent and voice smoke; the model provider is unconfigured until then. No named external adopter and no measured job-search outcome exist, so the value axis of the plan is recorded as an internal demonstration, not as adoption.
The Challenge
Job-search tooling is built for the other side of the table: it ranks people for employers, scores them with numbers that read like probabilities, and asks the seeker to hand their history to a service that keeps it. A seeker who wants to understand their own positioning has nothing equivalent: a profile that is a list of claims rather than evidence, a match that is a number nobody can take apart, and generated cover letters that cite things the seeker never said. The hard requirements are the boundaries. A score must never be read as a hiring probability. Nothing about a protected trait may be inferred. Documents, provider keys and sessions must stay on hardware the seeker controls. And an assistant that can write into the canonical record must never do so on its own.
Our Approach
CareerTwin is a native-first repository product: FastAPI, Pydantic, SQLAlchemy and Alembic over SQLite for local use, and PostgreSQL 17 with pgvector, a database-backed worker and ClamAV in the hosted profile; React, TypeScript and Vite on the front. Nine modules cover the seeker journey: profile and evidence (encrypted document ingestion with deterministic parsers, a confirmation inbox, GitHub portfolio snapshots, source-linked claims, a STAR bank, immutable resume variants, JSON Resume import and export), opportunity intelligence (manual, pasted, file, bounded-URL and revocable browser-extension capture with immutable revision snapshots), deterministic matching (required, preferred and eligibility separated, evidence coverage, uncertainty bounds, a versioned input digest and reproducible component explanations), improvement and grounded drafts, search operations (application board, contacts, tasks, RFC 5545 calendar import and export, consent-bound calendar and email connectors, funnel analytics), an agent concierge (persistent conversations over confirmed evidence, database-backed run and checkpoint state, and explicit approval for every proposed canonical write), invite-only account administration, occupational intelligence (checksum-aware ESCO 1.2.1 and O*NET 30.3 importers with a pinned 20-case EN/ES retrieval benchmark and a non-degradation release gate) and eight versioned repository skills that drive the same CLI and API contracts as the web product. Deterministic services own scoring and every canonical write; the agent harness is bounded, evidence-cited LangGraph workflows behind Pydantic AI adapters for xAI, OpenAI, Anthropic and Google, and the product runs fully without a provider.
Key Performance Indicators
| KPI | Baseline | Result | Impact |
|---|---|---|---|
| A score that cannot be read as a hiring probability | One opaque number per posting | A versioned alignment measure with evidence coverage, uncertainty bounds, required/preferred/eligibility separation and reproducible component explanations | The seeker learns what to fix, and the number survives a re-run |
| An assistant that never writes on its own | Generated text lands in the record unreviewed | Bounded, evidence-cited workflows; every proposed canonical write needs explicit approval; deterministic services own scoring and writes; full operation without any provider | No fabricated claim reaches an application |
| Load contract on the hosted profile | A 2.5 s p95 limit for 10 users over 1,000 opportunities | 8.059 ms p95 measured on the release | Three orders of magnitude inside the contract |
Architecture
careertwin pipeline
Technology Stack
Application Screenshots

