The Fractal Engine, Tool by Tool

A fractal designer whose controls are the mathematics drawn as a technical drawing of itself, documented the same way: every tool explained in a few lines, with the engine running underneath.

1Jorik Jonathan Chase, 3DIE — Design, Art & Technologies Label. A companion to the Fractal Engine and to paper 0. October 2026.

Open the Fractal Engine. In the engine, the page glyph at the end of the row of toggles (the menu mark, top right) brings you back here.

The paper in one paragraph

The Fractal Engine draws fractals from a formula: a short list of operations, applied to a point again and again. Everything the engine does is a reading of that repetition, the orbit. Followed forwards from every pixel it gives a cave you can fly through; followed backwards from random points it gives a nebula; fed back through itself as an image it grows the picture frame by frame. On top of the orbit sit the tools: a hold that edits whatever moves the surface under your hand, a lens that turns the view into the map of two parameters, a lineage that keeps every formula you made, a ring of neighbours to breed from, four dimensions, species mixed inside the iteration, colour and motion as networks, and collages of finished shapes. This paper takes them one at a time.

Every figure is the engine itself, set up for the tool above it. A figure starts when it scrolls into view and stops when it leaves; click or tap it to take the controls, and press outside it to give the page back its scroll. Nothing you do in a figure is saved. The line under each figure is its formula as the engine has it at that moment. The mathematics sits folded in boxes marked The mathematics. WebGPU is needed: a recent Chrome, Edge or Safari.

To learn by doing, follow the two workflows step by step: a collage, start to finish and subgraphs, start to finish. Every key and gesture is on one page in the reference, and what the engine refuses is listed in its limits.

1. One Object: the Orbit

A formula is a list of operations. Applied to a point over and over, it gives the point's orbit, and the orbit is the only thing the engine computes.

Take a point in space, fold it into a box, fold it again through a sphere, scale it by 2.5 and add back where it started. Do it twelve times. Points near the shape stay near it; points away from it fly off. That is the Mandelbox [1], the shape you arrive in. The rule add back where it started is what makes it a Mandelbrot-type set, the same rule as z → z² + c in the plane [2].

The engine follows each orbit together with how it stretches space (its Jacobian), which branch of a fold it took, and how close it came to the origin. Colour, the surface, the glow, the chaos meter and the handles you grab are all statistics of that one trace. So the look is separate from the geometry by construction, and every tool below reads the same object.

1.1 Notation

A formula is written as one line of text. Operations are separated by a dot, numbers follow their operation, and ×12 says how many times the list runs. The arrival formula reads

fold.box 1 · fold.sphere .5 1 · scale 2.5 · +c ×12 bail=100

Twenty-nine operations make up the library: folds through a plane, a box, a box with a limit per axis, a sphere, the absolute value and a sort of the coordinates, a stepped fold (section 5.7); powers (the triplex bulb, the complex power, inversion, a twist); the affine moves (translate, +c, scale, rotate); the 4-D forms (rotate4, sort4, bulb4, quat); the lattice wrap, the Kleinian step and three seeds (section 5.6); and five flame variations for the push engine [3]. A letter word after the count is a schedule: ×12 AAB alternates two op lists, a hybrid. c=x,y,z fixes the constant and gives a Julia set; slice=…, shade=… and drive=… carry the 4-D slice, the colour network and the drivers (sections 5, 6). The line, the JSON behind it, the graph of section 5.5 and the URL are one object: every formula is its own address, and its hash is its gallery id.

DesktopTouch
See the op list as glyphsTab (the strip, bottom left)tap a corner mark
Flydrag to look, wheel to move, WASD QEone finger looks, pinch moves along the view, two-finger pan slides
Drift on or off (it is on until your first press or key)Spacethe drift glyph in the structure layer
The arrival view: inside the Mandelbox, the structure layer open. The strip at the bottom left is the op list as glyphs (a square with a crease is the box fold, a circle in a circle the sphere fold, nested squares the scale, a dot with cross-hairs +c), the ruler beside it has one notch per iteration. Type a formula and press Draw; a new formula is drawn from where the camera is, so a small shape may need a wheel or a pinch backwards.
The mathematics

A formula with op list f1, …, fm is the map F = fm ∘ … ∘ f1, and the orbit of a point p is p0 = p, pi+1 = F(pi), stopped after N steps or when |pi| passes the bail radius. A schedule word picks which list runs at step i. Each op carries four things: its forward map, an inverse branch (one preimage, picked at random where there are several), a rule for the running derivative, and its Jacobian. The derivative rules are few: isometries (folds, rotations, translations) leave the running scale dr unchanged, a scale multiplies it by |s|, the bulb by n rn−1, and +c adds one when c follows the point.

2. Three Ways to Draw

The same formula is drawn three ways: forwards from every pixel (pull), backwards from random points (push), and as an image fed back through its own map (loop). P or a double click cycles them.

2.1 Pull: the Cave

Pull marches a ray from the camera through every pixel. At each step it asks the formula how far the nearest surface could be, the distance estimate, and moves that far. Near the surface the steps shrink, and where they fall below a pixel the ray has hit [4] [5]. The estimate comes from the orbit itself: how far the point travelled divided by how much the formula stretched space along the way [6].

A lamp rides just off the camera, so enclosed caves are lit wherever you are; shadows and ambient occlusion appear when the view is still; depth of field focuses on whatever the centre ray hits. Every speed is the distance estimate at the camera: a hall and a crevice feel the same under the hand, and moves that would enter the surface are refused.

Two shaders draw the same formula. An interpreter reads the op list from a buffer and never recompiles, so editing is instant. A JIT writes the formula out as its own shader, every operation inlined and the loop unrolled, compiled in the background once the structure is known; it runs two to twelve times faster and takes over by itself. The two are checked against each other and against a float64 CPU reference on every change. Hover the line under a figure to see which one is drawing.

DesktopTouch
Lookdragone finger
Move along the viewwheel; W S, Shift fasterpinch
Slide sideways, upA D, Q E; the arrow keys are W A S Dtwo-finger pan
Pull: the arrival view, a room inside the scale-2.5 Mandelbox facing a terraced amphitheatre. Until your first press the camera drifts toward the most open direction, four seconds after anything else moved it.
The mathematics

With r = |pN| and dr the running derivative, the engine uses two estimates. Fold formulas (an iterated function system run forwards) take

d = r / |dr|,

whether or not the orbit escaped. Power formulas take the potential-based estimate of escape-time fractals,

d = ½ · r log r / |dr| outside the set, 0 inside.

Sphere tracing is safe when d never exceeds the true distance (the estimate is a lower bound, or Lipschitz with constant 1). Operations that break the bound inside the loop, such as a rotation between folds, mark the formula not pull-safe and the march shortens its steps.

2.2 Push: the Nebula

Push runs the formula backwards. The inverse of an expanding map is a contracting one, so walking a point through random inverse branches draws the attractor, Barnsley's chaos game [7]. 32,768 walkers take 24 steps a frame; every sample lands as a small Gaussian splat whose shape follows how the inverse steps squeezed space, and the histogram is tone-mapped by log density as flames are [3]. A walk that hits a dead end backs up instead of retrying in place, so thin branches are not swallowed.

Pull and push are one formula in opposite directions. Without a fixed constant, push shows the Julia set of the point you are looking at, so one toggle gives the cave and the nebula from the same seed.

DesktopTouch
Pull → push → loopP or double clickdouble tap, or the mode glyph in the row (section 9)
Push: the Sierpiński tetrahedron as a cloud of splats. Each fold has two preimages, and the walk picks one at random every step. Press P twice (or double tap twice) to see the same formula pulled as a solid.
The mathematics

A walker at xk takes one random preimage, xk+1 = Fj−1(xk), through the ops in reverse. The splat's covariance rides the walk,

Σ ← J Σ JT + ε² I,

with J the inverse step's Jacobian (by finite differences with the random choices replayed) and ε one pixel's footprint at the focus. The thin-lens circle of confusion is added to the projected covariance, which gives depth of field for free [8]. Brightness is the log of the density, colour the mean colour landed.

2.3 Loop: the Optical Machine

Point a camera at a monitor showing the camera's own picture and the image feeds back through the optics: the distance is a scale, the roll a rotation, the tone knobs a nonlinearity. Crutchfield showed in 1984 that this is an iterated map acting on images [9], and Dave Blair's Light Herder turned it into an instrument [10]. The loop engine is that machine with the formula as its optics: every frame, each pixel looks up where the formula sends it in the last frame, so the escape-time picture grows out of noise instead of being computed.

The screen is a window on a plane. Its knobs are the monitor's: hue rotation, saturation, gain, contrast about a dark pivot, decay, blur, a seed of sparks and how much of the field is fed in. Gain times decay just under one gives the nested halos of escape time; at or above one the set saturates.

DesktopTouch
Zoom the windowwheelpinch
Pan, rolldrag; Shift-drag rollspan; two-finger twist rolls
Turn two knobshold still, then drag sideways for the first, up and down for the second; wheel for the next pairhold, then drag; a second finger's tap for the next pair
Loop: z² + c at Douady's rabbit, c = −0.123 + 0.745i [11], growing from sparks. Hold to grab the knobs: gain and hue first, then contrast and blur, saturation and decay, noise and field.
The mathematics

One pass is

I′(y) = T( blur( I( F(y) ) ) ),

with F the formula's forward map and T the tone curve. Pulling back through F is pushing forward through its inverse branches, so the loop applies the Hutchinson operator of F's inverses to the whole image at once [12]; formulas with two op lists sum both pull-backs, the beam splitter of the optical rig. For a 3-D formula the plane shows the shadow of the dynamics.

