GPU-procedural particles
Every point is positioned inside the vertex shader each frame from a topology function — there is no CPU simulation and no per-vertex position buffer upload.
Three fused input channels
Pointer, on-device MediaPipe hand-gesture recognition, and live microphone FFT analysis all drive the same shader uniforms through one attractor and turbulence pipeline.
Frame-rate independent by construction
Gesture debounce, camera easing, and audio onset detection all use a time-based exponential approach rather than a per-frame lerp, so behaviour is identical at 30Hz or 144Hz.
Adaptive quality budget
Particle count, pixel ratio, and inference rate are tiered from device memory and core count at boot, then trimmed live from measured frame time — never fixed for "average" hardware.
Zero-allocation hot path
Gesture ranking, temporal state, and audio band analysis write into pre-allocated scratch objects, so the render loop creates no garbage for the collector to pause on.
By the numbers
—GPU particles
59Playwright e2e tests
3Fused input modalities
0Server functions
0Per-frame GC allocations
Rendering: WebGL 2 + Three.js, custom GLSL. Vision: MediaPipe Tasks Vision, on-device. Audio: Web Audio API, on-device. Deployment: static file, strict CSP, zero server compute.
Built by