Skip to content

How it’s made

For anyone who likes that sort of thing.

The blobs

The shapes on the home page are metaballs: each one is a soft falloff around a point, and where two of them overlap the falloffs add up and the shapes melt together. Move your cursor and they lean toward it — the closer ones lean harder, so the whole field bends rather than snapping.

It’s a hand-written WebGL2 fragment shader, a couple of kilobytes. Their colors aren’t decorative: each blob borrows the accent of one of the projects further down the page. Puppy Quest’s sage is sampled from a frame of the actual game.

What gets shown

The project list is a hand-kept file, not a feed. GitHub can only ever fill in details for something already in that file — it can never add an entry. Which means forking a repository can’t change what this site looks like, and a pile of old coursework can’t either.

Color and type

Every part of the interface itself is gray. All the color comes from the projects, each of which brings its own — so the site changes color depending on what you’re looking at.

There is one typeface. Headlines run wide and body text doesn’t, which is the width axis of a variable font doing the job a second family usually does, at no extra download. Drag it yourself — this is the same font file the headlines use, with nothing else loaded.

One family, two axes
Archivo. The headlines on this site sit at wdth 118, body text at 100.

What isn’t here

No animation library, no 3D library, no smooth-scroll hijacking, no component kit. One runtime dependency beyond React, and it’s the command palette. Everything that moves is CSS, a shader, or a browser feature that already shipped.

Behavior

Turn on reduced motion and the blobs hold still, the cards stop tilting, and pages stop animating between each other — everything still works, it just sits there. Demos load only when you ask for them. Everything is reachable by keyboard, and ⌘K opens search from anywhere.

Framework
Next.js 16, App Router, React Server Components
Styling
Tailwind v4, with the palette defined as CSS custom properties
Type
Archivo — one variable family, weight and width axes
Motion
CSS and cross-document View Transitions — no animation library
Data
GitHub REST API, revalidated hourly
Hosting
Vercel
Dependencies
One: cmdk, for the command palette