A little order, a little instability.

This began as a local Python script for exploring tattoo designs. It became a browser-based lab for the Gray–Scott reaction–diffusion model: a numerical system in which local reactions and diffusion produce spots, stripes, and branching textures.

Grayscale reaction–diffusion pattern transitioning between spots and winding stripes.
A generated pattern spanning several kinds of order.

From a simulation to skin.

Designing a tattoo was the generator’s original purpose. The finished piece combines patterns inspired in part by the generator with geometric designs. Afterward, I grew the tool into a web app so that other people could explore their own patterns.

Tobias’s arm tattoo combining winding reaction–diffusion patterns, spots, and geometric motifs.
The tattoo that started the project: reaction–diffusion patterns alongside geometric designs. Tattoo artist: Corey Divine.

Experiment, then keep the recipe.

The live lab offers pattern families, parameter controls, pause and single-step playback, and seeded restarts. Saved recipes retain the seed, numerical controls, and engine version so an experiment can be shared and revisited.

Gray–Scott Pattern Lab interface with recipe controls alongside a live grayscale pattern preview.
The live lab: recipe controls beside the evolving pattern.

PNG exports carry recipe metadata that the application can read back. The render planner accepts physical dimensions and development steps, connecting a simulation to an image sized for a finished design.

The simulation behind the interface.

A React interface connects to a Python simulation through FastAPI and WebSockets. Live previews and queued high-resolution renders share bounded compute resources on my home server.

High-resolution exports run a fresh simulation from the saved recipe. The aim is to make exploration inviting while keeping the numerical choices explicit and reproducible.

Next: Elsewhere ↗