[2026-04-16]#nextjs #design

Building this site — the bridge

Architecture and design choices, warts and all. With a stowaway in the vents.


Quick tour of how this thing is glued together, in case any of it is useful to you, or in case you're just curious why the homepage looks like a ship's bridge.

Stack

Nothing exotic here:

The one real decision was MDX vs a CMS. MDX wins because I would rather write posts in my editor than in someone else's web form, and because my posts are short enough that I don't need a preview environment.

The hero

The hero pane is a real <canvas>, not CSS trickery. It runs at 18fps on purpose. 60 felt frantic, 30 still felt busy, 18 is the sweet spot where your eye stops paying attention to it — a slow drift you only notice if you go looking. The columns reset on random intervals instead of synced frames, which is what keeps it from looking like a cheap screensaver. I kept calling the whole thing "warp drive" while building it and eventually the name stuck.

Two small things hook into it directly:

The easter eggs

I wanted these to live in a single directory so I could rip the whole lot out if it ever got embarrassing. components/easter-eggs/ has:

One global keydown listener dispatches to whichever egg cares. The command palette (⌘K) is the canonical way to run any feature by name, which conveniently saves me from having to remember my own keyboard shortcuts.

The second wave

The more interesting ones are the invisible ones — stuff you'd only stumble on if you were already poking at the internals:

The rain canvas also pauses itself via IntersectionObserver + Page Visibility, so scrolled-out-of-view and background tabs don't burn a single rAF.

Blog infrastructure

Deliberately boring. lib/posts.ts reads content/posts/*.mdx at request time (or at build, via generateStaticParams). Posts render on the server, so the reading experience ships zero client JS. If you've got JS disabled the posts still work; only the homepage loses the fun parts, which feels like the right trade.

That's most of it. Code's on GitHub. If you spot something broken or have a better idea for any of the above, my email is in the contact pane.