Rust · wgpu · WebGPU · WGSL

Music Visualizer

Ten hand-built GPU worlds that react to every part of whatever you're playing: the kick, the snare, the hi-hats, the tempo, and the drop.

Free and open source (MIT). Windows 10/11 · Chrome / Edge with WebGPU.
The looks

Ten worlds, all shaders

Every look is a single WGSL fragment shader running on your GPU, about half a millisecond a frame. They stay full of detail even at 4K full screen.

Reacts to everything

Not just "louder = bigger"

A real-time analyzer splits the music into separate signals, and every look gives each one its own job.

Kick · snare · hi-hatSeparate onset detectors with adaptive thresholds, so a snare can flash the lights while the kick punches the camera.
Tempo & beat phaseA tempo tracker knows where you are inside each beat, so motion lands on the beat instead of after it.
The dropDetects the bass slamming back after a break-down and triggers shockwaves, strobes and boss fights.
Piano notesAn 8192-point FFT picks out the 88 keys, so the moonlit keyboard plays along with real piano.
Energy & brightnessQuiet verse or huge chorus, dark sub or airy treble: the scene changes how much is lit and what colour it is.
History & waveformThe last 3.2 seconds of spectrum and the raw waveform drive mountains, echoes and oscilloscope rings.
Try it

Run it right here

The browser version runs the exact same shaders with WebGPU (Chrome or Edge). Mouse control works too: press M, then move and click.

▶ Demo songA built-in 128 BPM track with a breakdown and a drop. ⧉ Share a tab's audioPick a YouTube or Spotify tab and tick "Share audio". 🎙 MicrophoneListen to the room: music from your speakers.
How it's built

One shader set, two runtimes

  • Windows app in Rust on wgpu / DirectX 12: a single 5 MB exe that lives in the tray, docks anywhere, snaps to edges and goes full screen.
  • System audio via WASAPI loopback, so it hears whatever your PC plays, with no virtual cables.
  • Glass UI on the GPU: frosted backdrop blur, gloss and a rim that glints on the beat. The look recolours itself from the current song's album art.
  • Chrome extension on WebGPU, running the same WGSL files, with tab capture.
  • Low latency: one frame in flight, so the visuals land on the sound. It runs at below-normal priority, so your games always come first.
~0.5 msper frame, per look
10shader worlds
5 MBsingle exe
// shaders/looks/my_look.wgsl: a whole look
// name: My Look
// palette: #ff2fa6 #8a3cff #22e0ff

fn look(fc: vec2f) -> vec4f {
    let p = centered(fc);
    let r = 0.35 + 0.25 * G.kick       // punch on the kick
          + 0.1 * spec(fract(atan2(p.y, p.x) / TAU));
    var col = pal(G.beat_phase) * glow(abs(length(p) - r), 0.02);
    col += vec3f(G.drop) * 0.3;        // flash on the drop
    return vec4f(col, 1.0);
}