How this site works
Still being built. Here's what's under it so far.
The app
Rails 8.1 and SQLite, with Hotwire and no JavaScript build step.
The cloud
The dots on the home page are about 3,900 nanites (fewer on a phone), run by a Stimulus controller and drawn with WebGL. They spell out a greeting, then drift between a cloud, a galaxy, a ringed planet and a solar system. Hover and they gather toward you, tap and a ripple runs through them, swipe and they scatter like dust. If you prefer reduced motion, they drift slowly instead.
Starlings and fish
The feel I was after is a starling murmuration, or a school of fish turning away from a shark: thousands of animals moving as one shape that folds and pours, with nobody in charge. Each starling only keeps track of its six or seven nearest neighbors, and the shape of the whole flock emerges from those local decisions. Craig Reynolds showed in 1986 that three rules are enough to get there. His boids steer away from crowding, line up with their neighbors' heading, and drift toward their neighbors' center.
The nanites cheat. Boids have to find their neighbors every frame, which gets expensive fast with thousands of them. Instead, every nanite rides the same invisible current. Neighbours move together because they're sitting in the same water, not because they're watching each other. The trick is making that current look alive.
The math
The current starts as simplex noise, Ken Perlin's successor to Perlin noise: a smooth, random-looking value at every point in space. Three of those fields make a vector field, and the flow is its curl. A curl always has zero divergence, making it a solenoidal field, so the flow can't pile dots up in one place or tear holes in another. It can only swirl, like an incompressible fluid, and that's why it reads as water or a flock rather than jitter. The field is worked out on a 12 × 12 × 12 grid and blended for each dot with trilinear interpolation.
The current pushes each dot away from its home, and a damped spring pulls it back. Every dot gets slightly different stiffness and drag, so they never move in lockstep. The lag between them is what sends waves rippling across the shape. The homes themselves are bent by slower noise, so the free cloud grows lobes and tendrils. Moving from one shape to the next eases in and out along a smootherstep curve.
Drawing uses the painter's algorithm, far dots first so near ones cover them. Depth order barely changes between frames, so an insertion sort of last frame's order only has a handful of dots to move. All of them then go to the graphics card in a single draw call.
Hosting
One small server, deployed with Kamal.
For machines
AI agents get a plain-text map at /llms.txt, and every page carries a short note addressed to them. You can't see it, but they can.
What it doesn't do
No analytics, trackers, ads or third-party scripts.