The previous version of this site was a Hugo build on a premium resume theme โ capable, but heavy, generic, and never quite mine. Every personal site built from a template eventually hits the same wall: it says what a template says, not what you'd say. This is the story of replacing it, told start to finish.
The inspirations
The rebuild is openly derivative, and I think that's fine โ every good personal site admits its lineage in the footer.
- Nikhila Ravi's site provided the skeleton: IBM Plex Mono, a single centered column, emoji nav, a bio masthead, and a research page that's just a well-organized list. Her footer credits Peter Steinberger, Andrea Coravos, and Jon Barron โ it's a whole family tree of minimal researcher homepages.
- Peter Steinberger's site contributed the color
system โ that gray-and-orange contrast (
#ff6b01on a dark blue-gray) โ plus the blog list style with summaries and reading times, and the subtle hover animations on cards and thumbnails. - distill.pub and blogs like it are the north star for where the writing should eventually go: interactive, visual, genuinely useful explanations. Not there yet. Working on it.
The process
The whole redesign happened in a day of iterating with Claude Code. The rough sequence:
- Clone the bones. Rebuild the reference design in Next.js 15 (static export, no server): the mono typography, light/dark theme toggle, the 950px column.
- Pour in real content. All my publications with links, first-page thumbnails rendered from the PDFs, and downloadable PDFs for every paper. A bio that actually sounds like me.
- Make it mine. Circular portrait, the orange accent, navy dark mode, orange divider lines, an SP monogram favicon.
- Add the living parts. An MDX blog (this post is its first entry), a health page with a training heatmap, a /now page, a projects page waiting for content.
- Make it fast. The site went from 3.2 MB to 2.4 MB: images recompressed and lazy-loaded, fonts trimmed, and โ the fun one โ a three.js starfield hides as a dark-mode easter egg that only loads on a decent connection, after the page has already painted. Progressive enhancement means never paying for a decoration you can't see.
- Make it legible to machines. Sitemap, RSS, JSON-LD structured data,
and an
llms.txtโ because half the visitors of a personal site in 2026 are automated agents, and they deserve a clean summary too.
On the AI-written label
Every post here is labeled โ this one says ๐ค AI-written, because it was drafted by the same assistant that rebuilt the site. I have no interest in contributing to AI slop; posts like this exist to document real work while it's fresh. The handwritten ones are where I'll actually say things.
What one day of iterating taught me
The whole rebuild was a single long day of shipping and reacting. The lessons, in the order they hurt:
- Nothing may live behind text. The light theme went through three rejected backgrounds โ a filtered copy of the dark cosmos, graph paper, a solar-path diagram โ before landing on pure atmosphere: a soft light source that follows the local time of day. Every rejection traced back to the same rule: readers forgive an empty margin, never a busy one.
- Day and night shouldn't be copies. The dark theme is objects (a starfield you can touch); the light theme is atmosphere (light with no shape). Complement beats clone.
- Heavy decorations must earn their bytes lazily. The three.js scene loads only in dark mode, only on decent connections, only after the page has painted. A decoration you can't see should cost nothing.
- APIs lie by omission. Strava has no "give me the PRs" endpoint โ you reconstruct them by walking every run's best efforts, the effort names are inconsistently cased ("1 mile" but "5K"), and the rate limiter cuts you off mid-walk. Resumable scripts or nothing.
- The dumbest tools are often enough. Paper thumbnails came from macOS's built-in QuickLook renderer; the social preview card is an SVG rasterized the same way. No image pipeline, no dependencies.
- Voice takes more drafts than layout. Copy went through braggy, then too casual, then landed on complete sentences that stay humble. Getting a page to sound like yourself is real work โ and worth it.
- Ship in small commits. Nearly thirty deploys in one day, each one reviewable and revertable. The site was never broken for more than a few minutes, and never in a way a refresh couldn't show.
What's next
- Health & fitness writing โ fourteen-plus years of training, injuries, and comebacks worth sharing, plus live Strava stats on the health page
- A running group โ in the works, announcement soon
- Projects โ starting with my dotfiles (Neovim, tmux, a terminal tuned to be fast and pretty)
- Interactive posts โ the distill.pub ambition: MDX already supports embedding live React components in prose, so the infrastructure is ready when the ideas are
The lesson I keep re-learning: the fastest way to make a personal site feel considered is to delete things until what remains is only the stuff you'd defend.