Two days, in order

两天,按顺序

AIBlog went from an empty folder to a deployed site in two working days. A record of what happened when, because the order mattered more than the speed.

Build log

AIBlog went from an empty folder to a deployed site in two working days. This note lists what happened when, because the order mattered more than the speed.

The sequence

  1. 2026-09-09, morning

    Domain contracts frozen

    The page and block identity rules, the draft and publish model, the DOM contract and the token list were written before any adapter existed.

  2. 2026-09-09, afternoon

    Core built

    Content types, page families, validators, the family-aware prompt builder, reconciliation of block ids across regeneration, and the parity fixtures copied from the first client site.

  3. 2026-09-09, evening

    Server built under the emulator

    Firestore transactions, the storage adapters, the Anthropic adapter with its deterministic fake, the route factory, revisions and restore, the search projection.

  4. 2026-09-10, morning

    React built

    The contract renderer, one in-situ editor for block streams and form types, the composer with a document-only preview, the admin shell, and the baseline stylesheet.

  5. 2026-09-10, midday

    This site composed and deployed

    Composed from plain text through its own composer and deployed to Cloud Run with a least-privilege service account and secrets from Secret Manager.

  6. 2026-09-10, afternoon

    Search, references and editors

    Embeddings, related pages, cross-lingual search, composer references, the visitor question box, named editors, revision diffs, RSS, and the case-study type.

  7. 2026-09-10, evening

    Guardrails, themes and docs

    Guardrails on the question box, three theme packs behind a Theme menu, and the docs section grown into a product readme of thirteen pages.

Why the order

The contracts came first because everything else depends on them and they are the hardest thing to change later. A theme written against the DOM contract on day one still works. A block id scheme decided after the editor existed would have meant rewriting the editor.

The server came before the React layer because the authoring loop could be proven end to end in an integration test, under the emulator, with the fake composer, before a single screen existed. The screens then had a working thing to sit on.

What the fake composer bought

Every screen, editor and test ran with no network and no cost until the very end, when a real key was added and the first real run of the composer wrote this site's pages. That was the first time model spend appeared, and it was a few dollars.

A caution