A WebGL art site: a spinning black hole consumes a procedurally generated cosmos over a twelve-minute cycle, then a new cosmos is born and it starts again. The site is the piece.
Live: https://michael-denyer.github.io/everything-must-go/
Behind it all: a baked galactic band and layered nebulae, satellite galaxies, star clusters, and a strobing pulsar, plus shooting stars — all of it draining into the disk and fading to black as the cycle consumes it.
Design spec: .planning/superpowers/specs/2026-07-02-everything-must-go-design.md
npm install
npm run dev # http://localhost:5173 (?debug for fps, ?seed=n)
npm test # unit tests (vitest)
npm run e2e # full e2e suite (Playwright, builds first)URL controls: ?seed=<n> picks the cosmos, ?cycle=<seconds> compresses the cycle,
?t=<0..1> freezes progress at a point in the arc, ?debug shows fps and phase,
?tier=high|medium|low pins the quality tier (disables the fps probe and live
downgrade).
Move to stir the gas, click during the fall to feed it something.
- Milestone 1: money shot — GPU disk, lensed shadow + photon ring + fold, bloom
- Milestone 2: the consumption cycle and rebirth
- Milestone 3a: solar system — planets, moons, rings, belt, comets, ring halo
- Milestone 3b: deep sky — nebulae, galaxies, clusters, pulsar, band
- Milestone 4: cursor well, silhouette cast, rogue-hole merger (built out of order, ahead of 3b)
- Milestone 5: adaptive score and enter gate — fully synthesized WebAudio score driven by cycle progress, behind an enter gate offering sound or silence
- Milestone 6: quality tiers, mobile touch, fallbacks, reduced motion, GitHub Pages deploy
Quality tiers scale particle count, pixel ratio, lensing, and bloom. Frame
rates below are read from the piece's own ?debug HUD.
| Tier | Device | fps |
|---|---|---|
| high | MacBook Pro (Apple silicon), Chrome | 120 (display-capped) |
| medium | same machine, 4x CDP CPU throttle | 120 (display-capped; the workload is GPU-bound, so CPU throttling does not degrade it) |
| low | real phone against the live URL | phone acceptance pass passed 2026-07-07 (look and feel accepted; HUD fps not captured) |
core (loop) → sim (GPU ping-pong particle textures) → render
(points, starfield, screen-space lensing) → post (bloom, ACES output).
Pure logic (seeding, color ramp, projection) is unit-tested; the rendered
frame is smoke-tested with pixel assertions.