3. Derivatives: Chaos and the Metric

Every orbit is followed together with its derivative, in position and in one parameter. From that one mechanism come the normals, the Lyapunov exponent, and a measure of how far each parameter moves the surface on screen.

The shader carries dual numbers: alongside each coordinate, how it changes when the starting point or one parameter changes [13]. Five columns ride through every orbit: three for the position gradient (the surface normal), one for the selected parameter, one for the Lyapunov exponent. The exponent says how fast nearby orbits part: negative where the dynamics is calm, positive where it is chaotic [14].

L colours the surface by it, about the view's own median: calm surfaces dark and cool, chaotic ones hot and glowing. In the Mandelbox the sphere-fold pits run hot and the box faces stay calm.

The parameter column gives the metric. A sensing pass marches a coarse grid of rays to the surface and measures, for every parameter, how many pixels the surface moves per unit. Raw sensitivities differ sixfold between the Mandelbox's parameters; divided by the metric, one pixel of hand motion moves the surface about one pixel whichever parameter it is. Every tool in section 4 is built on it.

DesktopTouch
Lyapunov channelLthe Lyapunov glyph in the row (section 9)
The Lyapunov channel on the arrival view. Hot is chaotic: a small change there grows fastest, so that is where an edit will change the most.
The mathematics

Normals are the gradient of the distance estimate from one dual orbit. The Lyapunov exponent is

λ = limn→∞ (1/n) Σi log |J(pi) vi|,   vi+1 = J vi / |J vi|,

at fixed c, along the hit point's orbit. The metric of parameter θ at a hit is the normal speed of the surface, (∂d/∂θ) / |∇d|, divided by the pixel's footprint at that depth: pixels per unit. The view's metric is the RMS over the grid's hits. GPU and CPU agree to a median gradient angle of 0.000° and a median relative ∂d/∂θ error under 6·10−5.

3.1 The Derivatives, Compiled

Nothing here is for the hand: the same pictures arrive faster. Section 2.1's JIT writes the forward orbit out as its own shader; the dual orbit that runs at every hit is compiled beside it, into the same pipeline, and the interpreter draws until it is ready. One op becomes one block: what its forward map and its derivatives share is computed once, and a branch that leaves the derivatives alone holds no code. What no hit reads (the selected parameter's column, the colour) is left out. Chimeras unroll, and drivers are written in with their derivatives. Collage pieces compile only the Lyapunov column, and a light collage loses a little: the three-piece test scene runs 3 to 5 % slower, three compiled orbits behind a switch costing about what one saves.

SceneStill, beforeAfterGain
Mandelbox cave37.8 ms29.8 ms×1.27
Menger8.7 ms5.4 ms×1.61
Driven bulb27.5 ms8.6 ms×3.19
Driven Mandelbox245.4 ms124.4 ms×1.97
Chimera156.8 ms77.5 ms×2.02
Three-piece collage13.8 ms14.3 ms×0.97

GPU time per frame at 1440 × 900 on an M3 Pro. The images match the interpreter's to at least 61 dB (SSIM ≥ 0.9999), collages exactly. Push and the loop do not run the duals, so they are unchanged.

4. The Hand: Grab, Lens, Lineage, Breeding

There are no sliders. You edit by holding the image where you want it to change; the engine finds what moves the surface there.

4.1 Grab

Press and hold still for a moment. A sensing pass of 25 rays around the cursor ranks every parameter by how far it moves the surface there, scaled by the parameter's own size so lengths and angles compete fairly. The first is the attention op: its handle appears as its own geometry (the fold plane, the box's edges, the sphere fold's two radii, the scale as nested squares), with the reticle around the held point and the point's real orbit inside it. The ticks on the reticle's ring are the Lyapunov exponent: dense and bright where a change is about to turn chaotic. Drag sideways to edit at the metric's rate. The value appears on a dimension line; it is the only number on screen.

DesktopTouch
Grabhold still 280 ms at the cursor, drag sidewayshold anywhere: the grab aims at the centre crosshair, the finger only drags
Next op in the rankingwheeltap a second finger
Undo the grabEsctwo-finger tap afterwards
Pin this regionF in a grab; F on a pin removes itdouble tap a second finger

A press that moves more than 5 pixels in the first 280 ms is a look, not a grab, and a quick click does neither. Only a sideways drag edits; up and down do nothing yet. There is no grab in push, which has no surface to sense, and in the loop a hold takes the knobs (section 2.3).

Hold on a wall of the amphitheatre and drag. On this view the box fold's limit usually comes first; the wheel passes attention to the sphere fold's radii and the scale. Watch the line under the figure: the grab rewrites the formula as you drag.
The mathematics

With θ0 the value at the press and m the local metric in pixels per unit, a drag of Δx pixels sets θ = θ0 + Δx / m. Parameters rank by m · max(|θ|, 0.1) (10 for angles). Pins stop the parameters that score at least a quarter of the top one at the pinned point from wandering in the drift (section 4.4).

4.2 The Atlas Lens

The Mandelbrot set is the map of the Julia sets: each of its points is a parameter, coloured by what that parameter does. The lens generalises the idea to any two parameters of any formula. Hold Shift in a grab and the view becomes the map of the attention parameter and a second one, coloured by how far (in pixels) the surface would be from the held point under each pair. The key colour sits where the surface would touch the point; a hairline marks every doubling of distance. The map spans exactly what a drag across the screen reaches. Moving travels it, both parameters change, and the field itself updates live in a round inset; letting go closes the lens and the grab carries on from there.

DesktopTouch
Open the lensShift during a grabrest a second finger during a grab
Travel itmovedrag the first finger
Grab, then hold Shift (or rest a second finger): box limit against the sphere fold's fixed radius around the point you hold. Dark is far, the bright band is where the surface would come back to your point.
The mathematics

Each pixel of the lens is a pair (θ1, θ2) = (θ10 + u/m1, θ20 + v/m2), and its value is the distance estimate at the held point under that pair. The shader reads every op record through overrides that add Δθ · ∂record/∂θ, exact for parameters the record is linear in (all but rotation angles and plane normals, which the lens does not offer). It is the held point's own Mandelbrot set.

4.3 The Lineage

Every formula you make is a node in a tree: going back and editing starts a branch, so nothing is ever overwritten and yesterday's shape is always one click away, the feature the physical machine cannot have. The structure layer shows it as dots and hairlines, the big dot being now; hover a dot for its thumbnail. Moving between nodes is never a crossfade: within one structure the parameters and the camera move in 350 ms, so every frame in between is a real fractal; across structures the old image flows through the new formula's map in the loop engine. R replays the whole lineage from its root at constant visual speed. Any input stops a replay. In the live engine the lineage is kept in your browser (600 nodes, thumbnails for the newest 160); in these figures it lives only as long as the figure. Every edit makes one node when it ends, and so does a change of mode. A dot can also be dragged onto the field: its formula joins what is on screen as a collage's piece (section 7.3).

DesktopTouch
Structure layerTabtap a corner mark
Back, forward⌘Z, ⇧⌘Ztwo-finger tap, three-finger tap
Return to a nodeclick its dottap its dot
ReplayRthe replay glyph in the structure layer
Grab and drag twice (two edits make two nodes), go back with ⌘Z or a two-finger tap, and edit again: the lineage at the bottom grows a branch.

4.4 The Breed Ring, the Archive and the Drift

Hold still for longer, 1.2 s, and eight neighbours open around the cursor. Four are near: the formula stepped 35, 60, 90 and 130 pixels across the screen in a random direction. Four come from an archive of variety that grows in the background whenever your hand is off: a MAP-Elites grid of the best formula found for each combination of how much of the view is surface and how chaotic it is [15]. They sit around the cursor in the direction of their features, and a spoke's length is how different the neighbour looks. Release on one and the field walks there at a constant visual speed; the wheel brings farther or nearer neighbours. Picking from a gallery of variations is old [16] [17]; here the distances are measured.

The drift is the same idea without the hand: the camera glides toward the most open way and every unpinned parameter wanders a few pixels about its home value. The engine arrives drifting. Your first press or key turns the drift off for the session, so nothing moves under a working hand; Space, or the drift glyph on touch, turns it back on, and it then starts four seconds after your last input. It waits while a grab, the graph or the Metasurface is open. F in a grab pins that region: the parameters that move it stop wandering, the pin shows in the structure layer, and F on a pin removes it. Pins are how a composition is herded.

DesktopTouch
Open the ringhold still 1.2 shold 1.2 s: the ring opens mid-screen
Choosepoint, release on a thumbnailpoint, lift on a thumbnail
Farther, nearerwheelpinch
Stayrelease at the centre, or Esclift at the centre
Keep a neighbour as a piecepoint past its thumbnail by 60 px: it follows the hand; release on the fieldthe same
The Mandelbulb [18]. Hold still until the ring opens; the archive fills while you watch, so a ring opened after a minute offers more variety than one opened at once.
The mathematics

A neighbour D pixels away moves each unpinned parameter by θk += D zk / mk, with z a random unit vector, so its visual distance is known before it is drawn. Spoke length is 110 + 110 tanh(D/160) px. Walks move parameters linearly in time at 150 px/s by the metric. The drift is an Ornstein–Uhlenbeck walk about the home value [19], dθ = −κ(θ − θhome) dt + σ dW, with σ = 6 px/√s divided by the metric, so every parameter wanders the same few pixels on screen.

5. New Species

