Marbler

Marbler is paper marbling (ebru, suminagashi) in a browser tab. Drop ink on a virtual bath, drag a comb through it, pull a print onto simulated paper.

Emerald, dark green and gold ink combed both ways into a peacock pattern, with the tool sidebar on the right.
Classic mode: emerald, green and gold, combed into a peacock pattern.

The tools you drag through the ink are spray, stripes, rakes, combs, a stylus, stir, jiggle, vortex, air, an eraser, a way to freeze some ink in place, and hearts.

Seven ways to move ink

There are seven simulators underneath, and every tool works with all of them. Classic is closed-form math after Aubrey Jaffer's pst-marble; each drop pushes everything else outward. Spreading, Thin film and Film all model ink spreading across the water. Wake is a bath that keeps moving, so ink coasts and curls after you let go; Wake (fast) is the same thing drawn in a background worker. Grid ink (beta) moves color on a grid with a full fluid solve on the GPU, and that's where the soft blends come from.

Coral, teal, plum and cream stripes swirled into soft, blended spirals on a repeating tank.
Grid ink, the GPU fluid simulator, on a repeating tank.

A tank can repeat as a seamless tile (straight, brick or half-drop), so a pattern can become wallpaper or a textile repeat. Every pattern can also be a short JavaScript script: twenty-three examples ship with it, a session you did by hand can be copied out as a script, and a script can play on top of ink that's already there. Exports are PNG, SVG, a 3000-pixel print, or the simulated paper pull. A "How it works" page explains the math, every tool and every script command.

Olive, gold and dark green ink in a repeating endpaper motif with the words Ex Libris settled into the ink.
The "Library endpaper" example, with "Ex Libris" settled into the ink.

How I built it

Plain browser JavaScript, no framework: Canvas 2D for most simulators, WebGL for Grid ink, Web Workers for background drawing. I wrote almost all of it with Claude, starting on November 1, 2026.

I often ran two Claude sessions at once, one on the interface and one on the engine math. Each had its own git worktree and port, so experiments never touched the copy I was serving, and one session would fast-forward the other's verified commits. Claude also surveyed the research on marbling and fluid simulation, benchmarked the simulators on cloud GPUs, and checked the physics by rendering engine output to images in Node instead of eyeballing the browser.

figureThe built-in How it works page with a teal and copper marbled header.
The built-in "How it works" page.

It works, and it does a lot; the interface is still a rough demo, though. A redesign is next, then a public demo and the source.

This post was written using Claude. I am working through a backlog of posts and topics, and I don't want to keep delaying. I hope to revise this post myself and remove this comment in the near future.