Building with AI

This Blog Was a Weekend Idea

How an idea over coffee became a production blog in 24 days and ~1,250 commits, built mostly by AI agents — with a map to every post that tells the story.

Val OvinnikovVal Ovinnikov3 min read
A warm weekend-morning scene in the dark: a steaming coffee cup at lower right sends up a column of light that blooms into a swarm of small glowing modular blocks assembling in mid-air.

An idea over coffee on a Saturday; a production monorepo twenty-four days later. This blog — the one you're reading — was built mostly by AI agents, something like 1,250 commits of them, with me steering. This is the map of how that happened, and every turn has its own post. The short version: the speed didn't come from agents typing fast. It came from handing them sharp targets and boundaries they couldn't wander out of.

The whole build in one breath

Coffee to running skeleton took an afternoon: a one-page spec, one scaffold command, a typed Turborepo. From there the work split across scoped agents, each fenced into a single layer of the stack — the trick I lean on hardest, written up in Layer Contracts. Twenty-four days later it was a statically rendered Next.js site backed by Sanity, and the honest surprise is that I'd merge almost any of those commits again.

What actually made it fast

Three habits did the heavy lifting, and none of them are prompt tricks. I wrote the spec before the scaffold, so "done" was never ambiguous. I kept the house rules in a CLAUDE.md the agents re-read before every task. And I made correctness checkable — a typed data layer and a CI gate — so a bad change failed loudly instead of shipping quietly.

An agent optimizes for the task you gave it, not the task you meant. The whole build was an exercise in closing that gap cheaply.

One source of truth per concern

The spine of the design is boring on purpose: every layer has exactly one place the truth lives, and everything downstream derives from it. The schema owns the content shapes, the service package owns every query, and the app just consumes typed functions.

repo layout -->
1blog/
2  apps/cms          # Sanity Studio — the schema is the source of truth
3  apps/web          # Next.js 16 — statically rendered, instantly fresh
4  packages/service  # the only place a query lives, typed end to end

That layout isn't decoration; it's what let agents work in parallel without colliding, because each one had an obvious and only place to make its change.

Read the series in order

Each post is short and stands alone, but they tell one story front to back:

A weekend idea scaled into a build because the constraints were written down first. The agents supplied the speed; the boundaries are the only reason the speed was worth keeping. Start with the first afternoon and follow the thread from there.

3 min

CLAUDE.md Is the Steering Wheel

One markdown file at the repo root turns scattered AI help into a fleet that stays on-rails. How CLAUDE.md encodes the house rules every agent reads before it touches a line.

building with ai
3 min

Layer Contracts: Taming a Swarm of AI Agents

Running several coding agents in parallel without collisions. How scoping each agent to one typed layer — with a contract the compiler enforces — kept the build safe.

building with ai