How this site works
Every language here earns its place.
Each layer uses the language best suited to its job, and covers the weaknesses of the others. These numbers are live from the particle field behind this page. Move your cursor to stir the fluid.
- Renderer
- Starting
- GPU particles
- —
- Frame rate
- —
- WASM fluid
- —
- Motion
- —
GPU simulation
LiveTSL → GLSL / WGSL
Every particle is simulated in a GPU compute kernel: spring forces towards the current shape, curl-noise turbulence, cursor swirl and the fluid field. It runs as GLSL on WebGL 2 by default and as WGSL on WebGPU (?renderer=webgpu).
Materials and post-processing
LiveTSL → WGSL / GLSL
The pink particle material and the lens-fringe and grain pass are written once in TSL, which compiles to GLSL or WGSL depending on the renderer.
Orchestration
LiveTypeScript
Next.js and React Three Fiber. Scroll position and cursor input live in a mutable store read inside the render loop, so moving the mouse never re-renders React.
Interface
LiveTailwind CSS + HTML
Semantic, server-rendered HTML that works without JavaScript or a GPU. The 3D layer is purely decorative and hidden from assistive technology.
Fluid dynamics
LiveC++ → WebAssembly
A stable-fluids Navier–Stokes solver (semi-Lagrangian advection, pressure projection, vorticity confinement) on an 80×80 grid, which also carries the pink ink your cursor leaves behind. Freestanding C++ with no libc or allocation, linked straight into the Rust module.
Engine core
LiveRust → WebAssembly
Owns the safe boundary around the solver, a critically damped spring that smooths your cursor, a fixed 60 Hz simulation clock, and half-float packing. It also lays other visitors' cursor paths into the same fluid, more gently than yours. The whole engine is one 28 KB module with zero imports; JavaScript reads the flow field through a zero-copy view of its memory and hands it to the GPU as a texture.
Mood service
Waking upPython (FastAPI)
Reads the time of day and live weather in Lagos (Open-Meteo, cached so the free API is asked at most every ten minutes) and turns them into scene parameters: warmer pinks at dawn, deeper fuchsia at night, more turbulence when it's windy, a slower, calmer field when it rains, and soft flashes during a storm. The footer shows the weather it's using.
Realtime presence
Waking upGo
A WebSocket hub that shares anonymous cursor positions between people here at the same time: theirs appear as faint rings that stir the fluid and ripple the particles, with a live count in the nav. Nothing else is sent (no names, no IPs), connections are rate-limited and capped, and only this site's origins may connect.