Dye advected through a divergence-free curl-noise field. Two framebuffers ping-pong every frame: sample where the fluid came from, fade a little, inject under the cursor. The curl of a noise field cannot converge or diverge, so it flows like a fluid without ever solving for pressure.
A live fluid simulation — dye advected through a divergence-free field, two framebuffers ping-ponging every frame. It wants a cursor to bleed into and a GPU that is not sharing a battery.
Below is how it is built.
Best on a desktop — bring a cursor ↗A real fluid simulation enforces incompressibility with a pressure projection — typically 20–40 Jacobi iterations per frame, each its own render pass. That is a serious frame budget for what is, here, a decorative background.
Full stable-fluids gives physical accuracy nobody looking at a marketing site can perceive, and spends most of the GPU getting there. On a mid-range phone it simply does not hold 60fps.
The curl of a scalar field is divergence-free by construction — ∇·(∇×F) = 0 identically. Advect dye through curl-noise and you get motion that cannot converge or diverge, so it behaves like an incompressible fluid without ever solving for pressure. Two framebuffers ping-pong: sample where the fluid came from, fade, inject under the cursor.
This is a visual fluid, not a simulation. There is no obstacle interaction and no true boundary response — you cannot put a wall in it and expect the flow to react correctly. For a background, that is the right trade. For a physics tool, it would be the wrong one.