01
Spec before code
Before a line ships, I decide the shape — a data model, an ADR for every load-bearing choice, and a single source-of-truth doc the whole build answers to. The decisions get written down first, so another person could pick up the spec and build from it. The repo reads like a design doc that happens to compile.
ADRsdesign docsspec-first
02
AI as the build environment
I build inside the Claude Code CLI, wired to MCP servers that drive the database, the browser, and n8n as first-class tools. Automations ship as version-controlled code, pushed through an MCP — never clicked together in a UI.
Claude Code CLIMCP serversworkflow-as-code
03
Guardrails, not vibes
Speed is fenced in on purpose: PreToolUse hooks block stray writes, custom skills enforce house conventions, and ADRs keep decisions from drifting. The agent moves fast — inside walls I built first.
hookscustom skillsguardrails
04
Determinism where it counts
The model lives only where it earns its place. The load-bearing core — money in integer cents, server-side RBAC, append-only audit logs written in the same transaction as the change — stays deterministic, typed, and provable.
server-side RBACaudit logsinteger cents
05
Tested and scanned, every push
Each push runs the gate: unit, integration, and end-to-end tests, plus Snyk scanning and automated dependency patching — all in GitHub Actions. It's green, or it doesn't ship.
VitestPlaywrightSnykGitHub Actions
06
Shipped and watched
Production on Vercel, Supabase, Neon, Render and Stripe, with Prometheus and Grafana watching it run and CI/CD deploying continuously. Real users, real money, watched continuously.
VercelSupabaseStripeGrafana