Colophon
How this is made, and what was left out.
Versions
- Next.js 16.4.0
- App Router, Cache Components, Partial Prerendering, Turbopack
- React 19.3.0
- Server Components; client code only for the contact form and language switch
- Tailwind CSS 4.3.3
- Tokens declared in CSS with @theme
- nuqs 2.10.2
- Server-side search param parsing for /stack
Type & colour
Latin set in Fraunces with optical sizing on, so the name and the body text come from one family at different optical sizes. Chinese falls back to Noto Serif TC. Labels in IBM Plex Mono. Sizes follow a fluid clamp() scale.
Near-black ground, warm off-white type, hairline rules, and one muted sage accent. No colour blocks, no equal-size card grid.
Cache contract
- /
- Static shell; the “Now” line streams per request
- /work
- Cached list · cacheLife days · tag work
- /work/[slug]
- Prerendered per language and slug · tags work, work:[slug]
- /stack
- Unfiltered map in the shell; filtered URLs stream
- /now
- Short-lived · cacheLife minutes · tag now
- /colophon
- Static, build time only
- /contact
- Static page; Server Action works without JavaScript
Deliberate omissions
- No analytics
- Nothing here needs to know who you are.
- No CMS yet
- Content lives in code until Payload earns its place; the read functions are the seam.
- No client-side typing script
- The name is typed with CSS and respects reduced motion.
- No tech-logo wall
- The stack page names decisions, not brands, and every row links to proof.
- No light theme
- One palette, done carefully, beats two done halfway.
- Not everything is translated
- Prose that matters is bilingual; tool names and code stay as they are.