Track every application, tailor every CV, drill every question, and — when the interview starts — get a stealth coach grounded in your own CV.
Why • What's inside • Live Copilot • Stack • Get started • Privacy
Job hunting at the top end is a process problem, not a willpower problem.
You're juggling 40 applications across 8 funnels. You can't remember which CV variant you sent to which fund. You've answered "tell me about yourself" 22 times — and you still freeze on number 23. Your inbox is the source of truth, which means there is no source of truth.
Career OS is the operating system that fixes this. It's a native Mac app that lives next to your work, owns the entire job-hunt loop, and — when the moment comes — sits silently behind your video call as a coach grounded in your own CV.
Not a job board. Not a CV builder. A workshop where every artifact, every conversation, and every interview is one keystroke away.
Career OS ships as one Mac app with seven connected surfaces:
| Surface | What it does |
|---|---|
| Dashboard | Today's focus hero strip with priority-scored CTAs · live greeting · 14-day activity sparkline · weekly insight grounded in your real applications |
| Jobs | Browse, filter, and bookmark openings · AI-computed match score per posting · "Why you match" / "Gaps to fix" derived from your CV |
| Applications | Kanban across sourced → applied → screen → interview → offer / rejected · per-app timeline · drag-and-drop pipeline · materials checklist · sort by activity / match / stage |
| War Room (per-job workspace) | The headquarters for one specific job. Stage progress · match-score donut · interview-readiness donut · CV-vs-JD ATS analysis · likely-question prediction · prep hub · timeline with next-best actions · linked notes and follow-ups |
| CV Manager | Multiple CV variants (one per role focus) · ATS score + projected score · Claude-powered ATS analysis with strengths / weaknesses / missing keywords / surgical suggestions · history of tailoring runs · default-CV per persona |
| Prep | Adaptive question bank tailored to your current candidacy (Behavioral / Technical / Case / Culture Fit) · structure / conciseness / evidence / memorability scoring · today's plan with streak tracker · 8-week practice chart |
| Live Copilot | The stealth overlay. Real-time transcription · question-end detection · 3 CV-grounded answer bullets in under 5 seconds · invisible to screen-share · FR ↔ EN code-switching |
Everything is linked: a job in Jobs turns into an application in Applications that opens a War Room that drives a Prep plan that warms up a Live Copilot session — all sharing the same CV, the same JD snapshot, and the same persona context.
The crown jewel. While you're in a Zoom / Meet / Teams call:
┌─────────────────────────────────────────────────┐
│ 🟢 Listening · Recruiter speaking · FR │
├─────────────────────────────────────────────────┤
│ Q: "Parle-moi d'un échec marquant." │
│ │
│ → Projet X — chiffre raté de 40% [CV.exp.3] │
│ → Cause racine: scope mal cadré en kickoff │
│ → Apprentissage appliqué sur projet Y [CV.exp.4]│
│ │
│ ⏱ 2.8s · Sonnet 4.5 · cached │
└─────────────────────────────────────────────────┘
5 design choices that matter:
- Two-channel audio — mic = you, system = recruiter. No ML diarization, no BlackHole, no kernel extensions. ScreenCaptureKit only.
- Citation-required prompts — every bullet citing a fact carries
[ref: CV.experience.<id>]. A post-gen validator drops bullets with unresolved refs. Zero hallucinations on your CV. - Triple-redundant pipeline — Deepgram → AssemblyAI for STT, Claude → GPT-5 for LLM, full local fallback (Whisper.cpp + Ollama) when both clouds are down.
- Stealth that actually works on macOS 15+ —
NSWindow.sharingType = .noneis broken on Sequoia. We detect screen-share, mask the overlay, and offer second-display routing instead. - Single-egress
cloud::Client— every outbound HTTP/WS call routes through one Rust module. The privacy boundary is agrep, not a guideline.
Cost: ~$0.66 / hour during a live interview (Deepgram + Claude + amortized prep brief).
🎤 Mic ────────┐
├──▶ Channel-tagged audio ──▶ Deepgram STT (FR↔EN)
🔊 System ─────┘ │
▼
Question-end detection
│
▼
CV (Docling JSON) + JD + Snapshot
│
▼
Claude Sonnet 4.5 (cached, citation-required)
│
▼
3 bullets · STAR / MECE · in <5s · validated
│
▼
Stealth overlay (invisible on screen-share)
| Layer | Choice | Why |
|---|---|---|
| Desktop shell | Tauri 2 + React 19 + Vite 6 | Native perf, tiny binary, Rust core |
| State | Zustand (sliced store) | Tiny, ergonomic, no Provider hell |
| UI | Hand-rolled CSS tokens · Lucide icons · cmdk · dnd-kit | Pixel-perfect, no design-system lock-in |
| macOS bridge | Swift sidecar (ScreenCaptureKit) | Only stable system-audio path on 13+ |
| STT primary | Deepgram Nova-3 Multilingual | True FR↔EN code-switching, <500 ms |
| STT failover | AssemblyAI Universal-Streaming | Cross-cloud vendor diversity |
| LLM primary | Claude Sonnet 4.5+ | 90% prompt-cache discount on CV/JD |
| LLM failover | GPT-5 / 4o | Same prompt contract, hot-swap |
| Local degraded | whisper.cpp + Ollama (Qwen 2.5 / Llama 3.3) | Pre-warmed, no internet required |
| Vector store | LanceDB embedded | 4 MB idle, no IPC, Rust-native |
| Embeddings | BGE-small ONNX (local) | Privacy-first by default |
| Persistence | SQLite (sqlx) + JSONL transcripts | No raw audio, ever |
| Secrets | macOS Keychain (`keyring` crate) | Never in SQLite, never in bundle, never in webview localStorage. |
| CV parsing | Docling (IBM, Python sidecar) | Lossless structured extraction |
⚠️ Active development. Dashboard, War Room, CV Manager, Applications, Prep, server-managed AI (analyse ATS / next-steps / optimisation CV) are live. Live Copilot pipeline reaches v1 at Phase 6 (the shipping gate).
The latest unsigned DMG lives on the Releases page.
- Download
Career OS_x.y.z_aarch64.dmg - Open it → drag Career OS into
Applications - First launch on a new Mac : Gatekeeper bloque les apps non signées. Right-click sur
Career OS.appdans Applications → Open → confirme dans la dialog. Une fois fait, l'app s'ouvre normalement par la suite. - Première fenêtre : tu cliques "Settings → Account" et tu te connectes via magic-link
Pourquoi ce workaround ? On est en beta zero-budget — pas encore d'Apple Developer Program ($99/an). On signe l'app proprement quand on bascule en prod.
- macOS 13+ (15+ recommended for screen-share masking)
- Rust (stable) + Cargo
- Node 20+ and
pnpm - Xcode Command Line Tools
- (Optional) Deepgram + AssemblyAI + OpenAI keys for Live Copilot — Anthropic is no longer needed locally, the Worker hosts the credit
git clone https://github.com/Caezarr/career-ops.git
cd career-ops
pnpm install
# Worker (terminal 1) — see worker/.dev.vars.example for the secrets
cd worker
cp .dev.vars.example .dev.vars # then fill ANTHROPIC_API_KEY etc.
pnpm install
pnpm db:migrate:local
pnpm dev # http://localhost:8787
# App (terminal 2) — point Vite at the local Worker
cd ..
echo 'VITE_API_BASE_URL=http://localhost:8787' > .env.local
pnpm tauri devFirst launch walks you through Microphone, Screen Recording, and Accessibility permissions before any feature unlocks. The magic-link JWT lives in the macOS Keychain via the keyring crate — never in plaintext, never in the frontend bundle, never in webview localStorage.
pnpm tauri dev # dev with hot reload
pnpm tauri build # produces an unsigned .dmg (Gatekeeper will block on first launch)
pnpm typecheck # tsc -b --noEmit
pnpm build # frontend-only build (vite + tsc)
cargo test # Rust testssrc/
dashboard/ Career OS surfaces (Dashboard, Jobs, Applications, CV, Prep, Workspace)
pages/ Top-level screens
components/ Shared + per-page UI
store/ Zustand sliced store
data/ Seed mock data + adaptive prep bank
styles/ CSS tokens + per-feature stylesheets
copilot/ Live overlay app (stealth, frameless, always-on-top)
src-tauri/ Rust core: audio, STT, LLM, persistence, single-egress cloud
src-tauri/migrations/ SQLite migrations
.planning/ GSD planning artifacts (PROJECT, REQUIREMENTS, ROADMAP, research)
The Live Copilot ships in 7 phases (0–6) = shippable v1. Order is not negotiable — Phase 6 (reliability / failover) is the gate, not polish.
| # | Phase | Status |
|---|---|---|
| 0 | Foundations & Stealth Spike | 🟡 in progress |
| 1 | Audio Capture + Channel Diarization | ⚪ planned |
| 2 | STT Spine + Question Detection | ⚪ planned |
| 3 | CV / JD Ingestion + Context Assembly | ⚪ planned |
| 4 | LLM + Bullet Generation + Domain Personae | ⚪ planned |
| 5 | Live UX + Overlay + Pitch Perso | ⚪ planned |
| 6 | Reliability / Failover — SHIPPABLE GATE | ⚪ planned |
| 7 | Memory / RAG | 🔵 v2 |
| 8 | Brief / Debrief / Domain content | 🔵 v2 |
| 9 | Live Case Coach + Polish | 🔵 v2 |
The dashboard surfaces (Jobs, Applications, CV, Prep, War Room) are built in parallel with Phases 0–6 — they don't gate Live Copilot, but they ground it (CV variants, snapshots, JD context all flow into the same pipeline).
Cross-cutting privacy posture (PRIV-01..06) runs across every phase.
📖 Full breakdown: .planning/ROADMAP.md · Atomic requirements: .planning/REQUIREMENTS.md
Career OS sees your CVs, your applications, and (for the Live Copilot) your interviews. That's a serious commitment. Here's what's enforced in code:
- ✅ No raw audio on disk. Transcripts only (JSONL). Easy purge.
- ✅ All persistence local.
~/Library/Application Support/com.caezarr.career-ops/. Never iCloud / Dropbox / any cloud sync. - ✅ Single-egress
cloud::Client. One Rust module, every outbound call. Reviewable in 2 minutes withgrep. - ✅ API keys in the macOS Keychain.
keyringcrate, closed slot allow-list, IPC gated by window label. Never in SQLite, never bundled, never logged. - ✅ Zero-retention contracts required from every vendor before Phase 6 ships.
- ✅ PII-stripped logger by default.
- macOS 15+ broke
NSWindow.sharingType = .nonefor ScreenCaptureKit. Don't trust it as primary stealth. - BlackHole and other virtual audio drivers break across macOS updates. ScreenCaptureKit is the only sane path.
- ML diarization for 2 speakers is overkill and unreliable. Channel-of-origin tagging is the answer.
- Each interview is its own snapshot. Contexts must never bleed between offers.
- Latency budget ≤ 5 s, target 2.5–3.5 s. Profiled at every milestone exit.
This is a personal project, but the planning is in the open. If you're building something similar:
- The research notes in
.planning/research/(STACK,FEATURES,ARCHITECTURE,PITFALLS) are the most reusable artifacts. - The
CLAUDE.mdfile is the canonical project orientation — read it first. - Issues and questions welcome. PRs are not accepted at this stage (single-user scope).
Personal project. No redistribution license granted at this stage. Open an issue if you want to discuss using parts of it.