Ryan Sanna

Writing

A Town You Can Click

The first version of this site's landing page was a particle field: thousands of glowing points orbiting a Möbius loop, comets, bloom, shockwaves on click. It was technically impressive and completely wrong. Watching dots circle at high velocity is low-grade stressful — the opposite of what I want a personal site to feel like. So I threw it away and built a village.

Calm as a design constraint

The town sits on a tiny voxel planet at dusk: five buildings, a pond with a dock, a cherry tree, lamplight. Every motion in the scene passed one test — would this be relaxing to leave open in a corner of your screen? Smoke drifts. Lanterns breathe like candle flames. Mist banks swell and fade along the shore. Occasionally a window somewhere turns off, because someone went to bed. Nothing orbits, nothing pulses for attention, and the camera moves only when you move it.

Buildings are the navigation

Instead of a menu that lists what I do, the town shows it. The library opens my writing. The barn holds projects. The workshop is GitHub, the office is LinkedIn, the post office sends mail. Each door carries a hand-drawn pixel glyph on a glowing signboard — a book, a forking branch, an envelope — so the buildings are legible before you ever hover. Clicking an internal door glides the camera down to the doorstep before the page opens, which turns navigation into the tiniest possible act of walking somewhere.

One world, one voxel language

Everything solid lives in one sparse VoxelWorld. Terrain, foundations, walls, windows, signs, doors, trees, caves, and anything the player builds use the same cells, materials, collision, lighting, mining, and chunk mesher. Houses begin as readable local cuboids, then an inverse rasterizer samples them onto the planet's rotated destination grid. That small distinction matters: projecting source blocks forward leaves duplicates and pinholes, while sampling the final lattice produces connected walls and clean rooflines.

The planet has weather, even when it doesn't

Beneath the town, the world is generated from a seed. Layered noise fields stand in for continents, moisture, temperature, ridges, and fissures; a biome pass turns those signals into oceans, coast, meadow, forest, badlands, highland, and polar ice. The same engine makes the distant ocean, desert, crystal, frozen, volcanic, and lunar worlds. There is no downloaded map — just a small set of rules producing the same place every time your browser opens it, plus lightweight material animation for water, stone, soil, sand, and ice.

Dusk is a lighting recipe

The mood comes from a short stack: a hemisphere light (violet sky above, warm earth bounce below), one warm directional as the just-set sun, a cool blue fill from the opposite side, and ACES filmic tone mapping that lowers exposure as daylight strengthens. The sky is a shader dome — a steep vertical gradient tuned for a low camera, with an afterglow term clamped to the horizon band and pointed west-southwest so the pink stays where sunsets live. Bloom is reserved for things that should glow: windows, lanterns, signs. When the whole scene blooms, nothing does.

A town that grows

The part I like most is the growth rule: each side project that ships gets its own building. The hosting underneath works the same way — a new site is one entry in an OpenTofu map. The town is a map of the infrastructure, drawn in boxes, and both are supposed to accumulate slowly for a long time.