Both captures below are real iTerm2 sessions running the demo — the same binary renders at pixel resolution where the terminal speaks the kitty graphics protocol, and as ASCII cells everywhere else.
smoke-gfx
A density field is advected by semi-Lagrangian backtrace through a procedural curl-noise flow plus buoyancy, dissipating as it climbs; alpha follows density so the smoke drifts over your terminal. c swaps grey smoke for coloured ink.
smoke
Density mapped to a ·:░▒▓█ ramp and the dye colour.
| Key | Action |
|---|---|
| space | puff |
| mouse click | inject dye |
| a | toggle the source |
| c | cycle dye colour |
| + / - | buoyancy |
| q / Esc | quit |
Tuning env vars use the SMOKE_* prefix — e.g. SMOKE_MAXDIM=1024 for sharper frames, SMOKE_CELLS=1 to force cell rendering even on kitty terminals. See the overview for the full tuning table.