Domi, one month in: by the numbers
A month ago I committed chore: sprint 0 bootstrap to a private repo called Domi — a life-management platform meant to take the cognitive load of running a household off my shoulders. The deal I made with myself was a solo build, roughly ten hours a week, V1 in six months.
It’s been thirty days. Here’s where the codebase actually stands, measured rather than remembered. Every number below comes straight from git and the filesystem, and the commands are at the bottom so you can reproduce them.
The headline
Thirty calendar days. Thirty sprints closed (S0 bootstrap through S30, wrapped May 31). 687 commits and 287 pull requests merged to main — about 23 commits and ten merged PRs a day, sustained on nights and weekends by one person.
On a Monday-to-Sunday week, that’s about 72 merged PRs a week. The four full calendar weeks ran almost flat — 76, 69, 62, then 79 — with only the half-day bootstrap week sitting outside the rhythm:
| Week (2026) | Dates | PRs merged |
|---|---|---|
| Bootstrap | May 2–3 | 1 |
| Week 1 | May 4–10 | 76 |
| Week 2 | May 11–17 | 69 |
| Week 3 | May 18–24 | 62 |
| Week 4 | May 25–31 | 79 |
Per day it works out to ~9.6 PRs across the full span, or about 12 a day if you only count the 24 days that actually saw a merge. Sprints here aren’t calendar weeks — they’re work sessions, and a good evening can close three or four PRs. The shared PR/issue numbering pool has climbed past #592.
For context, eight days ago the same snapshot read 443 commits and 204 merges at sprint 24. The pace hasn’t let up.
The code
The authored surface — code plus docs, excluding generated JSON like lockfiles and i18n bundles — is about 109,700 lines:
| Language | Files | LoC | Share |
|---|---|---|---|
| TypeScript | 375 | 62,210 | ~57% |
| React TSX | 73 | 17,141 | ~16% |
| Markdown | 87 | 20,525 | ~19% |
| MDX (help site) | 74 | 4,558 | ~4% |
| SQL migrations | 48 | 2,159 | ~2% |
| YAML | 16 | 3,070 | ~3% |
The code subset alone — TypeScript, TSX, and SQL — is 81,510 lines across 496 files. Nearly a fifth of the authored total is Markdown, which is deliberate: the spec folder is the source of truth, and the design docs are doing real load-bearing work.
(One honest correction from last time: the May 24 snapshot undercounted Markdown because my line-count command split on the spaces in spec filenames. Null-delimited find -print0 | xargs -0 fixes it — which is why the docs figure jumped this round even though the file count barely moved. The lesson is in the methodology footnotes for good.)
Tests and gates
889 test cases across 89 Vitest files. Forty-eight Drizzle migrations. Nine GitHub Actions workflows standing guard on every PR — lint and typecheck, a real-database integration suite running on Neon ephemeral branches, a schema-drift gate that blocks merges when the migration journal is ahead of the deployed DB, a real-LLM evaluation gate on the predict_task role, OpenAPI/MCP-catalog sync, English/French key parity, and a check that every PR closes an issue.
That’s a heavier CI posture than most solo V1s carry, and it’s the thing that lets me move at 160 commits a week without the whole thing quietly rotting underneath me.
The bilingual surface
Domi ships English and Quebec French from day one, and CI hard-fails on drift between them: 790 translation keys in each locale, exactly matched, and 74 help-site pages split evenly across the two languages (37 each). The Quebec-first, bilingual-by-default stance isn’t a V2 nicety bolted on later — it’s wired into the gates.
What it cost to build
Building Domi wasn’t free. Across the 30 days, Claude — the coding agent doing the work alongside me — burned about 13.0 million input-plus-output tokens at a total API cost of $4,418. Averaged across the month that’s roughly $147 a day and about $1,030 a week; on the 28 days that actually saw activity it’s closer to $158/day. The work ran almost entirely on Claude Opus, with Haiku picking up the lighter tasks. (The token figure counts billed input and output; cache reads aren’t in it, though the dollar total includes them.)
The spend wasn’t even. The single heaviest day pushed 2.7 million tokens and $446 — a fan-out day with a dozen subagents grading and rewriting the codebase at once. Quiet doc-and-fix days ran a tenth of that.
Set against the output — 287 merged PRs, ~82k lines of code, 889 tests — that’s about $15 of model spend per merged PR. Whether that reads as cheap depends on what you compare it to. For a solo builder doing this on nights and weekends, it bought a second pair of hands that never got tired.
What it adds up to
Thirty days in, the shippable surface is real and under CI end to end: a Next.js app, a bilingual help site, an MCP server scaffold, and a cross-provider evaluation harness. Phase 10 — the V1 launch ramp — is substantially done; the last V1-critical piece is provisioning the MCP app on Fly.io.
What I take from the numbers isn’t the raw volume. It’s that a small, sustained cadence with strong guardrails compounds. Thirty quiet evenings turned into 82,000 lines of code, 889 tests, and a system I can already point at my own family’s calendar and start trusting.
I’ll re-run these at the next milestone. Same commands, fresh repo — that’s the whole point of measuring instead of guessing.
Reproducible from git: git log --oneline | wc -l for commits, --merges for PRs to main, and null-delimited find ... -print0 | xargs -0 cat | wc -l for lines of code. Full methodology lives in the repo’s docs/metrics/ snapshot.