Three ways to mix formulas are kept apart. Breeding interpolates the parameters of one structure. A chimera blends two structures inside every iteration, a new dynamics. A collage joins finished shapes (section 7).

5.1 The Fourth Dimension

The orbit lives in four dimensions and the camera in three. A slice, an offset along w and a tilt toward it, places the 3-D world inside the 4-D one. Moving the slice is flying through the fourth dimension; tilting it turns the world toward it. A 3-D formula is a 4-D formula whose ops leave w alone, so the slice changes nothing for it until a 4-D op (rotate4, bulb4, quat, sort4) mixes w in. Quaternion Julia sets are the classic case [20].

DesktopTouch
Move along w⌥ + wheelthree-finger pinch
Tilt toward w⌥ + dragthree-finger drag
A quaternion Julia set, q → q² + c. Hold ⌥ and turn the wheel (or pinch with three fingers): the 3-D section slides through the 4-D set and its topology changes as it goes.
The mathematics

The world point (x, y, z) enters the orbit as x4 = T · (x, y, z, w0), T the rotation by three tilt angles in the xw, yw and zw planes. Every layer (ops, duals, inverses, the JIT, push and loop) carries a vec4; a push sample projects back through the slice with a Gaussian weight on its distance from it.

5.2 The Chimera

Write two op lists in brackets and both run on the same point in the same iteration; the point is then blended between them. Neither formula's shape survives intact: the blend has dynamics of its own, a new species. The weight can be a constant, or a field over the point, so one species gives way to the other across a wall.

[fold.box 1 · fold.sphere .5 1 · scale 2.5 ‖ abs · sort · scale 3 · + -2 -2 0] axis .5 1.5 1 1 0 0 · +c ×12

DesktopTouch
Make onethe graph (5.5): hold an edge, pick the fork glyphthe same, with a finger
Move the wall, the blendgrab (4.1): w, k and r are parameters like any othergrab
A Mandelbox and a Menger-type fold mixed inside the iteration, the weight rising along x. Neither species is ever drawn alone; at every point the orbit is part one and part the other.
The mathematics

p ← (1 − ω) FA(p) + ω FB(p),   ω = σ( logit w + k n̂·p + r(|p| − 1) ).

Its Jacobian is (1 − ω)JA + ωJB + (FB − FA)∇ωT. The running derivative takes Σ ωi dri, the bound on the first two terms; the field's own stretch stays out of it (it grows along escaping orbits and would destroy the estimate far from the set), so a steep wall can be overstepped a little. Push has no closed inverse: one species' inverse is a first guess, refined by Newton on the blend.

5.3 Fields and Tissue

The weight of a chimera is a field, and the field library has eight kinds: a constant, an axis, a sphere, four-dimensional noise [21], Voronoi tissue [22], and three fields read from the fractal itself, its orbit trap, its depth and its running stretch, so a formula can mix itself by its own dynamics. Tissue takes two to seven species: n cells, each one species, with soft walls between them. A field is read either at the orbit point every iteration (new dynamics) or at the world point the orbit started from (a spatial tissue: the shape varies across space).

Tissue: six cells of Mandelbulb, alternately power 8 and power 3, with soft walls. Grab a seam to edit the cell size or the wall's softness.
The mathematics

Tissue weights are a softmax over the sites xj, ωj ∝ exp(−|x − xj|² / (soft · size)), site j a cell of species j mod k. A scalar field s(x) maps to k species through u = (k − 1) σ(logit w + s(x)), shared between the two species it falls between.

5.4 The Metasurface

Sixteen families (Mandelbulb, 4-D bulb, quaternion Mandelbrot and Julia, Mandelbox and its −1.5 form, Amazing Surf, Mandalay, a 4-D-rotated Mandelbox, Menger, Sierpiński, KIFS, pseudo-Kleinian with and without pillars, Apollonian, Kleinian) lie on a square as Voronoi cells, each site its family's thumbnail. Drag the crosshair and the formula follows: inside a cell the family is bred along its own two axes; across a wall, sites of one structure blend their parameters and different structures become a chimera [23]. A stroke can be played in time (a walk through the families) or laid in space (species ordered across the world along the stroke). Any formula can become a site of its own. The four lattice families of section 5.6 have no outside to frame, so their sites open with the camera inside a hall.

Your own sites live in this browser, up to thirteen beside the sixteen families; moved families are remembered too, and a corner mark stays bright while the layout differs from the default. A site that is a chimera has a hard wall, drawn as one hairline: crossing it is a cut, unless the chimera is a constant blend. While the surface is open on a touch screen, only the structure layer's key row answers outside it.

DesktopTouch
Open, closeM, Escthe Metasurface glyph in the row
Breed, blenddrag the crosshairdrag
A stroke in time, in spaceShift-drag, ⌥-dragdraw with one finger resting, with two resting
Go to a siteclick its disctap it
Add a site's formula as a collage piecehold still on its disc (0.45 s): a ring fills around ithold
Drop your formula as a sitehold still on open ground (0.45 s): the ring fillshold
Move, remove a sitedrag its disc; off the square, yours is gone and a family goes homethe same
Send the families homedouble-click a corner of the squarepress a corner twice
The Metasurface over the dimmed field. The hairline bands around each wall are where the blend is soft; the spokes from the crosshair go to the sites it draws on.
The mathematics

Site weights are πj ∝ exp(−(dj − dmin) / 0.035), so a cell is pure until about 0.1 from its wall. Sites of one structure interpolate parameters exactly; different structures join a constant-weight chimera (blend a b c …). The walls drawn are contours of max πj at 0.6, 0.8 and 0.95.

5.5 The Graph

The strip in the structure layer is a folded network. Unfolded, it is the formula drawn top to bottom: each op a glyph node, a chimera a fork into its species and a join at its field's glyph, the iteration a repeat zone with its loop up the right side and the count and schedule below. It is the formula itself, not a picture of it: every edit here is an edit of the line of text, and one node in the lineage.

DesktopTouch
Unfold, foldG, or click the stripthe graph glyph; pinch it closed to fold
The field without an ophover the nodepress the node
Edit a parameterclick the node, drag its dimension linestap, drag
Insert ophold an edge: the ring of ops (and the fork)hold an edge
Add species, change the fieldhold the field nodehold the field node
Move, deletedrag a node onto an edge; Deletedrag; fling it off, or a three-finger tap
Iterationsdrag the count, one per 12 pxthe same
Scheduleclick a letter, then a letter key (A–H); Delete drops it; the plus after the letters adds onedrag a letter up or down; the plus
Add a chainthe plus beside the last chainthe same
Zoom the drawingpinch and pan inside; pinch closed past 0.6 folds it
Back outEsc clears the ring, then the selection, then folds the graph; G folds it; a press outside folds ittwo-finger tap; a press outside, on release
The tissue of 5.3 as its graph: a fork into two species (bulb 8, bulb 3) joined at the tissue's glyph, inside the repeat zone. Hover a node to see the field without it.

5.6 Seeds: the Families That Never Escape

The formulas so far stretch space, and the distance estimate measures that stretch. A second kind only folds and inverts: at scale 1 an orbit never escapes, so there is nothing to measure and the old estimate fills all of space. These are the sphere lattices, tunnels and packings of the pseudo-Kleinian family [24], Apollonian packings [25] and Jos Leys's Kleinian limit sets [26].

They are drawn with a seed: a shape placed at the end of the iteration. An op does nothing to the point; the estimate reads the distance to the shape where the orbit ended, divided by how much the folds stretched space on the way. The fractal is the seed seen through every fold. There are three, seed.slab, seed.sphere and seed.pillar. A seed is an op like any other, so the grab, the lens, the ring and the drivers all reach its numbers. fold.cell is the box fold with a limit per axis, wrap folds space into a lattice, and kleinian is one step of Leys's algorithm, its two numbers the real and imaginary parts of the group's trace on Maskit's slice.

DesktopTouch
Go to a familyM, click its site: the camera lands inside its hallthe Metasurface glyph, tap its site
Build onehold an edge in the graph: the seeds, fold.cell, wrap and kleinian are in the ring of ops; or type it (section 1.1)hold an edge
Change the latticegrab (4.1): cell limits, seed offset, the trace's a and bgrab
Fly the hallswheel, dragpinch, one finger
fold.cell · fold.sphere 0 1 · seed.slab: a pseudo-Kleinian hall, the strata ramp on its orbit trap.
The same fold with a pillar for its seed, the "thingy" of knighty's shader, in the bone ramp.
Apollonian: wrap · invert · scale 1.1 · seed.slab, a lattice folded through a sphere, in the engine's own colours.
Kleinian: kleinian 1.95 .02, a limit set on Maskit's slice.

Two limits. The Apollonian slab's estimate is scaled by .4, which keeps the measured stretch under 1 at the 99th percentile, so the march stays safe. The Kleinian estimate jumps at the wrap's seam, where nearby points land on opposite sides of the lattice: the measured stretch there reaches 11 to 13 where a true distance has 1. An overstep at that seam is possible; none has been seen. In push these families read as star clusters and webs, sparse beside pull. Walking the Metasurface between two halls, a blended camera can land on a surface for a frame or two, never at rest.

The mathematics

Pseudo-Kleinian, per iteration: p ← 2·clamp(p, −l, l) − p; k = max(r²/|p|², 1); p ← k p; D ← k D. No +c. The estimate is |v(p)/D − t|, with v the distance to the seed: ½|z| for the slab, max(ρ − r, |ρz|/|p|) for the pillar. An orbit that does escape keeps r/dr. Sampled over 20,000 point pairs a half-estimate apart, the Lipschitz constant has a 99th percentile of 1.02 and a maximum of 1.9 for the slab. Kleinian: wrap into a box, turn half the box through 180° about the separation line, invert: z ← −z/|z|², shift by the trace; estimate min(y, a − y, .3)/max(dr, 2), 99th percentile 1.25.

