What I asked for

“What other features can I add to my personal site?” — followed by “add all, plan it, execute.”

How the session ran

  1. Claude pushed back on “add all” and pruned the list to eight things that actually compound, flagging the rest as needing a decision (newsletter provider, talk videos, uptime source).
  2. It set up a small task list, checked the existing site.ts, content collections, and base layout, then went page-by-page.
  3. Each new page was wired in the same brand vocabulary — same panel class, same eyebrow → display-headline rhythm, same accent palette (rust / moss / skyline / plum).
  4. Pagefind got installed as a dev dep and chained onto npm run build. data-pagefind-body was added to article shells; the listing was tagged data-pagefind-ignore to avoid duplicate indexing.
  5. Build went green on the second run; first run failed on two TS issues in the search script (unknown posthog global, unresolved dynamic-import path), both fixed by widening types.

What was actually shipped

  • /now — monthly focus page driven by nowState in src/site.ts.
  • /colophon — stack, perf budget, editorial decisions in a single editable object.
  • /changelog — built from git log at build time, grouped by month, types color-coded.
  • Reading time on every post via src/lib/readingTime.ts.
  • Pagefind search mounted on /posts/, with ⌘K to focus and Esc to clear.

What worked well

  • Treating the design system as fixed: every new page reuses panel, .eyebrow, the four accent variables, and the existing display-font rhythm. Nothing looks bolted on.
  • Letting the build fail noisily — the second compile pinpointed the two type holes in 30 seconds.
  • Keeping data colocated with the page (e.g. nowState, colophon) instead of inventing a CMS or a markdown file for things that don’t really need one.

What I would change next time

  • Pre-set tsconfig globals for window.posthog so the per-script (window as any) cast goes away.
  • Generate the changelog at build into a JSON file instead of running git log from the page module — keeps the page server-pure and avoids needing a git repo at deploy.
  • Move the search input into the global header behind ⌘K so it works on every page, not just /posts/.

Cost & evidence

  • Roughly one Claude Code session, mostly Opus 4.7. No Codex involvement on this one.
  • Final state: 25 pages built, Pagefind indexed 10 article bodies, build under 3 seconds.