Skip to content

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
—
  1. GPU simulation

    Live

    TSL → 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).

  2. Materials and post-processing

    Live

    TSL → 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.

  3. Orchestration

    Live

    TypeScript

    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.

  4. Interface

    Live

    Tailwind CSS + HTML

    Semantic, server-rendered HTML that works without JavaScript or a GPU. The 3D layer is purely decorative and hidden from assistive technology.

  5. Fluid dynamics

    Live

    C++ → 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.

  6. Engine core

    Live

    Rust → 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.

  7. Mood service

    Waking up

    Python (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.

  8. Realtime presence

    Waking up

    Go

    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.