5.7 The Mandalay Fold

DarkBeam's stepped fold, adapted by knighty [27]: where the box fold reflects each axis at one wall, fold.mandalay sorts |z| and steps the axes against each other, so faces rise into towers and domes. It stands in the Mandelbox's place in the formula, and it is what Tom Beddard's Aurullia series was built from [28].

fold.mandalay .5 .15 · fold.sphere .5 1 · scale 2.3 · rotate 0 0 10 · +c ×12

DesktopTouch
Go thereM, click the Mandalay sitethe Metasurface glyph, tap its site
Fold offset, stepgrab (4.1): fo and ggrab
Use it elsewherehold an edge in the graph, pick it from the ring of opshold an edge
The Mandalay family at its Metasurface values, the malachite ramp on its orbit trap. Grab a tower and drag: fo moves the steps.
The mathematics

The estimate here is a heuristic. fold.mandalay uses the box family's r/dr and counts the fold as a stretch of 1, as Mandelbulber does. But 50.2 % of [−4, 4]³ lies on branches where one axis takes another's value: no isometry, a stretch of up to √3. Nothing has overstepped visibly. Those branches have images of no volume, so a generic point's preimages are all axis-wise, and the inverse tries those at random, checking each forward.

5.8 Subgraphs

A run of ops can be named and used in several places, so that an edit to one reaches them all. In the text it is a letter: a( … ) the first time, with its ops, and a( … ) after that with only what is its own.

fold.box 1 · a( fold.sphere .5 1 · scale ^1.8 ) · +c · rotate 0 0 15 · a( 1.4 ) ×8

The two uses are linked: the structure and every number are shared, so moving the sphere fold's radius in either moves both. A number marked with ^ is exposed: it belongs to each use, here 1.8 and 1.4, and a folded use shows it as an ordinary dimension line. Detach turns one use back into plain ops and leaves the others linked. The same link works on a piece of the shading network or the driver lane. Breeding treats a shared number as one gene that moves every use, an exposed number as one gene per use, and never touches the structure.

A definition lives in its formula, so a URL or an export carries it. To use a subgraph in another formula, the shelf keeps saved ones in this browser; placing one copies it in, with no link back.

DesktopTouch
Choose a run of opsShift-click its nodesa second finger grows the run
Wrap runthe plus on the run's bracketthe same
Open a use in placedouble click; Esc closesdouble tap; two-finger tap closes
Use it againShift-drag a use onto an edge, or pick it in the edge's ringdrag with a second finger resting, or the edge's ring
Give a use its own numberwith it open, pull a line off itself and drop it on the dashed frame; pull it back inside to share it againthe same
Detach use, save to shelfhold a use: the ringhold
Remove a useclick it, Deletethree-finger tap
Subgraph a used twice in one iteration, with a turn between the uses.
The same formula's graph: each use is its run's glyphs between brackets. Double click one to open it, or rest on it for its name.

