The design system’s clickable mockups became real code: a theme.css of plain CSS variables, a shared layout wrapping every page, and the Hub itself wired to the real — still empty — content collection rather than faked sample data. Choosing a real empty state over invented placeholder posts on the homepage set the tone for everything that followed.

The four pillar landing pages shipped next, as one dynamic route instead of four copy-pasted files, which also forced two genuinely shared components — a newsletter card, an empty state — out of what had been inline Hub markup once a second page needed the same thing.

In parallel, the site settled how it discloses AI involvement: a required authorship field (human, duet, or bot) on every post, kept deliberately outside the pillar/format taxonomy since it’s provenance, not a third subject axis. That paired with a public commit history and a promised colophon page explaining exactly what the rules are.

Individual post pages closed the loop, shipping the last dead links the Hub and pillar pages had been generating all along, and carrying the authorship stamp live for the first time. Building the actual rendering path also surfaced a real URL bug — a doubled pillar segment from an old .slug habit — that nothing had caught yet because every post was still a draft and had never actually rendered.

Main takeaways

  • Real, honest empty states beat faked sample data, even mid-build and even on the homepage.
  • Two identical inline markup blocks was exactly the point to factor them into shared components — not before, not much later.
  • Authorship is provenance, not a taxonomy axis — a stamp on the post, never a filter or a nav dimension.
  • Building “the last dead link” is often where the most latent bugs get caught, because it’s the first time the whole path actually renders.

What I got wrong

  • An old .slug habit from a previous Content Collections API quietly broke post links — valid TypeScript, wrong at runtime, invisible until a real route existed.
  • A single screenshot tool gave a false negative on a missing mobile-nav button; only checking computed styles directly showed it was there all along.
  • Whether the bots get names or stay generic is still undecided — punted to the brand pass.