A real-time fluid simulation as a desktop wallpaper. Not a video loop — an actual Navier-Stokes solver running on your GPU, 8 compute passes per frame. Your cursor stirs it. When you're not touching it, it drifts.
⤓ Download the latest release · Try it in your browser
- Get Lively Wallpaper — free, open source (Microsoft Store or GitHub)
- Download
fluid-flow-wallpaper.zipfrom Releases - Drag the zip onto the Lively window, then click the wallpaper to apply
Right-click the wallpaper in Lively → Customise:
| Setting | Effect |
|---|---|
| Vorticity | Swirl strength — how long small whirls survive before dissipating |
| Color fade speed | How quickly dye fades to black |
| Cursor splat size | Width of the trail your mouse leaves |
| Ambient activity | Idle color puffs. Set to 0 for cursor-only |
| Simulation quality | Pressure solver iterations: 20 / 40 / 60 |
| Frame rate | 30 FPS (recommended) or 60 FPS |
This is Jos Stam's Stable Fluids (SIGGRAPH '99) implemented in WGSL compute shaders on WebGPU. Every frame runs a fixed pass pipeline:
curl → vorticity confinement → advect velocity → splat →
divergence → Jacobi pressure solve ×N → subtract ∇p → advect dye → draw
- Semi-Lagrangian advection — each cell traces backward along the velocity field and samples where it came from. Unconditionally stable at any timestep.
- Pressure projection — a Jacobi-relaxed Poisson solve enforces incompressibility. The solver is warm-started from the previous frame's solution instead of cleared, which buys convergence for free.
- Vorticity confinement — reinjects the small-scale swirl that grid advection numerically diffuses away.
- Dual-resolution grids — velocity and pressure solve on a coarse grid; dye advects at 1024p on top of it. All state lives in ping-pong texture pairs with bind groups cached by swap state, so the frame loop allocates nothing.
Wallpaper-specific behavior: capped at 30 FPS by default, drops to 20 solver iterations, and fully idles when hidden behind fullscreen apps or when Lively pauses playback — it should never show up on your battery graph.
The full write-up and an interactive version with a per-pass debug HUD live on my portfolio.
- Windows 10/11 with an up-to-date WebView2 runtime (Lively renders web wallpapers through it, and this one needs WebGPU)
- Roughly any GPU from the last 8 years
Seeing "WebGPU not available"? Your WebView2 runtime is outdated. Update it via Windows Update or microsoft.com/webview2, then re-apply the wallpaper. If it persists, open an issue with your Windows version and GPU.
MIT — do whatever you want with it. If you build something on top of it, I'd genuinely like to see it.
Built by Abhigyan Gandhi · MSc High-Performance Graphics & Games Engineering, University of Leeds