The limits. The engine's eight slots and 64 ops count every use, because each use is real ops: a subgraph saves typing, not GPU space, and a chimera subgraph used twice takes its species' slots twice. The lens's preview of a shared number moves the first use only; the value applied on release is exact. Ramp stops can't be exposed (a ramp's map lines can). A subgraph can't contain a subgraph, and no link crosses collage pieces. A shelf holds eight entries: an entry can't be removed, and a ninth saved one pushes out the oldest.

The mathematics

A subgraph is a list laid over plain ops: { id, n, uses, expose }, the path of each use's first op and the exposed numbers. The renderer never sees it. An instanced formula packs byte for byte as its written-out form, so the shaders, duals and JITs are the same. In the metric, a shared number appears once and carries the sum of what its copies move: an upper bound, since their partials may cancel, so a step of D pixels never moves more than D.

5.9 Workflow: Subgraphs, Start to Finish

Follow these in the figure below: the arrival Mandelbox with its graph open and no subgraph yet.

A plain formula's graph. Enter it, and wrap the sphere fold and the scale.
  1. Wrap a run. A run is a stretch of ops in one chain, clear of other subgraphs. Choose its two ends; a bracket with a plus appears beside them; the plus wraps the run. It takes a letter, a, and folds: its glyphs shrink between brackets. Desktop Shift-click the first op, Shift-click the last, click the plus.Touch Hold the first op, tap the last with a second finger, tap the plus.
  2. Open and fold it. Open, a use is drawn in place in a dashed frame with the rest of the graph in sight. Edit inside: every edit reaches every use. Hold an edge at the frame's inner ends to add an op to the run itself. Desktop Double-click the use. Esc closes it.Touch Double tap. Two-finger tap closes it.
  3. Place another use. The new use is linked: it shares the structure and every number. Desktop Hold an edge: the ring lists this formula's subgraphs first. Or Shift-drag a use onto an edge.Touch Hold an edge. Or hold a use, rest a second finger, and drag it onto an edge.
  4. Expose a number. Exposing makes a number belong to each use instead of being shared. With a use open, select an op, pull its line off itself and drop it on the dashed frame: a dot appears there. One number, one inner parameter. In the text it gets a ^. Desktop Double-click the use, click the op, drag its line up and onto the frame. Pull it back inside to share it again.Touch The same with a finger.
  5. Override it per use. Close the use and select it: the exposed number is an ordinary dimension line, on this use alone. It can be dragged, and bound to a driver with a band. Bindings belong to their use. Desktop Click the folded use, drag its line.Touch Tap, drag.
  6. Detach or delete. Detach turns one use back into plain ops, with its numbers as they are, and leaves the others linked. Desktop Hold the use: the ring's detach use. Delete removes the selected use.Touch Hold; three-finger tap removes.
  7. Keep it on the shelf. A subgraph lives in its formula. To carry one to another formula, save it to the shelf, in this browser, and place it there. Placing copies it in, with its numbers, and keeps no link. The shelf holds eight, newest first. An entry can't be removed, and a ninth pushes out the oldest. Desktop Hold a use, pick save to shelf. In the other formula, hold an edge and pick from shelf.Touch The same.
  8. Do the same in shading and drivers. The same link works on nodes. A use's last node is its output. Opening any use opens the first, and the frame's empty ground takes new members. A folded use has no input dots, so wire its links from outside with it open. A placed use starts free, reading what the first reads, with its output unconnected. From the shelf, a shading or driver subgraph loses its links from outside. Desktop Shift-click nodes, click the bracket's plus, double-click to open. Hold empty frame for another use.Touch Hold a node, tap another with a second finger, tap the plus, double tap to open.

6. Colour and Motion

Colour and motion are networks in the same graph, fed by the orbit's readings: shading nodes for colour, drivers for parameters that vary across space, along the orbit or in time.

6.1 Shading Nodes

Beside the formula's graph sits its shading frame. The orbit's readings flow out of the repeat zone into it: the fold index, the orbit trap, the depth, the Lyapunov exponent, facing, the leading species, the w axis. A colour ramp turns a number into a colour; maths nodes combine numbers (add, multiply, power, sine, bands for terraces); colour mixes combine colours; two outputs take the surface colour and the glow. The ramp has up to sixteen stops, five interpolations, three colour spaces (RGB, HSV, Oklab [29]), an input map (scale, offset, clamp, repeat, mirror, log, invert) and presets: oil, malachite, bone, prism, strata, beetle and abyss, each with the reading it suits (the orbit trap, or facing for the thin films). A new ramp starts as the colour already there, and its presets open beside it, one tap away. Colours are picked on a hue ring around a held stop: angle is hue, distance is saturation. The network is stored in the formula, so the URL, the lineage, breeding and every export reproduce the colour exactly.

DesktopTouch
Start shadingthe plus in the empty frame: the look stays as it wastap it
Linkdrag from an output dot to an input dotthe same
Add a nodehold a link or an input: a ring of the types that fit; hold empty frame: a free nodehold
Ramp presetsa new ramp opens them beside it: click a gradient, or anywhere else to shut them, or Esc; later, hold the ramp, point and releasetap a gradient; hold the ramp
Edit a rampclick it: the bar (click adds a stop), the stops (drag moves), scale, offset and hue turn as lines, and toggles for interpolation, colour space, mapping mode, log and inverttap
Math or mixclick it: its op glyph (click cycles) and its constant as a linetap
RemoveDelete: the selected stop, or the node (its input takes its place)three-finger tap
Pick a colourhold a stop: the hue ring; wheel = lightness, Shift-wheel = alphahold a stop; a second finger sets lightness and alpha
A Mandelbulb painted by its orbit trap: the trap goes through a bands node (terraces) into the ice ramp, and the ramp into the surface colour. Click the ramp to open its editor; hold it for the presets.
The mathematics

The shading network is a typed dataflow in topological order, packed after the op records and run per hit by a small register machine (one vec4 register per node). The ramp's hue turn rotates the Oklab a, b plane after interpolation, so lightness stays put. Push splats run the same program with the readings a sample has. The GPU and the CPU evaluator agree to a median channel error of 10−7.

6.2 Drivers

A driver makes a parameter a function instead of a number. Four kinds drive: orbit readings, read every iteration (the iteration count, the radius, the trap, the running stretch, the point's coordinates), which change the dynamics; world fields read where the orbit starts (axis, sphere, noise, tissue, the start point), which vary the shape across space; time, which animates it; and other parameters, which link one op's value to another's. Maths and remap nodes sit between. A bound parameter shows its range as a band on its dimension line, with a live tick at the value the centre's orbit gives it.

A driven shape is no longer guaranteed to have a safe distance estimate, so the engine measures how steep the drivers make it and shortens the march's steps by that factor, only for driven formulas.

DesktopTouch
Add a driverhold the empty lane (inside the repeat zone) or the row above ithold
Binddrag a driver's output dot onto a selected op's dimension linethe same
Set the banddrag its ends (low, high) or its middlethe same
Read another parameterpull an op's line off itself into the lanethe same
A driver's own numbersclick it: its switches (wave, tissue's cell or wall, maths op, clamp) as glyphs, its numbers as lines below the zonetap
Insert betweenhold an input dot, a driver link or a binding's hairline: the ring, inserted therehold
Unbind, removeclick the band or the driver, Deletethree-finger tap
A bulb whose power follows the iteration, rising from 3 toward 9 over the ten iterations: a schedule of ten different bulbs, written as one driver. Click the bulb node to see its power line become a band.
The mathematics

A binding sets θ = lo + v(hi − lo), with v the driver's value. Drivers whose sources are world, time or parameters are hoisted out of the loop and computed once per pixel; orbit readings run every iteration. The step factor is measured, not bounded: at every sensed hit L = |∇d| / |∇d with the drivers held|, and the march divides its steps by the 90th percentile of L, capped at 16. In the duals a driver enters the Jacobian as ∂F/∂θ · ∇θ, the same form as a chimera's field.

6.3 Drivers into Colour

The drivers are visible to the shading frame. Any driver can feed a ramp, a maths node or a mix, so one noise can bend the shape and paint it in step. Everything in colour can be bound with bands as formula parameters are: the ramp's scale, offset and hue turn, a stop's position, a maths constant, a mix's amount, and the glow's gain. A clock on the hue turns the whole ramp around the hue ring.

DesktopTouch
Drive a colour inputdrag a driver's dot (the second bus) onto a shading inputthe same
Bind a colour numberdrag it onto a shading line or a stop tickthe same
The glow's gainclick the glow outputtap
One noise does two things: it moves the Mandelbox's scale between 2.4 and 2.6, and it is the input of the fire ramp, so the colour follows the shape it bent. A slow clock turns the ramp's hue. Both lanes are open: the drivers in the row above the repeat zone, the noise's link running down the drivers' bus into the ramp, the bindings as dashed hairlines.

6.4 The Kaliset

Kali's map is a shader artist's favourite: fold by absolute value, divide by the squared length, subtract a constant, and a few iterations give dense, glittering detail [30]. The forums used it for colour and bump on other fractals. Here it is the kali node: a number computed from the point the ray hit, so any species can take it, and it feeds a ramp, a maths node or a mix like any reading. It does not change the shape.

DesktopTouch
Add ithold a link or an input in the shading frame: kali is in the ringhold
Its constant, frequencyclick the node: four dimension lines (cx, cy, cz, f)tap, drag a line
The arrival hall with the kaliset through the oil ramp in place of the fold index: the geometry is unchanged, the detail on it is new. Its iteration count and its mean-or-minimum mode are in the formula's text only for now, and a driver cannot reach it yet.
The mathematics

p ← |p| / (p·p) − c,   from p0 = f x,

with x the hit point and n iterations. The output is the mean change of |p| from one iteration to the next, or in the other mode the least |p|.

7. Collage

A collage leaves every piece's dynamics alone and decides only where one finished surface meets the next, and what the seam looks like.

7.1 Joins

Pieces are whole formulas, up to eight, each with its own iterations, chimeras, drivers and colour. Their distance estimates are joined by smooth minima [31]: a smooth union, and the same kernels turned around for intersection and subtraction; terraced and bevelled seams, the stairs and chamfer of hg_sdf [32]; and a morph, where a field decides which piece is there. The seam width is a parameter like any other, so drivers can vary it across space. A fractal's estimate has no inside, so a cutter is given a grow: its surface pushed out by a margin, which is what a subtraction carves with.

DesktopTouch
Start a collagedrag a lineage dot onto the field, hold a Metasurface site, or carry a ring neighbour outthe collage glyph: tap a site to add it
The collage's graphGthe collage glyph
Change the joinhold the join node: ops and kernels, each drawn as its own contourhold
Seam widthdrag the dimension line under the joindrag
Add a piecethe plus left of the piecesthe plus
A Mandelbulb and a shrunken Mandelbox joined by stairs: the seam steps down in four terraces. The collage's graph is open: the two pieces side by side, the join's glyph is the join itself, and the line under it is the seam width at its true size on screen.
The mathematics

The default kernel is the quadratic smooth minimum

h = clamp(½ + ½ (b − a)/r),   d = a h + b(1 − h) − r h(1 − h),

with the cubic, exponential, circular, stairs and chamfer forms beside it. Intersection is −union(−a, −b), subtraction a ∖ b = −union(−a, b). Every union kernel's partials are non-negative and sum to one, so the join stays 1-Lipschitz when its pieces are; the chamfer's bevel is √2, and the march's step covers it. The partials also give each piece its share at a point: the readings piece and seam for the collage's own colour.

7.2 Placement and Repetition

Each piece has a rigid placement and a uniform scale, which keep its estimate exact, and may repeat: a grid with counts, a mirror, or a polar array. The repetition is measured in the piece's own units, before its size: a polar radius of 4 on a piece of size 0.25 is a ring of radius 1. Click a surface and the piece that leads there is picked; its affine frame appears in hairlines. Drag an axis to move along it, the ring to turn, the corner to scale, the centre dot to move it freely in the screen's plane. A tap on the centre dot switches the axes between the piece's own and the world's; the world frame is drawn a little dimmer. With a piece picked, its repetition cells are drawn too, the original's solid and the copies' dashed.

DesktopTouch
Pick a piececlick its surfacetap
Move, turn, scaledrag an axis, the ring, the corner; the centre dot moves freelythe same, larger hit areas
Local or world axesclick the centre dottap it
SnapShiftrest a second finger
Repetitionhold the piece in the collage graph: none, grid, mirror, polarhold
Remove a pieceDeletethree-finger tap in the collage graph
Six Mandelbulbs in a polar array around a small Mandelbox, joined by a smooth union. Click a bulb to pick its piece and see the six sectors of its repetition.
The mathematics

A world point reaches piece i as rep(R−1(x − t)/s), the repetition folding it into the nearest copy in the piece's own frame, so the array moves, turns and scales with the piece. Its distance is di = s · DEi(that point) − g, and the joins fold left to right: D0 = d0, Dj = joinj(Dj−1, dj). In push, each piece walks its own attractor and a sample is kept with the weight of its piece's share there, so a sample carved away by a subtraction vanishes.

7.3 Workflow: A Collage, Start to Finish

Follow these in the figure below, or in the engine itself, which keeps its lineage. The figure starts on a plain Mandelbulb: there is no collage until step 1 makes one.

A plain bulb to start from. Enter it, and add the first piece.
  1. Start one. Four ways, all with the same result: the formula on screen becomes piece 1, the new formula lands on the surface under the pointer (or at the focus), about a quarter of the view across, joined by a smooth union a tenth of its size, and it is picked. Desktop (a) The collage glyph in the row: the Metasurface opens with a plus beside its crosshair; click a site. (b) M, then hold still on a site until the ring around it fills. (c) Tab, then drag a lineage dot onto the field. (d) Open the breed ring and carry a neighbour 60 px past its thumbnail, then release on the field.Touch (a) The collage glyph, then tap a site. (b) The Metasurface glyph, then hold a site until its ring fills. (c) Tap a corner mark, drag a lineage dot out. (d) Hold 1.2 s for the ring, carry a neighbour out.
  2. On the MetasurfaceTap or clickHold 0.45 s
    A site, as usualgoes there: the formula on screen (or the picked piece's) becomes the site's; nothing is addedadds it as a piece, where you pressed
    A site, plus at the crosshair (add mode)adds it as a piece, where the view looksadds it, where you pressed
    Open ground, as usualmoves the crosshairdrops your formula there as a new site
    Open ground, add modeadds the formula at that point of the Metasurface, where the view looks; a drag does toodrops your formula there as a new site
  3. Pick a piece. A quick click traces the surface and picks the piece that leads there; its frame appears. Picking again elsewhere moves the pick. With a piece picked, a tap on a Metasurface site changes that piece's formula, not the whole collage's. Desktop Click its surface; click open ground, or Esc, to unpick.Touch Tap its surface; tap open ground to unpick.
  4. Move, turn, scale. The frame's three axes are the piece's own. The ring turns about your line of sight. The corner between x and y scales. A dimension line, an arc or the size shows while you drag. Desktop Drag an axis, the ring or the corner. Shift snaps: a tenth of the frame, 15°, two figures.Touch The same, with larger hit areas. Rest a second finger to snap.
  5. Switch the axes, or drag freely. The centre dot does two things. A tap flips the axes between the piece's own and the world's, and the world frame draws dimmer so you can tell which you have. Dragging it moves the piece anywhere in the screen's plane through its origin. The choice lasts the session. Desktop Click the dot; drag it.Touch Tap the dot; drag it. Holding it past 0.4 s names the state and does not flip it.
  6. Open the collage graph. Pieces side by side, each its own small formula, a join under each neighbouring pair, the output at the bottom. Desktop G, or click the strip in the structure layer. G or Esc closes it.Touch The collage glyph, or tap the strip. Two-finger tap closes it.
  7. Change a seam. A join's glyph is the join itself, the kernel's real contour. The line under it is the seam width at its true size on screen. Desktop Hold the join: the four ops (with this kernel) and seven kernels (with this op), each drawn as itself. Drag the line for the width. Click the join for its numbers: width, steps, morph weight.Touch Hold it; drag the line; tap it.
  8. Edit one piece's own formula. Click a piece to pick it: its placement and repetition appear as dimension lines below, behind glyphs for move, turn, scale, grow and repeat. Click one of its ops: that piece's formula graph opens on that op, the ordinary editor of section 5.5. Desktop Click the piece, then its op. G or Esc comes back to the collage.Touch Tap, tap. Two-finger tap comes back.
  9. Repeat a piece. Hold a piece for the ring: none, grid, mirror, polar. The render shows every copy at once; with the piece picked, the cells are drawn on the field, the original solid and the copies dashed. Spacing is in the piece's own units (section 7.2). Desktop Hold the piece in the collage graph, point, release. Its counts and spacing are lines below.Touch Hold, point, lift.
  10. Carve with a cutter. Change a join to subtraction or intersection and the piece after it becomes a cutter. A fractal's estimate has no inside, so a cutter needs a grow to cut with: a new one gets a tenth of its size automatically. The cut surface sits that far out from the fractal's. Desktop Hold the join, pick the op; drag the picked piece's grow line.Touch The same.
  11. Give the collage its own colour and drivers. Each piece keeps its shading, blended across seams. The collage's own shading, when set, wins, and it has two more readings: piece and seam. Drivers live in a row above the pieces (start x, y, z, w, the four fields, time, maths, remap), and can bind any seam or placement number with a band. A collage's colour reads the collage's drivers only, never a piece's. Desktop Click the output for the shading frame. Hold the row for the ring of drivers. Drag a driver's dot onto a line or a seam line to bind it. Delete removes the selected driver or band.Touch Tap the output. Hold the row. Drag the dot. Three-finger tap removes.
  12. Add and remove pieces. Up to eight. The plus left of the pieces opens the Metasurface in add mode and comes back with the new piece in the graph. It is gone once the collage is full. Desktop The plus. Click a piece, Delete.Touch The plus. Tap a piece, three-finger tap.
  13. Save, breed, restore. A collage is a document like a formula: the URL, the lineage, stills and splat files carry it, and every edit above is one lineage node. The breed ring works on it: neighbours move placements, joins and each piece's numbers. Two collages walk into each other when they have the same pieces and joins; otherwise the change is a cut. Desktop ⌘Z and ⇧⌘Z; ⌘S; drop the still back on the engine; hold still 1.2 s for the ring.Touch Two- and three-finger taps; the frame glyph; hold 1.2 s.

Refused along the way: a collage dropped onto a collage, a ninth piece, the lens, and the loop (P skips it). A push of a collage walks each piece's attractor and keeps samples by their share of the join.

8. Keeping It: Exports and State

What is on screen leaves as a 4K still, a video, a cloud of Gaussian splats or a mesh, and every file carries the formula that made it.

The still is 3840 pixels on the long side at 64 samples, rendered by the JIT in 512-pixel tiles that are each exactly their window of the full frame, so the seams do not show. The video walks the lineage from its root to here at constant visual speed, one PNG per frame. The splats are push samples captured with their covariance and written as a 3D Gaussian splatting file [33]. The mesh samples the distance estimate on a 128³ grid around the focus and extracts the surface with surface nets [34], as a binary STL.

Stills and splat files hold the whole state (formula or collage, camera, mode, look, focus and pins): drop one back onto the engine and it opens where it was made. A mesh does not, and neither does the video. The URL holds the formula, camera and mode, so a link is a scene, without the look. The live view pauses while an export runs, and a hairline at the bottom of the structure layer fills. A video's PNG sequence goes to a folder you pick, or to a streamed ZIP where the browser has no folder access.

DesktopTouch
4K still⌘S, or the frame glyphthe frame glyph in the structure layer
Video, splats, meshthe film, dots and cube glyphs, bottom right of the structure layerthe same
Open a statedrop a still or a .ply onto the enginenot yet (section 11.3)
The structure layer: the exports are the four glyphs at the bottom right. A 4K still takes a while (45 s on the arrival view); the live view pauses and a hairline fills while it renders.

9. Touch and the Overlay Toggles

Desktop decides what happens; touch adapts the gesture and the layout, never the behaviour, and adds no buttons.

A phone has no keyboard, no Shift, no ⌥, no wheel and no hover. The engine answers with one rule: a second finger is the modifier, everywhere. Resting, it is Shift (the lens opens, the gizmo snaps); a quick tap is one notch of the wheel (the next op, the next knob pair, farther neighbours); a double tap pins. A touch grab aims at the crosshair in the middle of the screen, so nothing hides under the thumb. Three fingers move the 4-D slice. Two- and three-finger taps walk the lineage back and forward.

The menu mark at the top right unfolds a row of hairline glyphs, the same set on every device: the graph, shading, drivers, Metasurface, collage, structure, Lyapunov and the mode, and last a page glyph that opens this paper in a new tab. A glyph is dim while off and bright while on; every key keeps working, the row only shows them.

The mark takes three presses. The first unfolds the row. A second, while the row is out, folds it and opens the site's own menu, whose docs item opens this paper in a new tab. A third closes the menu. In these figures the mark only folds the row. The mode glyph shows the mode and cycles it: pull, push, loop. Inside the graph, the shading and drivers glyphs fold that part away so the network takes the room, and bring it back; with the graph closed they open it. In a collage the shading glyph opens the collage's own shading and the drivers glyph its graph. The collage glyph opens that graph too, and before there is a collage it opens the Metasurface to add the first piece. One drawing at a time: opening one closes the others. Replay and drift have no glyph here; they sit in the structure layer's key row, with Lyapunov and the Metasurface, on a touch screen.

DesktopTouch
The row of togglesthe menu mark, top rightthe menu mark
ModeP, double clickdouble tap
Back, forward⌘Z, ⇧⌘Ztwo-finger tap, three-finger tap
Shift, the wheel, Fa second finger: resting, a tap, a double tap
The 4-D slice⌥ + wheel, ⌥ + dragthree fingers: pinch, drag
The engine as it arrives. Press the three hairlines at the top right: the row of toggles unfolds, and folds again after a choice or four seconds.

Names on demand. The drawings have no words, so every control can say its name when asked. Rest the mouse still on a node, a port, a line, a ring item or a toggle for less than half a second, or hold a finger still on it, and its name appears in small text beside it: an op by its notation (fold.box), anything else in one to three words (colour ramp, smooth union · quad, orbit trap). On a desktop the key follows where there is one. The label only reads: a hold still does what it always did (the thumbnail, the ring of choices, the grab), and a second finger or any move takes the name away. These are the names this paper uses.

DesktopTouch
A control's namerest the pointer on it (0.4 s)hold a finger still on it (0.4 s); the name sits above the finger
The tissue's graph, open. Enter and rest on any node, the count or a field's glyph (or hold a finger on it): its name appears beside it.

Not yet on touch. One thing a desktop does has no finger: opening a saved still or splat file, which a desktop drops on the engine.

10. Examples: As Published, and One Step Further

Seven fractals people know, each drawn as it was published and then taken one step further with a tool from the chapters above. Left, the original; right, the step.

The sources are the forums and programs where 3-D fractals grew up: Fractal Forums, where the Mandelbulb, the Mandelbox and the kaleidoscopic folds were posted and argued over; Fragmentarium and Mandelbulber, whose open source code holds the formulas exactly [35] [36]; and the artists who made them a medium. Each pair starts from that formula as published.

10.1 The Mandelbulb

Daniel White and Paul Nylander's power-8 bulb of 2009: in spherical coordinates, raise the radius to the eighth power and multiply both angles by eight, then add the starting point [18]. The engine's bulb 8 · +c ×10 is that formula with its derivative carried alongside (section 3). The step: a tissue in which every cell of space is a bulb of its own power, 8 or 5, with soft walls between them (section 5.3). The classic hybrids alternated whole formulas from one iteration to the next; here the species are laid out in space.

The power-8 Mandelbulb, as published.
A tissue of bulbs of power 8 and 5: each cell its own species.

10.2 The Mandelbox at −1.5

Tom Lowe's Mandelbox, posted as the "amazing fractal" in February 2010: fold into a box, fold through a sphere, scale, add the starting point [1]. At scale −1.5 the faces turn into castles. The step is a collage (section 7): six small −1.5 boxes in a polar ring around a seventh, joined by smooth unions, a cathedral ring no single formula draws.

The Mandelbox at scale −1.5.
Seven of them as one collage: a polar ring of six around a seventh, smooth seams.

10.3 The Kaleidoscopic Folds

Knighty's kaleidoscopic iterated function systems of 2010: fold space across mirror planes, then stretch it about a corner [37]. The Menger sponge is abs, sort, scale 3; the Sierpiński tetrahedron three plane folds and scale 2. The step: a chimera that runs both inside every iteration and averages the point (section 5.2), a species between the sponge and the tetrahedron.

The Menger sponge as a kaleidoscopic fold.
Menger and Sierpiński blended half and half inside every iteration.

10.4 The Quaternion Julia Set

Alan Norton drew Julia sets of the quaternions in 1982; Hart, Sandin and Kauffman ray traced them with a distance estimate in 1989 [20] [5]. A three-dimensional slice of a four-dimensional set: q → q² + c. The step: drivers (section 6.2) put the constant c on a slow clock, so the slice drifts through the family of quaternion Julia sets on its own.

A quaternion Julia set, c fixed.
The same with c on a clock: the set changes shape as you watch.

10.5 Amazing Surf

A Mandelbox variant from the Mandelbulber library (credited there to Kali): the box fold on two axes only, so the shape runs out into sheets and terraced "lands" [36]. It is still one of the most used formulas in Mandelbulber galleries, usually with depth of field [38]. The step: painted in one hue in terraces of the orbit trap (section 6.1), with the rotation inside its iteration on a slow clock (section 6.2), so the lands turn as you watch.

Amazing Surf, as the Mandelbulber library has it.
Terraces of one hue, the inner rotation on a clock.

10.6 A Cave in the Manner of Fractal Nature

Julius Horsthuis's films (Foreign Nature, Recombination) made fractals into places: enveloping halls with natural light, rendered in Mandelbulb3D [39]. The engine arrives in such a hall. Painted in one hue, in terraces, with the camera's depth of field, it is the left figure. The step: the same hall with its scale changing through space, a noise driver moving it between 2.35 and 2.65 (section 6.2), so the architecture shifts as you fly through it. Enter and fly (the wheel, or a pinch). A tissue of two Mandelboxes, the obvious step, measured over half a second a frame here: too heavy for a page.

The arrival hall, one hue, terraced.
The hall with its scale driven by noise through space.

10.7 A Fractal as Gaussian Splats

3D Gaussian splatting represents a scene as millions of small coloured ellipsoids [33], and it is usually fitted to photographs. The engine makes them from the formula: push walks a Julia-type bulb backwards and every sample becomes an ellipsoid shaped by its walk (section 2.2), and the structure layer's dots glyph writes them as a file any splat viewer opens. Left, the bulb as a surface; right, the same set as splats.

A Julia-type Mandelbulb (c fixed), as a surface.
The same set as Gaussian splats, ready to export.

11. Planned

What the engine does not do yet, in the same form as the chapters above. Nothing here runs: each section is a place held for a tool that is coming.

Two things are by design, not missing: a collage has no loop, since it has no one map to feed back through; and the real-iPhone checks (three-finger gestures, the corner marks against rounded screens) wait for a first session on the device. The design document beside the engine, fractal-engine/DESIGN.md, records every stretch, its decisions, what was measured and what was left.

11.1 New Capability

planned

Orbit Density as a Medium

A finite density inside the fractal: where orbits spend their time, drawn as a volume the camera looks through, so a surface can sit inside its own nebula.

DesktopTouch
figure to come
The mathematics

The volume integral of Radiance Fields, with σ the orbit histogram: C = ∫ T(t) σ(r(t)) c(r(t)) dt.

planned

More Than Four Dimensions, and a Full-Frame Tilt

The orbit in ℝᴺ, up to eight, as a change of representation through every layer. The slice will be stored as a whole frame: three plane angles cannot reach every 3-plane of ℝ⁴.

DesktopTouch
figure to come
The mathematics

xN = O + E·x3,   E an orthonormal N × 3 frame.

planned

Structural Mutations

Neighbours in the breed ring that add, remove or swap an op, where today they only move numbers, so that breeding can leave a structure.

DesktopTouch
figure to come
planned

View-Dependent Emission

Colour that changes with the direction you look from, on surfaces and on exported splats (higher-order spherical harmonics), where today every point sends one colour.

DesktopTouch
figure to come
The mathematics

c(x, d) = Σl ≤ L Σ|m| ≤ l klm(x) Ylm(d),   (L + 1)² numbers per channel.

planned

Drawn Fields and Tissue of Tissues

A field painted by hand on the view, sites placed by hand, and a tissue whose cells are tissues themselves.

DesktopTouch
figure to come
planned

A Collage Dropped onto a Collage

Today the drop is refused, since collages do not nest. The incoming collage's pieces will join the one on screen, re-placed where they land.

DesktopTouch
figure to come
planned

A Sun-and-Fog Look

A look for open landscapes: a low sun, height fog and a film grade. The lamp carried beside the camera suits caves; it does not make a sky.

DesktopTouch
figure to come

11.2 Speed

planned

A GPU Sensing Pass for Collages

Dual numbers through the joins: an exact normal and the metric of every number at once, replacing today's CPU pass.

DesktopTouch
figure to come
planned

Skipping Far Collage Pieces

Bounding volumes, so a piece out of reach costs nothing. The join must then give exactly the near piece's value, kernel by kernel, and the exponential kernel never quite does.

DesktopTouch
figure to come
planned

A Step Factor per Tile

The measured step factor per screen tile rather than one for the frame, so a steep corner of a driven scene does not slow the rest.

DesktopTouch
figure to come
not decided

Over-Relaxed Stepping, Far-Iteration LOD, Temporal Reuse

Three ways to draw faster, each of which changes the image: the glow is summed per march step, so fewer steps change the glow. Not decided: they wait for before-and-after images.

DesktopTouch
figure to come
The mathematics

Over-relaxed sphere tracing steps ω·d, 1 ≤ ω < 2, and steps back when two successive unbounding spheres stop overlapping (Keinert et al., 2014).

11.3 Finishing Touches

planned

The Lens, Further

The lens on driver and shading parameters and on collages, and a map that follows an edit made inside it. Today it is computed once, on op parameters of a formula.

DesktopTouch
figure to come
planned

Shading Lines

A bound shading line's live range, as an op's line shows the orbit's, and param nodes that read shading parameters.

DesktopTouch
figure to come
planned

Clock Controls

Pause and scrub for anything driven by time, and the clock in thumbnails, which read it as zero today.

DesktopTouch
figure to come
planned

Push, Caught Up

The Lyapunov channel and the metric in push, editing in push (a grab needs a surface to sense), and the piece and seam readings on splats.

DesktopTouch
figure to come
planned

The Neighbour Across a Cell Wall

A repetition reads the nearest copy only, so a piece wider than its cell is overstepped at the wall. The neighbouring copy will be read as well.

DesktopTouch
figure to come
planned

Moving Pictures and Mesh Regions

MP4 and WebM straight from the engine, where video is a PNG sequence today, and a mesh of any chosen region, where today it is the cube around the focus.

DesktopTouch
figure to come
planned

Opening a File on Touch

A way to open a saved still or splat file on a phone, where nothing can be dropped on the page.

DesktopTouch
figure to come
planned

Small Readouts

A hairline cue while the drivers' shader variant compiles, and a readout of w while the slice moves.

DesktopTouch
figure to come

11.4 Further Out

planned

Deep Zoom

Perturbation and bilinear approximation, for 2-D formulas only, opt-in.

DesktopTouch
figure to come
planned

A Sparse 3-D Loop

The feedback loop in a sparse volume, where today a 3-D formula shows only the shadow of its dynamics on a plane.

DesktopTouch
figure to come
planned

A WebGL2 Fallback

The engine for browsers without WebGPU.

DesktopTouch
figure to come
planned

Recorded Paths

A path through parameter space recorded by hand and replayed at constant visual speed, beyond today's replay of the lineage.

DesktopTouch
figure to come
planned

Physical Controllers

MIDI and hardware knobs mapped to the two gesture tiers: big slow gestures for structure, small ones for tone.

DesktopTouch
figure to come
planned

A Growth Engine

A fourth way to draw, hooking the silviculture modules of paper 0 to the formula.

DesktopTouch
figure to come
planned

Soft Walls Around Chimera Sites

On the Metasurface a chimera's cell is a hard cut unless it is a constant blend. One more level of mix nesting will let it blend softly through a field.

DesktopTouch
figure to come

Reference: Every Key and Gesture

One page to keep open beside the engine. An empty cell means that side has no gesture for it.

The field

DesktopTouch
Lookdragone finger
Move along the viewwheel; W S or ↑ ↓pinch
SlideA D or ← →; Q E down, uptwo-finger pan
Fasterhold Shift
Mode: pull, push, loopP, double clickdouble tap, or the mode glyph
Drift on, offSpacedrift glyph (structure layer)
LyapunovLLyapunov glyph
Structure layerTabtap a corner mark
Docsthe page glyph; the site menuthe same

Grab, lens, pins

DesktopTouch
Grabhold still 280 mshold anywhere: aims at the centre
Editdrag sidewaysdrag
Next opwheeltap a second finger
UndoEsctwo-finger tap afterwards
Pin, unpinFdouble tap a second finger
Lenshold Shift; move to travelrest a second finger

The loop

DesktopTouch
Zoom, pan, rollwheel, drag, Shift-dragpinch, pan, twist
Knobshold, drag across and uphold, drag
Next knob pairwheeltap a second finger

Lineage and the ring

DesktopTouch
Back, forward⌘Z, ⇧⌘Z (ctrl elsewhere)two-finger tap, three-finger tap
Return to a nodeclick its dottap its dot
A node as a piecedrag its dot onto the fieldthe same
ReplayR; any input stops itreplay glyph
Ringhold still 1.2 shold 1.2 s
Chooserelease on a neighbourlift on one
Farther, nearerwheelpinch; a second finger taps farther
Stayrelease at the centre, Esclift at the centre
Neighbour as a piececarry it 60 px past its thumbnailthe same

The fourth dimension

DesktopTouch
Along w⌥ + wheelthree-finger pinch
Tilt⌥ + dragthree-finger drag

The graph

DesktopTouch
Open, foldG, click the stripgraph glyph, tap the strip; pinch closed
Field without an ophover the nodepress it
Select, editclick, drag its linestap, drag
Insert, forkhold an edgehold
Add species, change fieldhold the fieldhold
Movedrag a node onto an edgethe same
DeleteDelete or ⌫fling off, three-finger tap
Iterationsdrag the countthe same
Scheduleclick a letter, A–H, Delete; the plusdrag a letter; the plus
New chainthe plus beside the last chainthe same
Back outEsc, step by steptwo-finger tap
A control's namerest on it 0.4 shold still on it 0.4 s

Subgraphs

DesktopTouch
Choose a runShift-clickhold, tap with a second finger
Wrapthe bracket's plusthe same
Open, closedouble click, Escdouble tap, two-finger tap
Another usethe edge's ring, Shift-drag a usethe ring; hold a use, second finger rests, drag
Expose, sharepull a line onto the frame, back insidethe same
Detach, shelfhold a usehold

Shading and drivers

DesktopTouch
Startthe plus in the framethe same
Linkdrag dot to dotthe same
Addhold a link, an input, empty frame or lanehold
Binddrag a driver's dot onto a line or a stopthe same
Banddrag its ends or its middlethe same
Read a parameterpull an op's line into the lanethe same
Presetsa gradient beside a new ramp; hold a ramptap a gradient; hold
Stopclick the bar adds; drag; Deletetap, drag, three-finger tap
Colourhold a stop: angle, distance; wheel lightness, Shift-wheel alphahold; a second finger sets lightness and alpha
Glow's gainclick the glow outputtap

The Metasurface

DesktopTouch
Open, closeM, Escglyph; two-finger tap
Crosshairdrag, clickdrag, tap
WalkShift-dragone finger rests, another draws
Lay in space⌥-dragtwo rest, a third draws
Go to a siteclick ittap
Add as a piecehold it 0.45 shold
Drop your formulahold open ground 0.45 shold
Move, remove a sitedrag; off the squarethe same
Families homedouble-click a cornerpress a corner twice

Collage

DesktopTouch
Pick, unpickclick, Esctap
Move, turn, scaleaxis, ring, cornerthe same
SnapShiftrest a second finger
Local, worldclick the centre dottap it
Free movedrag the centre dotthe same
GraphGcollage glyph
Add a piecethe graph's plus; collage glyphthe same
Join's kindhold ithold
Seam widthdrag its linethe same
Repetitionhold a piecehold
Piece's formulaclick it, click an optap, tap
Collage's shadingclick the outputtap
RemoveDeletethree-finger tap

The row and exports

DesktopTouch
The rowpress the markthe same
Site menupress the mark againthe same
Close ita third pressthe same
4K still⌘S, frame glyphframe glyph
Video, splats, meshglyphs, bottom right of the structure layerthe same
Open a statedrop a file on the enginenot yet

What the Engine Refuses, and Its Limits

  • Formulas. Eight op lists (slots) and 64 ops, counting every use of a subgraph. A chimera holds two to seven species, with no chimera inside a chimera.
  • Grab. Pull only: push has no surface to sense, and in the loop a hold takes the knobs. Moves that would enter the surface are refused.
  • Lens. Op parameters of a formula. Not rotation angles or plane normals, not driver or shading parameters, not collages. Its map is computed when it opens and does not follow an edit made inside it. On a shared subgraph number, the preview moves the first use.
  • Breeding. Parameters only, never structure. The archive restarts after a flight, because its features depend on the view.
  • Drivers. 32 nodes and 16 bindings; four rebuilt ops, eight such bindings. Four driven ramp stops. kali can't be driven. A driven formula's shader variant takes a few seconds to compile the first time, and it draws with its own values until then.
  • Collages. Eight pieces. No collage inside a collage. No loop and no lens. A repetition reads the nearest copy only, so a piece wider than its cell is overstepped at the wall.
  • Subgraphs. None inside another, none in a species if it holds a chimera, no link across collage pieces, no ramp stops exposed. Eight on the shelf, none removable, and a ninth pushes out the oldest.
  • The Metasurface. 29 sites, 16 of them the families. At most four species blend across a wall. A chimera's wall is a cut unless it is a constant blend.
  • Stored here only. The lineage, your sites and the shelf live in this browser. A link carries the formula, camera and mode; a still or a splat file also carries the look, focus and pins.
  • The figures in this paper. Store nothing, and their mark only folds the row.

References

  1. Lowe, T. (Tglad). The Mandelbox ("amazing fractal"). fractalforums.com, 2010.
  2. Mandelbrot, B. B. Fractal aspects of the iteration of z ↦ λz(1 − z) for complex λ and z. Annals of the New York Academy of Sciences 357 (1980) 249–259.
  3. Draves, S., Reckase, E. The fractal flame algorithm. 2003 (revised 2008). flam3.com
  4. Hart, J. C. Sphere tracing: a geometric method for the antialiased ray tracing of implicit surfaces. The Visual Computer 12(10) (1996) 527–545.
  5. Hart, J. C., Sandin, D. J., Kauffman, L. H. Ray tracing deterministic 3-D fractals. Computer Graphics (SIGGRAPH '89) 23(3) (1989) 289–296.
  6. Hvidtfeldt, M. Distance estimated 3D fractals (a series in eight parts). Syntopia, 2011. blog.hvidtfeldts.net
  7. Barnsley, M. F., Demko, S. Iterated function systems and the global construction of fractals. Proceedings of the Royal Society of London A 399 (1985) 243–275.
  8. Potmesil, M., Chakravarty, I. A lens and aperture camera model for synthetic image generation. Computer Graphics (SIGGRAPH '81) 15(3) (1981) 297–305.
  9. Crutchfield, J. P. Space-time dynamics in video feedback. Physica D 10 (1984) 229–245.
  10. Blair, D. The Light Herder, a 4K optical video-feedback instrument. thelightherder.com, 2020–2026.
  11. Douady, A., Hubbard, J. H. Étude dynamique des polynômes complexes. Publications Mathématiques d'Orsay, 1984–1985.
  12. Hutchinson, J. E. Fractals and self similarity. Indiana University Mathematics Journal 30(5) (1981) 713–747.
  13. Wengert, R. E. A simple automatic derivative evaluation program. Communications of the ACM 7(8) (1964) 463–464.
  14. Wolf, A., Swift, J. B., Swinney, H. L., Vastano, J. A. Determining Lyapunov exponents from a time series. Physica D 16 (1985) 285–317.
  15. Mouret, J.-B., Clune, J. Illuminating search spaces by mapping elites. 2015. arXiv:1504.04909
  16. Sims, K. Artificial evolution for computer graphics. Computer Graphics (SIGGRAPH '91) 25(4) (1991) 319–328.
  17. Marks, J. et al. Design galleries: a general approach to setting parameters for computer graphics and animation. SIGGRAPH '97 (1997) 389–400.
  18. White, D. The unravelling of the real 3D Mandelbulb. skytopia.com, 2009.
  19. Uhlenbeck, G. E., Ornstein, L. S. On the theory of the Brownian motion. Physical Review 36 (1930) 823–841.
  20. Norton, A. Generation and display of geometric fractals in 3-D. Computer Graphics (SIGGRAPH '82) 16(3) (1982) 61–67.
  21. Perlin, K. An image synthesizer. Computer Graphics (SIGGRAPH '85) 19(3) (1985) 287–296.
  22. Worley, S. A cellular texture basis function. SIGGRAPH '96 (1996) 291–294.
  23. Sibson, R. A brief description of natural neighbour interpolation. In Barnett, V. (ed.), Interpreting Multivariate Data, Wiley, 1981, 21–36.
  24. Theli-at, Kleinian drops (2011); knighty's recast as a hybrid, as told at imaginary.org/node/2364; Fragmentarium, Knighty Collection/PseudoKleinian.frag.
  25. Quilez, I. Apollonian. Shadertoy, 2013. shadertoy.com/view/4ds3zn
  26. Leys, J. An escape time algorithm for Kleinian group limit sets. Fractal Forums, 27 October 2016. fractalforums.com
  27. DarkBeam, knighty. 'New' fractal type: Mandalay. Fractal Forums, 2011–12. fractalforums.com
  28. Beddard, T. Fractal Lab, 2011. creativeapplications.net
  29. Ottosson, B. A perceptual color space for image processing. 2020. bottosson.github.io
  30. Kali. The kaliset, Fractal Forums, 2011; explained in Kaliset explorer (defgsus, 2021).
  31. Quilez, I. Smooth minimum. iquilezles.org, 2013 (revised since).
  32. Mercury. hg_sdf: a GLSL library for building signed distance functions. mercury.sexy/hg_sdf, 2016.
  33. Kerbl, B., Kopanas, G., Leimkühler, T., Drettakis, G. 3D Gaussian splatting for real-time radiance field rendering. ACM Transactions on Graphics 42(4) (2023) 139.
  34. Gibson, S. F. F. Constrained elastic surface nets: generating smooth surfaces from binary segmented data. MICCAI '98, LNCS 1496 (1998) 888–898.
  35. Christensen, M. H. (Syntopia). Fragmentarium: an IDE for exploring 3D fractals and other systems on the GPU. 2011. github.com/Syntopia/Fragmentarium
  36. Marczak, K. et al. Mandelbulber 2. github.com/buddhi1980/mandelbulber2
  37. knighty. Kaleidoscopic (escape time) IFS. Fractal Forums, 1 May 2010. fractalforums.com
  38. Abalo, J. Fractal gallery (Mandelbulber 2 renders, 2020–2026). fractal.batjorge.com
  39. Horsthuis, J. Foreign Nature (2015) and Recombination (2022); interview: The beauty of fractal art, 80.lv. 80.lv

***first published 28 October 2026 · 59327b1***