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
- 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).
- It set up a small task list, checked the existing
site.ts, content collections, and base layout, then went page-by-page. - 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).
- Pagefind got installed as a dev dep and chained onto
npm run build.data-pagefind-bodywas added to article shells; the listing was taggeddata-pagefind-ignoreto avoid duplicate indexing. - Build went green on the second run; first run failed on two TS issues in the search script (unknown
posthogglobal, unresolved dynamic-import path), both fixed by widening types.
What was actually shipped
/now— monthly focus page driven bynowStateinsrc/site.ts./colophon— stack, perf budget, editorial decisions in a single editable object./changelog— built fromgit logat 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.posthogso the per-script(window as any)cast goes away. - Generate the changelog at build into a JSON file instead of running
git logfrom 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.