100% LOCAL

498 TESTS


0 AUTO-SENDS, EVER

IN DAILY USE

OVERVIEW

Jarvis is a personal AI operating system that runs locally on my Mac — and it runs my actual job search, every day. The concept: Jarvis is the system; Protocols are repeatable workflows built on top of it (Morning, Evening, Weekly, Career); underneath sit shared primitives — tools, memory, permissions, interfaces.


The Career Protocol is the most developed: a career event ledger, an opportunity pipeline, an action queue, a networking tracker, a daily brief, and a hygiene radar that flags stale threads — all reading from one canonical state. This isn't a demo I built to have something to show. It's the tool I open every morning to decide what to do about Meta, Axon, and every warm intro in my network.

ARCHITECTURE

career event ledger → reconcile → network → daily brief → context pack → operating state → dashboard + chat

The design bias: deterministic code before model calls. Reconciliation, status math, and pipeline state are plain TypeScript with a 498-test suite — the LLM is only invited in where actual reasoning is needed: interpreting evidence, drafting, strategy. A provider-agnostic model wrapper means the AI layer can swap providers without touching the system.

Jarvis runs as two processes. The local Next.js app is the interface — and the sole owner of canonical state. A separate background worker does the observing: scheduled jobs, durable checkpoints, catch-up after sleep, backoff and quarantine when something fails. The worker never writes state directly; it's an HTTP client of the server, so there is exactly one door into my data no matter who's knocking. One command starts both. Claude Code is the workbench I build it with.

THE DESIGN PRINCIPLE THAT RUNS THROUGH IT

Autonomy is earned, not assumed. I deliberately withheld powers — email sending, calendar access, background jobs — until the system proved itself in daily use with the safe ones. The interesting problem in personal agents isn't making the model do more; it's deciding what it may do without you, what it must propose to you, and what it can never do. Jarvis is my working answer: observe and reason freely, propose everything, send nothing.

FIELD NOTES

The most useful engineering lesson this project keeps teaching: most of the real bugs came from running the system, not from the tests. A LAN-exposed dev server. A background worker that silently exited after one cycle while its status file said "running." A scheduler quietly discarding cursor writes — which would have made Gmail re-scan the same window forever. The test suite went from 54 to 244 in one build cycle, and the tests that matter most were written after live use surfaced what could actually break. Autonomy isn't a feature you add; it's a set of failure modes you earn the right to handle.

CURRENT BUILD

The direction of information flow has flipped. It used to be: I notice something, I tell Jarvis. Now: a background worker observes, interprets, and files proposals into a Jarvis Inbox — and waits. Quick Capture turns a one-line brain dump ("Brian said Axon's LDP opens next week") into structured, reviewable proposals in ~4 seconds, resolving names against my real network and asking a question when it can't. And the first outside-world sensor is live: Jarvis watches Gmail — read-only, metadata-gated so irrelevant mail is never even opened — and has completed its first autonomous observation loop, correctly concluding a scanned email didn't warrant a proposal. Next: targeted watchers for specific role openings, then the entity model — persistent identity for companies, roles, and people instead of strings.

TECH STACK

Next.js + TypeScript · Node · background worker daemon · deterministic pipeline w/ 498-test suite · provider-agnostic LLM wrapper (OpenAI today) · Gmail API (read-only) · markdown-file memory with approval-gated writeback · built with Claude Code · 100% local

Want to see it live?
Jarvis runs every morning. Email me and I'll walk you through it in 15 minutes.

Email Button