The dev commands, the two ports, the Vite proxy that removes the need for CORS, and why no configuration is an error state.
npm run dev # both servers via scripts/dev.mjs
npm run typecheck # app AND server — the build only checks the app
npx vitest run # 296 tests across 17 files
npm run build # tsc --noEmit then vite buildstrictPort: false, so it falls forward if taken)node:http, tsx watch)Vite proxies /api → :8787, which is why every client call is same-origin and the server has no CORS handling at all. scripts/dev.mjs spawns both as separate shell processes; killing the supervisor leaves them running.
Everything works with no configuration. No Supabase means no accounts and localStorage only; no ANTHROPIC_API_KEY means AI drafting degrades to "write it yourself"; no Stripe means no checkout.
None of these are error states — the free tier is the no-config state.