A lava lamp: soft blobs that drift, merge, and split.
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.
metaballs-gfx
Each pixel sums an inverse-square field from every blob — below a threshold it stays transparent, just above it gets a bright rim, and the interior fills with palette-shaded goo, so overlapping blobs melt into one smooth surface floating over your terminal.
metaballs
The same field as a glyph ramp running from a sparse rim to a solid core.
| Key | Action |
|---|---|
| space | add a blob |
| mouse click | blob at the pointer |
| a | toggle gravity |
| c | cycle palette |
| + / - | blob count |
| q / Esc | quit |
Tuning env vars use the METABALLS_* prefix — e.g. METABALLS_MAXDIM=1024 for sharper frames, METABALLS_CELLS=1 to force cell rendering even on kitty terminals. See the overview for the full tuning table.