Line — user manual
SOE · Line — 1D elementary cellular automata · the line before the plane
What this is
Line runs the simplest cellular automata there are: a single row of cells, each one either on or off, evolving one generation at a time. Each new generation is drawn as the next row down, so the screen fills from the top and becomes the automaton's whole history at once — a spacetime diagram, with time flowing downward.
A cell's next state depends on just three cells in the row above it: itself and its two immediate neighbours. Three cells, each on or off, make eight possible neighbourhoods. A rule is simply a choice of which of those eight neighbourhoods produce an "on" cell — eight yes/no answers, read together as a single 8-bit number from 0 to 255. That one number is the entire universe you're watching.
Quick start
- In the Rule group, click the 90 preset (or type 90 into Rule number).
- Open Run and press Seed to lay down a starting row.
- Press Run, and watch the pattern build downward.
Rule 90 from a single lit cell draws a Sierpiński triangle — structure unfolding from one pixel.
The controls
The panel is a set of collapsible groups. Each is described below with its controls named exactly as they appear.
Rule
- Rule number — the automaton itself, 0–255. Type any number to load it.
- Sweep — drag to scan through all 256 rules quickly; the fastest way to hunt for interesting behaviour.
- Presets (90 · 30 · 110 · 184 · 150 · 54) — six rules worth knowing; see Things to try.
Run
- Seed — lay down the starting generation (the top row), using the current Seed & boundary settings.
- Step — advance exactly one generation; good for watching a rule move slowly.
- Run — evolve continuously until you press it again.
- Clear — wipe the canvas back to empty.
- Speed — generations per second, from 1 (slow, to study it) to 30 (fast).
Seed & boundary
- single cell / random — start from one lit cell in the centre, or a random scatter across the row.
- Density — for a random seed, the fraction of cells that begin on (0.02 sparse → 0.9 dense).
- Seed value — the number used to generate a random seed. The same value reproduces the same "random" start every time, so a pattern you like is repeatable. (Default 112358 — the Fibonacci run, 1·1·2·3·5·8.)
- dead edges / wrap (ring) — what happens at the two ends of the line. Dead edges treats everything past the edge as permanently off. Wrap joins the two ends into a ring, so a pattern running off one side reappears on the other.
Display
- Colour — imprint (cyan), life (amber), or mono (white). Imprint is the SOE house blue.
- Cell size — pixels per cell, 1 (fine, more history fits on screen) to 8 (chunky, easier to read).
Library
- Library selector + Apply — load a saved configuration.
- Copy link — copies a URL that encodes your current setup; anyone who opens it sees exactly your rule and settings. The simplest way to share a find.
- Save recipe / Load recipe — export the current setup to a
.jsonfile, or load one back in.
Things to try
- Rule 90, single cell — the Sierpiński triangle. Pure structure from one cell.
- Rule 30 — looks random, and genuinely is used as a random-number generator. The left half stays ordered while the right dissolves into chaos: order and disorder from one rule.
- Rule 110 — the famous one. Complex enough to be Turing-complete — in principle able to compute anything. Watch the little gliders drift and collide.
- Rule 184 — traffic flow. With a random seed it sorts itself into moving and stopped "cars."
- Wrap vs dead edges — run rule 90 on a ring (wrap) and watch the triangle's edges fold back and interfere with themselves.
- Sweep, slowly — let the whole 0–255 landscape go past. Most rules are inert; a handful are alive. That contrast is the subject.
The mathematics (optional)
Each cell's next state depends only on itself and its two neighbours — three cells, eight possible neighbourhoods. Reading left, centre and right as a 3-bit number picks which bit of the rule to use:
So the rule number 0–255 is the machine, its eight bits the eight neighbourhood outcomes. Rule 90 in binary is 01011010 — neighbourhoods 110, 100, 011 and 001 turn a cell on, the rest leave it off. Eight bits, one line, and time.
Exact — this is the elementary cellular automaton in full; nothing is approximated.
Life — user manual
SOE · Life — two studios in one: Digital (Game of Life, 2D, 3D & 4D) and Organic (reaction–diffusion)
What this is
Life Field runs Conway's Game of Life and its relatives, in two dimensions, three, and four. The rules are simple and local: every cell counts its live neighbours, and a short table decides whether it lives, dies, or is born next step. From that tiny rule, gliders crawl, oscillators breathe, and whole machines assemble themselves — order that nobody placed there by hand.
The studio adds two things to the classic game. It lifts Life up through the dimensions — into 3D, where the neighbourhood and the surviving rules are very different, and into 4D, where a cell has eighty neighbours and almost nothing is charted. And it can bias the field onto a torus — confining where life is allowed to grow, so the game plays out across a curved surface instead of a flat grid. That second idea is the bridge from this studio to the Torus.
At the top of the panel a Digital ⇄ Organic switch changes what the field is. Digital is the Game of Life described below — a discrete grid of living cells. Organic swaps that grid for a continuous chemical one: a reaction–diffusion field, covered at the end of this manual. Switching pauses the idle side, so only one runs at a time.
Quick start
- In the Game of Life group, leave the dimension on 2D.
- Open Library, choose 2D · Conway and press Apply recipe.
- Back in Game of Life, press Seed, then Run.
You'll see the classic Conway soup settle into still lifes, blinkers, and the odd glider sailing off across the grid.
The controls
The panel is a stack of collapsible groups. Each control below is named exactly as it appears.
Navigating the space (3D)
When the game runs in 3D, you move around the cell field freely:
- Left-click and drag — orbit around the field.
- Right-click and drag — free-look: turn your gaze in place.
- Mouse wheel — fly in and out.
- Touch — one finger orbits; two fingers free-look, and pinch to fly.
The fourth dimension
Press 4D and the grid grows an extra axis, w, at right angles to all three you can see. This is not a metaphor or a trick of the drawing: a cell now counts eighty neighbours instead of twenty-six, and the w direction feeds births and deaths exactly as up, across and through do. Nothing about it is special except that you have no way to look along it.
Which is the whole problem, and the reason for the two views:
- 3D shadow — every w layer stacked into one solid, so nothing is hidden. On its own that would be a near-solid block, which is why it comes paired with W depth colour: the shape you see is the 3D projection, and the colour tells you how far each part of it reaches along the fourth axis. Violet is shallow, red is a deep stack. This is the one view in the studio that shows you something no 3D scene can.
- w-slice — a single layer, the honest cross-section, with the w slider to move through the others. This is the view for exploring: hold still and scrub w, and the structure around you changes while nothing has moved in any direction you can point at. That is the fourth dimension, felt rather than argued.
Two things behave differently in 4D, and both come from the same fact — a hypercube grid is enormous. The lattice is coarser than 3D's for the same patience (four axes multiply, so doubling the detail costs sixteen times the work), and the density that a rule wants is lower, because eighty neighbours crowd a cell far more easily than twenty-six. Expect it to run at a walk rather than a run.
4D Life is genuinely uncharted. 2D has been mapped for fifty years and 3D for thirty; the 4D rules here were found by hand, and the space around them is almost entirely unexplored. There are things in it that nobody has seen.
Game of Life
- 2D / 3D / 4D — the dimension the game runs in. The rule space and behaviour change completely between them (see Rule & seed). Switching dimension resets the rule, density, cell size and viewpoint to ones that suit it — what keeps a 2D grid alive will wipe out a 4D one.
- Horizontal / Vertical — the framing. Horizontal fills the window; Vertical rolls the view a quarter-turn for a full-height portrait, ideal for phone-shaped video.
- Seed — lay down a fresh starting state from the current seed settings.
- Step — advance exactly one generation.
- Run — evolve continuously until pressed again.
- Clear — empty the field.
- Speed — generations per second, 1 (slow) to 30 (fast).
Rule & seed
- Birth B / Survive S — the rule, in B/S notation. A dead cell is born when
its live-neighbour count is one of the numbers in B; a live cell survives
when its count is in S. Conway is
B3 / S23. The valid range depends on the dimension: 0–8 neighbours in 2D, 0–26 in 3D, 0–80 in 4D. - soup / single cell / germ — the starting state: a random fill, one live cell, or a small solid block.
- Germ size (germ) — how large that block is, 1–5.
- Density (soup) — fraction of cells that start alive, 0.02–0.6.
- Bias γ (soup) — skews the random fill; higher values clump it.
- Seed value — the number behind the random seed. The same value reproduces the same "random" start, so a result you like is repeatable. (Default 112358 — the Fibonacci run.)
Substrate bias
This is what confines life to a shape — the torus living inside the box. - None — unbiased / Toroidal bias — run over the whole grid, or only where a torus-shaped field permits. - Major r₀ / Minor a — the geometry of that torus: the ring radius and the tube radius. - Viability floor — the field strength below which a location counts as void; raising it tightens the colony onto the torus shape.
Scale & boundary
- Cell budget — the total number of cells; a log slider, with quick presets 97k / 1M / 4M. More cells means a finer, larger grid — and more work for the machine.
- dead borders / toroidal wrap — the edges of the grid. Dead borders treats outside as permanently empty; toroidal wrap joins opposite faces so patterns leaving one side return on the other.
Display
- Colour by — age (time alive), height (position), bias (field strength), or W depth. W depth counts how many w layers stack at each point, so it reads only in the 4D shadow — it is flat everywhere else, and there is nothing to count in a single layer.
- 4D view (4D only) — 3D shadow or w-slice, with the w slider to choose the layer. See The fourth dimension above.
- Cell size — how large each cell is drawn, 0.2–1.0.
- View — full object, or board (D−1) to isolate the central layer.
- Cells as — auto, cubes, or points. Points are lightest at high cell counts.
- Frame cage — show the bounding box.
- Ghost substrate (2D/3D) — show a faint outline of the torus the bias defines.
- Auto-rotate view — slowly turn the 3D scene.
Library
- Recipe selector + Apply recipe — load a saved configuration. Stocked with 2D classics (Conway, HighLife, Maze, Day & Night, Diamoeba, Fredkin replicator), 3D rules (Life froth, crystal, Fredkin sponge), and three 4D worlds (Life froth, sparse drift, and the Fredkin hypersponge).
- Save recipe / Load recipe — export the current setup to
.json, or load one.
Things to try
- Conway gliders — 2D Conway, soup seed; spot the five-cell gliders that move diagonally forever.
- HighLife (B36/S23) — like Conway but with a self-replicating pattern; load it from the Library and watch replicators copy themselves.
- 3D Life froth — switch to 3D, load 3D · Life froth; 3D Life is far rarer and stranger than 2D, since most 3D rules either die out or explode.
- The Fredkin hypersponge — the best thing in 4D. Load 4D · Fredkin hypersponge and run it: one cell replicates itself into a four-dimensional Sierpinski fractal, and because the structure is full of holes the shadow stays open enough to see into. The colour is doing real work here — every hue is a different reach along w.
- Scrub the fourth axis — load 4D · Life froth, switch the 4D view to w-slice, and drag the w slider slowly. You are not moving, and the pattern is not evolving, yet the world keeps changing — you're sliding along a direction that isn't on screen.
- Life on a torus — keep 2D Conway, open Substrate bias, pick Toroidal bias, and turn on Ghost substrate. Now the game only lives on the donut. Adjust Major r₀ / Minor a to reshape the ring, and the Viability floor to tighten it.
The mathematics (optional)
Every cell counts its live neighbours and applies one rule: a dead cell is born if its count is in the birth set B, a live cell survives if its count is in the survival set S:
In 2D each cell has eight neighbours (the Moore neighbourhood), so counts run 0–8 and Conway's
B3/S23 sits in a narrow sweet spot between dying out and overcrowding. In 3D the neighbourhood
jumps to 26 and the counts to 0–26, where that balance is far harder to find — which is why working 3D
rules like Bays' B6/S567 are prized rarities. Pushing Life up a dimension rewrites what's possible.
The pattern behind those numbers is that a cell's neighbourhood is every cell in a small cube around it, minus itself — 3d − 1. That gives 8 in 2D, 26 in 3D, and in 4D:
Eighty neighbours is a different world. The sweet spot between extinction and overcrowding is narrower still and sits at counts nobody has a name for, so the 4D rules here were found by searching rather than inherited. If you want to know that the fourth axis is really there: seed a single live cell under a birth rule that fires on one neighbour, step once, and count what appears. Twenty-six would mean w was decoration. You get eighty.
Exact cellular automaton. Note the studio's default is a generalised rule, not Conway's B3/S23 — set B and S yourself to run classic Life.
Organic mode — reaction–diffusion
Flip the top switch to Organic and the grid becomes a continuous surface where two chemicals, A and B, spread and react. B is fed into the field, consumes A, and slowly decays; diffusion smooths the mixture while the reaction sharpens it. From that tug-of-war — Alan Turing's 1952 model of how a featureless embryo becomes a patterned animal — spots, stripes, mazes and travelling waves emerge on their own, solved live for every pixel. Drag on the field to paint reagent; right-drag to erase.
Pattern
A gallery of numerically-validated presets — Coral, Mitosis, Maze, Bubbles, Waves, Fingerprint, Holes, Chaos, Spirals, Solitons, Weave, Worms, Loops — each a different point in the feed/kill parameter space.
Chemistry
- Feed — how fast chemical B is supplied to the field.
- Kill — how fast B is removed. Feed and kill together decide which pattern forms.
- Diffusion ratio — how much faster A spreads than B; the engine of the instability.
View
- Speed — simulation steps per frame, 1–30.
- Brush size — the radius of the reagent you paint.
- Resolution — the sim grid's fineness; higher is crisper but heavier to compute.
Colour
- Scheme — Ice, Ember, Spectrum, Ink, or Custom (choose your own low/high colours).
- Background — the colour the empty field fades to.
- Colour sweep — slowly rotate the whole palette's hue over time, keeping each gradient's spread so the contrast never collapses.
Research · phase map
The governing equations, and an interactive feed–kill phase diagram — Pearson's map of the pattern space. Every preset sits on it as a landmark; drag the crosshair to teleport anywhere between them and watch the live field morph across the boundaries.
Actions
- Pause — freeze the field (you can still paint into it).
- Save — export the current frame as a PNG.
- Copy link — a shareable URL that restores this exact pattern and palette.
- Reset / Clear — re-seed, or wipe to blank.
Things to try (Organic)
- Cross a boundary — open Research and drag the phase-map crosshair slowly from Worms toward Chaos; watch the pattern reorganise as you pass between regions.
- Paint your own — Clear the field, then drag to seed reagent and watch your marks bloom.
- Shimmer — pick the Custom scheme, choose two colours, and turn on Colour sweep.
Gray–Scott reaction–diffusion, integrated on the GPU. The presets are numerically-validated points in Pearson's classification; between them, the field is yours to explore.
Crystal — user manual
SOE · Crystal — snow crystal growth from vapour · two published models, grown cell by cell
What this is
One cell of ice, sitting in still vapour. Everything after that is diffusion, freezing and attachment — and out of those three plain rules comes a snowflake, six-fold and intricate and unrepeatable. Nobody designs the branches. They are what happens when vapour cannot reach the middle of a hollow as easily as it reaches a tip.
Two real models run here, both implemented from their papers rather than approximated:
- Gravner–Griffeath (2008) — the serious one. Four phases every step: vapour diffuses, then freezes onto the crystal's boundary, then boundary mass attaches and becomes ice, then a little of it melts back. Seven dials, and they interact.
- Reiter (2005) — simpler and older. One field, three dials: a, b and c (his notation, not α/β/γ, whatever you read elsewhere). Fast, legible, and the model that first made this tractable.
Both models are restricted to planar crystals — roughly −10 °C to −20 °C. Needles and columns are outside them, so they are not offered here.
Quick start
- Open Library, take GG · fern dendrite, press Apply recipe.
- Watch. It takes about twenty seconds — growth is the point.
- Impatient? Grow to the end.
The fourth wall: it is a real object
Drag and the crystal turns. It is not a picture of a flake, it is a solid: crystal mass is plate thickness, so the studio raymarches an actual slab and the light travels through it. At true scale a snow crystal is about sixty times wider than it is thick, so tilt it far enough and it all but vanishes — and then, at one exact angle, the whole face flares white. That flash is not an effect. A flat plate is a mirror, and a mirror shows you the lamp from precisely one direction.
- Drag — turn it. There is no pole; keep going and it carries over the top.
- Right-drag or shift-drag — pan. Wheel — zoom, on a flywheel.
- Touch — one finger turns; two fingers pan and pinch together.
- Double-click or Reset view — back to overhead.
Growth
- Gravner–Griffeath / Reiter — which model. The dials below change with it.
- Run / Step / Seed — Seed lays down one cell of ice in fresh vapour.
- Grow to the end — jump straight to the stop point.
- Speed — steps per frame. A cell gathers its mass over about thirty steps, so slow speeds let you watch ice arrive rather than appear.
- Stop at step — where growth halts. These crystals never finish; they only get bigger. Where you stop is the crystal. Move it further on and press Run to carry on growing the same one.
The Gravner–Griffeath dials
- ρ vapour density — how much water is in the air to begin with. Sweeps plate → sectored plate → dendrite.
- β anisotropy — how much boundary mass a cell must gather before it freezes. The single most powerful dial: low gives ferns, high suppresses branching into a plain plate.
- κ direct freezing — how much arriving vapour turns straight to ice rather than to the quasi-liquid layer. Inhibits side branching, and not evenly.
- α / θ aftergrowth — the pair that decides whether hollows behind the tips fill in. θ is how starved a hollow must be; α is how much mass it needs anyway.
- μ melting — boundary mass returning to vapour. Promotes faceting: it drains the edge before it can attach, so the tips keep getting repaired.
- γ sublimation — ice returning to vapour. Tiny in the paper.
- σ noise and Seed — at σ = 0 the model is exactly deterministic: the same dials give the identical crystal, every time, and the seed does nothing at all. Raise σ and the six-fold symmetry breaks — as the real atmosphere breaks it — and then the seed chooses which crystal you get. Together they are the reason no two snowflakes match: not magic, just noise and a different path each time.
Reading the space
Eight coupled dials is not something to guess at, and the model's own authors note that most settings grow something dull. So the studio gives you two instruments:
- Form and fill fraction (in Readout) — ice counted against the disc it reaches. It is the one number that says what you have grown. A solid hexagon reads 0.955 and a solid disc 1.155, so the scale does not stop at 1; at or past 0.955 there is no structure left. Downward: 0.85 a plate, 0.5 sectored, 0.3 a dendrite, 0.2 a fern.
- Sweep — pick a dial, give it a range, and grow a row of crystals across it. Read the shape of the space directly instead of hunting. This is exactly the experiment the paper runs in its own figures; here it takes about two seconds. Click any result to keep it.
- Room left — how far the crystal is from meeting its own wrapped edge. At 0% what you are looking at is no longer true; grow it on a bigger lattice.
Ice & Lighting
Here is the thing worth knowing: ice has no colour. Over a crystal this thin, light is absorbed essentially not at all — blue ice needs metres, not microns. So every colour you see is a lamp, seen through the flake. That is not a shortcut; it is how snow crystals are really photographed, and why the Lighting presets are named after the setups photographers use.
- Backlight — the coloured lamp behind the crystal. This is where the colour lives.
- Key — the lamp off to one side. Elevation is the control that matters: low rakes the arms' side walls and makes them glitter, high hits the faces and gives the flash.
- Dark field — blank the light on your axis and leave it at the sides. Then the only light reaching you is light the crystal bent, and it glows out of black.
- Growth fade — draws the quasi-liquid a cell gathers before it freezes. Not a timer: at the instant of attachment that mass becomes ice with no change in total, so the crystal grows smoothly because nothing physical ever jumps.
- Render: History — every cell coloured by the step it froze. This is the crystal's own record, and it is the whole difference between a snowflake and a standing wave: a wave is a state, and changing the frequency simply erases the old figure; a crystal is a record, where every branch is a moment that happened and stayed. Look for the solid core from the plate phase, the ring where the first instability broke the symmetry, the moment each branch launched, and the tips as the newest ice. Real crystals are read exactly this way — a flake is its own flight recorder.
- Render: Mass / Vapour — drop the ice and look at the fields themselves. Vapour shows the halo the crystal has eaten out of the air around it, which is what makes tips grow faster than hollows, which is what makes a snowflake a snowflake.
- Auto-rotate — turns the crystal as it grows, tumbling on both axes so it never repeats and keeps finding the angle where a facet flares. Touch it and it stops.
Things to try
- Sweep β from 1.05 to 1.75 — seven crystals, and you will watch fern turn to dendrite turn to plate in one row. Then keep sweeping upward and watch the space go dull: that is the authors' warning, made visible.
- Watch the vapour, not the ice — switch Render to Vapour and grow a fern. The dark halo around it is depleted air. Tips reach into fresh vapour; hollows are starved. Every branch in this studio comes from that one fact.
- Find the flash — load Overhead flash, tilt slowly, and wait. Somewhere there is exactly one angle where the plate mirrors the lamp at you.
- Break the symmetry — raise σ off zero and grow a few crystals, changing only the Seed. Six-fold becomes almost-six-fold, and no two are the same. That is what the weather does. Then switch Render to History and compare them: they differ in where they have been, not merely in outline.
The mathematics (optional)
Vapour spreads by diffusion — the field evens itself out, fastest where it is most uneven:
Around a growing crystal that field is quasi-static, so the problem becomes Laplace's equation with a boundary that moves as it is solved — the crystal eats the field that determines where it grows next. That feedback is the whole story: a tip reaches into richer vapour than a hollow, so it grows faster, so it reaches further. It is called the Mullins–Sekerka instability, and it is why anything branches at all.
Why a snowflake and not a bush
Left to itself that instability makes a shapeless mess. You can see exactly what, because it has a name: diffusion-limited aggregation — Witten and Sander's 1981 model, where particles wander at random until they touch a cluster and stick. It grows a wild, tangled bush with a fractal dimension of about 1.71.
And here is the thing worth carrying away: that is not a different mechanism from this one. It is often said to be. But the probability field of those random walkers satisfies Laplace's equation, exactly as the vapour around a crystal does. Same equation, same instability, same reason tips win. DLA and a snowflake are the same physics.
The only difference is anisotropy. Diffusion-limited aggregation has none, so it branches wherever chance takes it. Ice has a hexagonal molecular lattice, and that lattice insists — six directions are favoured over every other, every branch inherits the same preference, and the wild bush is combed into a six-fold star. Everything that makes a snowflake beautiful rather than merely fractal comes from that one fact. In this studio the lattice is carried by the six neighbours and by β; in the sky it is carried by the way water molecules stack.
Gravner & Griffeath, Modeling snow crystal growth II, Physica D 237(3) 2008; Reiter, A local cellular model for snow crystal growth, Chaos, Solitons & Fractals 23(4) 2005. The library marks [paper] only on parameter sets that are both quoted from the paper and reproduce the morphology it claims for them. The paper's “simple star” is deliberately absent: at its published values it grows a blob here, and the swap that fixes it breaks another case study, so it is left out rather than fudged into place. The rest were found by sweeping and are named for what they grow.
Attractor — user manual
SOE · Attractor — strange attractors, traced in 3D · deterministic chaos made visible
What this is
Half a million particles are released into a flow. The flow is a strange attractor: a system of three coupled differential equations — Lorenz, Aizawa, Thomas and the rest — that says, for wherever a particle is right now, which way and how fast it must move next. Nothing is scripted. Every particle simply obeys the equation, step after step, and the shape you see is the shape the flow inevitably folds them onto.
Two particles that start a hair apart soon diverge completely — the "butterfly effect", sensitive dependence on initial conditions — and yet every particle, from every starting point, ends up tracing the same eternal surface. Order and unpredictability at once. That is what makes an attractor strange.
Quick start
- Pick an attractor from the grid — Lorenz is the classic butterfly. Left-drag to orbit the formed shape; scroll to zoom right into the cloud.
- Open Recipes and try "Butterfly" or "Storm" — each sets an attractor, colour and camera in one tap, with a line of verse.
- Right-drag to look around, and use Flight path to set a few camera waypoints and tour between them.
The controls
Attractor & motion
- Attractor — which system of equations drives the flow: Lorenz, Aizawa, Thomas, Halvorsen, Rössler or Dadras. Each has its own signature shape.
- Flow speed — how many integration steps run per frame; higher makes the particles race along their paths.
- Trail length — how much of each particle's recent path is kept. Every particle remembers its last few positions in 3D, so the trails form a real object you orbit around, not a smear on the screen.
- Glow and Particles — the brightness of each point, and how many particles fill the flow.
- Spin — a gentle automatic turntable, so the shape rotates on its own when you're not touching it.
Colour, recipes & flight
- Colour — Ember, Ice, Spectrum or Mono, mapped to each particle's speed: the fastest stretches of the flow burn brightest.
- Recipes — curated presets that set attractor, colour, trail and camera at once, each with a line of verse.
- Flight path — Add waypoints to capture camera angles, choose a Duration and Easing, then Preview flight to glide through them. Loop makes a hands-off ambient tour.
- Copy link — copies a URL that reopens the exact attractor, settings and camera you're looking at.
What's real, and what isn't
The mathematics is exact: the particles are advanced with a fourth-order Runge–Kutta step taken straight from each attractor's published equations, entirely on the GPU. The shapes are therefore faithful — this really is the Lorenz attractor, not an artist's impression of one. What's chosen for the eye is the presentation: the framing and colour of each attractor are tuned so it lands well-composed, the speeds are scaled for a pleasing pace rather than physical time, and the spatial units are arbitrary. It's an honest portrait of the mathematics, dressed for looking at.
Torus — user manual
SOE · Torus — one toroidal form under four laws of physics: field, vibration, flow, and gravity
What this is
The Torus takes one shape — the doughnut that recurs everywhere from atoms to galaxies — and runs it under four different laws of physics, which you switch between with the Model selector. The same form becomes a vibrating shell, a magnetically confined plasma, a vortex ring, or a gravitational disk. Each is real physics, not a costume — and because every one has natural rhythms, you can hear it as well as see it.
Two things make it more than a static picture. The field can be set in motion, and any configuration — even the model — can be keyframed and played back, so one state flows into another. The built-in "Apple → Smoke" sequence does exactly that, crossing from a vibrating body into a drifting vortex ring mid-morph.
Quick start
- Open the Presets menu (bottom bar) and choose Apple.
- Press ♪ Sound in the top bar and listen to the field.
- Open Presets → Apple → Smoke, switch to Playback, and press Play.
You'll watch — and hear — the apple unwind into a smoke ring.
The controls
Model — the law of physics
The most important choice (bottom bar). It sets which physics animates the torus, and several sliders relabel to match:
- Vibrating shell (the default) — a drumhead wrapped into a ring, ringing in its true modes; B₀ reads as Membrane tension.
- Magnetic field — a tokamak-style plasma, field lines winding at the safety factor and carrying Alfvén waves (the original plasma reading).
- Vortex ring — a smoke ring; the particle medium becomes real smoke rolling with the ring. B₀ reads as Circulation Γ, twist as Swirl.
- Gravitational disk — an orbiting disk with spiral arms; B₀ reads as Mass, shear as the rotation law, m as the spiral-arm count, rotation as the pattern speed. Controls that don't apply grey out.
Navigating the space
The Torus is a real 3D space you move through freely:
- Left-click and drag — orbit: circle around the form, which appears to turn on its axis as you move.
- Right-click and drag — free-look: hold your position and turn your gaze, like turning your head to look around from where you stand.
- Mouse wheel — fly in and out (dolly toward or away along your line of sight).
- Touch — one finger orbits; two fingers free-look, and pinch to fly in or out.
Top bar
- ♪ Sound — turn the field's sonification on or off.
- Controls — show or hide the parameter panel (left).
- Readouts — show or hide the live physics readouts (right).
Authoring & Playback
The Torus has two modes. - Authoring — where you shape the field and set keyframes (the default). - Playback — plays a recorded sequence back, with transport controls: Stop · Step backward · Play backward · Pause · Play · Step forward, plus a scrub bar to drag through the timeline by hand.
The structure, field, plasma and motion values can be keyframed and eased between — that's how a transition like Apple → Smoke is built.
Structure
- Major radius R₀ — the radius of the ring itself (m).
- Minor radius a — the radius of the tube. R₀ ÷ a is the aspect ratio.
- Elongation κ — stretches the cross-section (1 = circular).
- Triangularity δ — pulls the cross-section into a D-shape, as real tokamaks do.
Field
- Field magnitude B₀ — strength of the confining magnetic field (tesla).
- Twist (q₀) — the safety factor: how many times a field line travels the long way around per turn it makes the short way.
- Shear — how that twist changes from core to edge.
Plasma
- Density ρ — plasma density (log scale).
- Edge density — the density out at the edge, shaping the profile.
Motion
- Kink amplitude — displaces the column off its axis: the m=1 kink, the wobble. (This is exactly the motion the SOE logo's offset dot depicts.)
- Ripple amplitude — a finer surface ripple.
- Poloidal mode m — wavelengths the short way around the tube (1–12).
- Toroidal mode n — wavelengths the long way around the ring (1–16).
- Rotation — spin rate in Hz (negative reverses direction).
Appearance
- Surface — brightness, opacity, Relief (welts), Bloom, Micro-relief, Micro density.
- Grid — brightness, opacity, Mesh density.
- Volume — Shells (nested surfaces) and Detail.
Field lines
Overlays you can switch on, each with Opacity / Brightness / Count: - Toroidal field — lines running the long way around. - Flux contours — loops of constant flux. - Helical lines — twisting field lines, with a Turns control.
Lighting
- Strength (0 = off), Azimuth, Elevation, Ambient floor.
Particle medium
A drifting cloud that reveals the flow around the field: - Opacity (0 = off), Count, Particle size, Spread, Flow speed, Roll · poloidal, Swirl · toroidal.
Colour
Colour the surface by field strength, magnetic footprint, density, field-line pitch, or flat; set the two colour swatches and the Grid and Background colours. On the vortex and gravity models the two swatches colour the smoke and the star disk directly (base → highlight by speed).
Sound — the field heard
- Ambient / Spatial — Ambient plays the whole field at once, with no sense of distance. Spatial plays it from your viewpoint: zoom out toward silence, fly into the tube to be immersed, cross the resonance shell and the Beat swells.
- Master — overall level.
- Six voices, each with Solo (S), Mute (M), a level fader and a live frequency readout (with note name). They are the current model's own real frequencies, and their names change with it — the Alfvén rate and mode numbers for the plasma, the membrane's partials for the shell, the core-roll and Kelvin frequencies for the vortex, and the orbital, epicyclic and Lindblad frequencies for the disk. In every case they're genuine timescales pitched into hearing range.
Presets & recipes (bottom bar)
- Reset — return everything to defaults.
- Presets — Plasma torus · Blood cell · Apple · Smoke ring · Accretion disk. Each loads in its own model.
- Save recipe / Load recipe — export the whole configuration to
.json, or load one back. These recipes are also what feed the Media gallery's stills, transforms, flights, and sequences.
Things to try
- Load Apple, press Sound — the simplest way in: a shaped field, heard.
- Raise Kink amplitude — watch the column lean off its axis. That lean is the wobble the logo is built from.
- Push Triangularity δ toward 0.8 — the D-shaped cross-section of a real tokamak.
- Switch Sound to Spatial and fly the camera into the tube — the field rises up around you.
- Apple → Smoke in Playback — press Play and let one field become another.
- Switch the Model on the same settings — shell, magnetic, vortex, gravity — and watch one form obey four different laws. Or load Accretion disk for a hot ring orbiting a black hole — then see that same ring in full relativistic physics in the Horizon studio.
- Solo the Beat voice and sweep Toroidal mode n — hear resonances pass through as the two mode frequencies drift in and out of step.
The mathematics (optional)
The torus runs on four physical laws, and the Model selector switches between them. None of it is decorative — here is the actual mathematics behind each, with an honest note on where it is exact and where it is a faithful model rather than a full simulation.
Vibrating shell
The surface is a drumhead wrapped into a ring. Its natural notes are the standing waves of the wave equation on that curved surface — the Laplace–Beltrami eigenvalue problem:
It separates into a wave around the ring (ei nφ) and a poloidal profile Θm,n(θ) we solve numerically. Tension (B₀) and density (ρ) set the wave speed c, so a tighter, lighter membrane rings higher — just like a real drum; on a fat torus the modes lean toward the longer outer rim, and the partials come out inharmonic, like a bell.
Exact — these are the torus's true vibration eigenfrequencies (checked against the analytic thin-ring limit).
Magnetic field
A tokamak-style field threads the ring; each line winds around the tube q times per lap — q is the safety factor. The travelling waves are shear-Alfvén waves:
Where n and m meet a rational surface (q = m⁄n) the mode resonates — you can watch and hear it lock. The helical crest cos(mθ − nφ) is the genuine ideal-MHD kink displacement — the m = 1 kink buckling off-axis is the shape that became the brand's mark.
Exact — the dispersion, the field-line winding at q and the kink shape are all real; the wave amplitude is illustrative.
Vortex ring
A smoke ring. Every parcel of air is carried by the vorticity in the core through the Biot–Savart law:
That same law makes the ring push itself forward at U = (Γ ⁄ 4πR)(ln 8R⁄a − ¼), and it traps a bubble of air — the ring's atmosphere — that the smoke rolls around and travels with, which is why a smoke ring can cross a room without falling apart.
Exact velocity field (checked: centre speed Γ⁄2R, correct self-propulsion); the smoke is advected tracer particles, not a full fluid solve.
Gravitational disk
Stars orbit at angular rate Ω(r). A flat rotation curve — the fingerprint of dark matter — is Ω ∝ 1⁄r. Nudge a star radially and it bounces at the epicyclic frequency:
The spiral arms are a density wave: a rigid m-armed pattern turning at its own speed Ωp while stars stream through it (which is why the arms don't wind up). The arms live between the Lindblad resonances, where a star's radial bounce beats against the pattern:
Real orbital dynamics, epicyclic frequency and resonances; the arms are a kinematic density wave, not a live N-body self-gravity simulation.
Fractal — user manual
SOE · Fractal — escape-time sets in 2D and distance-estimated solids in 3D · structure that repeats at every scale
A fractal is a shape whose detail never runs out: zoom in and the same kinds of form reappear, smaller, without end. This studio holds two families. In 2D it draws escape-time sets — for every pixel it asks how quickly a simple repeated sum runs away to infinity, and colours by the answer. In 3D it raymarches distance-estimated solids — for every pixel it walks a ray forward in safe steps until it grazes the surface of a fractal volume, then lights it. Both run themselves: a slow tour drifts through the 2D set, a slow orbit turns the 3D form. Touch anything and you take over; let go and it carries on.
2D set / 3D bulb
The toggle at the top of the panel switches the whole studio between the flat escape-time gallery and the raymarched 3D gallery. Each mode keeps its own form list, palette and controls; switching is instant and loses nothing.
Navigating the space
Both galleries run themselves, but you can take the controls at any time — touch anything and you take over; let go and it carries on.
In 2D (the flat escape-time sets):
- Mouse wheel — zoom in and out, centred on the cursor. Keep going to fall endlessly into the boundary.
- Click and drag — pan across the set.
- Auto-dive — turn it on and the view descends into the boundary by itself, re-finding the edge as it goes.
In 3D (the raymarched solids):
- Left-click and drag — orbit: circle the form, which turns on its axis as you move.
- Right-click and drag — free-look: hold your position and turn your gaze.
- Mouse wheel — fly in and out (dolly toward or away).
- Touch — one finger orbits; two fingers free-look, and pinch to fly.
Fast 32 / Deep 64 — precision (2D)
Escape-time maths runs on the graphics card in single precision by default — fast, and crisp for the first few thousand-fold of zoom, after which the numbers run out of digits and the detail smears into blocks. Deep 64 swaps in an emulated double precision (two 32-bit floats carried per number), pushing that floor far deeper so the boundary stays sharp much further down. It costs some frame rate and currently applies to the Mandelbrot set; the other forms stay on Fast.
Fractal — choosing a form
- Form — the active fractal. In 2D: Mandelbrot (the parent set, z → z² + c), Julia (fixed c, the seed varies), Burning Ship (absolute values before squaring — rigging and hulls), Tricorn (the conjugate Mandelbrot), Multibrot (z → zⁿ, a higher-order parent) and Newton (the root basins of z³ − 1). In 3D: Mandelbulb, Mandelbox, Menger Sponge and Sierpiński (tetrahedron).
- Preset (3D only) — curated viewpoints. Pick one and the camera jumps to a flattering angle, distance, power and palette for that form (e.g. Box · Looking in, Sponge · Corner). Choosing a form by hand, or letting the tour advance, clears the preset back to “— jump to view —”.
- Cinematic tour / Auto-orbit — the self-running motion. In 2D the default is an edge-seek dive: the view descends toward fractal-boundary detail, and when you drag, scroll or click it re-aims and keeps going. Switch on the Cinematic tour instead to drift a slow zoom through each form in turn; in 3D the button turns the form on the spot. Either way it yields the moment you take control and resumes when you let go.
- Tour dwell — how long the tour lingers on each form before moving on, from a quick six seconds to a slow thirty.
- Bulb power (3D, Mandelbulb) — the exponent n in the bulb's z → zⁿ + c. Eight is the classic bulb; lower for fat, simple lobes, higher for a dense, spiky crown. The tour gently breathes this value.
Parameter — tuning the maths
- Detail (iterations) — how hard the studio looks. In 2D it's the escape-count ceiling: raise it to sharpen filaments deep in a zoom, lower it if the frame rate drops. In 3D it's the number of ray steps: more carves cleaner edges, fewer runs faster.
- Palette — the colour map: Spectrum, Ember, Ice or the house Cream & blue. It applies to both modes.
- Palette shift — rotates the colours through the band; the Drift button rotates them slowly on their own.
- Julia c (real / imag) (2D, Julia) — the fixed seed that defines which Julia set you see. Tiny moves redraw the whole shape.
- Power (multibrot) (2D, Multibrot) — the exponent n; the set gains roughly n − 1 axes of symmetry.
View — moving the camera
In 2D, drag to pan and scroll to zoom toward the cursor — keep zooming to fall into the boundary, where the detail is endless (single-precision maths sets the practical floor). In 3D, drag to orbit (left–right turns, up–down tilts) and scroll to dolly. You can now push the camera through the surface and into the structure — fly into the hollow centre of the sponge, the cavities of the box, the gaps of the tetrahedron. Right-drag is free-look — hold your position and turn your gaze. On touch, one finger orbits; two fingers free-look, and pinch to dolly. Reset returns the form to its framed starting view.
The 3D orbit has no pole: keep dragging upward and the view carries straight over the top and down the far side, rather than stalling at the vertical.
Readout
The strip reports the live Form, the Zoom depth (2D) or camera distance (3D), the Center or orbit angle, the active Iterations, and the FPS — your guide when trading detail for smoothness.
Things to try
- In 2D, sit on Mandelbrot, switch Drift on, and let the tour fall into the boundary with the colour band breathing as it descends.
- Flip to 3D bulb and run the presets end to end to meet all four solids from their best angle.
- On the Menger Sponge or Mandelbox, scroll all the way in until the surface opens and you are inside the structure, then let auto-orbit turn the walls around you.
- On the Mandelbulb, drag the power by hand from two to twelve and watch the lobes split and multiply.
- Tilt the 3D camera to a steep angle, release, and let the orbit hold that elevation — it resumes from wherever you leave it.
The maths
The 2D sets share one engine: iterate a simple rule on a complex number and watch whether it stays bounded or escapes to infinity. The classic Mandelbrot rule is
Points that never escape form the black body of the set; the colour outside counts how many steps escape took, smoothed so the bands flow. Change the rule and a different classic appears — Julia fixes c and varies the start, Burning Ship takes |Re z| and |Im z| first, Tricorn conjugates (z̄² + c), Multibrot raises the power (zp + c), and Newton hunts a polynomial's roots instead of testing escape.
The 3D forms can't be solved that way, so they are raymarched: each pixel fires a ray and, at every point along it, a distance estimator returns a safe distance to the nearest surface —
so the ray leaps that far, again and again, until it grazes the fractal, where the surface normal, ambient occlusion and a blue rim light give it depth. The Mandelbulb folds space in spherical coordinates (radius raised to a power, angles multiplied); the Mandelbox folds it with box and sphere reflections; the sponge and tetrahedron fold it with plain reflections. The same idea throughout: structure that repeats at every scale, lit so you can walk into it.
Exact mathematics — these are the sets and solids themselves, computed point by point, not a simulation of anything.
Resonance — user manual
SOE · Resonance — standing waves, Chladni figures and Lissajous curves · the field made visible
What this is
Resonance drives a surface — a plate, a sheet of water, a field of light — with a single pure frequency and lets you watch where it holds still and where it moves. At most frequencies the surface just shudders. At special ones, the resonant modes, the motion locks into a standing pattern: still lines (nodes) where nothing moves, and cells between them that heave in and out. Sprinkle grains on a plate and they migrate off the moving cells and gather on the still lines, tracing the pattern in sand. Those are Chladni figures — you are looking at the shape of a frequency.
Each pattern is named by two whole numbers, the mode (m, n) — how many half-waves fit across the plate in each direction. Whole-number modes are exactly why a string sounds musical: the same integer ratios that make a plate ring make an octave, a fifth, a third. Resonance lets you hear the tone, see its plate, and read the interval it belongs to, all at once.
Quick start
- Leave Medium on Particles, and in the Sound group press Sine on so you can hear the drive.
- Turn the Frequency dial — drag it up or down, or scroll over it — slowly upward. For most of the range the grains just jitter.
- When the state readout flips to resonant, the grains snap onto a clean figure — that's a mode. Use the mode ▸ arrow to jump straight between resonant frequencies.
Every resonant frequency is a different sand figure. Stepping through the modes is stepping through a frequency's hidden geometry.
The controls
The panel is a set of groups; each control is named exactly as it appears.
Plate shape
- Plate shape — Square, Circle or Triangle. Each is a genuinely different vibrating plate with its own family of modes — the square's free-edge beam modes, the circle's Bessel rings and spokes, the equilateral triangle's exact modes — so the same frequency draws a different figure on each.
Frequency
- Frequency — a dial for the single tone driving the surface, shown in hertz. Drag it up or down, or scroll over it, to change the tone in 1 Hz steps (hold Shift for a faster sweep); the dial spins as you go. The readout reads resonant when you land on a mode and drifts otherwise.
- ◂ mode ▸ — step to the previous or next resonant mode (m, n). The cleanest way to tour the figures without hunting frequency by hand.
Drive
- Amplitude — how hard the surface is driven (×). More amplitude throws the grains harder and sharpens the figure; too much and they scatter off it.
- Re-scatter — toss the grains back into an even layer so a fresh figure can form cleanly.
- Re-scatter on sweep — when on, the grains re-scatter automatically each time you cross into a new mode.
Time
- Play speed — slows or freezes the simulation (× — 0 = paused, 1 = full speed). Drop it low to watch the grains crawl toward the nodes.
Sound
- Sine on — play a pure sine tone at the current frequency, so you hear what you're seeing.
- Volume — tone level.
Audio input — drive the plate with real sound
Instead of setting the frequency by hand, hand the plate a live signal. It listens for the strongest pitch and follows it, and lets the loudness set how hard the plate is driven. A pure tone snaps to a clean figure; music shimmers and keeps rearranging.
- Off / Mic / File — the source. Mic listens through your microphone; File opens an audio file from your device.
- Input level — a meter, not a slider: it shows how loud the incoming signal is right now. If it sits at zero, nothing is reaching the plate.
- Detected pitch — the dominant frequency found in the signal, in hertz. This is what the plate is being driven at.
- Transport (File) — play/pause, skip back and forward ten seconds, and a scrub bar with elapsed and total time. Loop repeats the file; press it for Once and the plate holds the last figure when the file ends. File… picks a different track.
Your browser will ask permission the first time you choose Mic. If nothing reaches the plate, check that Resonance is allowed to use the microphone in your browser's site settings, and that the microphone isn't muted on your device — a muted mic still connects, it just sends silence. Resonance will tell you which of these it hit.
Medium
- Particles / Waves / Light — what the standing wave is made visible in. Particles is the classic sand plate, grains migrating to the nodes. Waves shows the surface itself heaving. Light renders the field as luminance.
- Grains — for Particles, how many grains sit on the plate. More grains, a denser figure.
- Surface mesh — show the driven surface as a mesh beneath the active medium.
- Colour — the palette for the active medium. A side readout also maps the tone onto a visible colour as an honest analogy — sound sits far below light, so it is an illustrative correspondence, not a physical conversion.
View
- Reset view — return the camera to straight-on. Otherwise drag to orbit, scroll to zoom — the plate is a real surface in space you can look across.
Lissajous
- Lissajous window — alongside the plate, the curve traced by two frequencies held at a whole-number ratio (m:n). A 1:2 ratio — the octave — draws a figure-eight; 2:3, a fifth, draws a tidier knot. The Pythagorean intervals are exactly the ratios that close into a stable curve.
Things to try
- Walk the modes — step ▸ from the lowest mode upward. Low modes are simple crosses and rings; high modes are intricate lattices. Complexity climbs with frequency.
- Particles → Waves → Light on the same mode — the node lines stay put while the look changes completely. The pattern is the frequency, not the medium.
- Hold a mode and drop Amplitude — the figure softens as the drive weakens, then sharpens again as you raise it.
- Sine on, then sweep slowly — the ear catches the resonance a moment before the grains finish gathering. Hearing and seeing the same instant.
- Lissajous at 1:2, then 2:3, then 3:4 — octave, fifth, fourth. The simpler the ratio, the simpler the curve. That is consonance, drawn.
- Sing into it — set Audio input to Mic and hold a steady note. Slide up a scale and the plate steps through its modes as your pitch climbs. Then try humming a chord's worth of notes in turn and watch which ones find clean figures.
- Feed it music — File, then scrub to a sustained passage. A solo instrument holds a figure; a full mix never settles, because there is no single pitch to find. That instability is the honest answer.
The mathematics (optional)
A real Chladni plate is free at its edges, so its modes are not the simple clamped half-waves you might guess — each plate shape has its own exact solution, and the sand gathers on the nodal lines φ = 0 where the surface displacement cancels.
Square plate
A free plate's figures are built from free–free beam shapes — the vibration of a bar with loose ends — set by the transcendental condition
with the plate's pattern a product of two such beams, one each way across it. The degeneracy between (m, n) and (n, m) at equal frequency is what lets the crosses and loops look so organic.
Circular plate
On a disc the modes split into rings and spokes — a Bessel function radially, a cosine around:
where D is the number of nodal diameters and λ is a zero of J′D — the free-edge condition that makes the rim an antinode; the nodal circles sit at the zeros of JD.
Triangular plate
The equilateral triangle is one of the very few shapes with an exact closed form (Lamé's solution), because it tiles the plane by reflection. Its free-edge modes are symmetric combinations of three plane waves — the A2 “C-functions” — and their frequencies fall out as
the hexagonal-lattice signature of three-fold symmetry.
Exact — all three plate spectra are the true free-edge eigenmodes (validated to machine precision: the beam roots, the Bessel zeros, and the triangle's exact modes). The sand's drift to the nodes is a faithful over-damped model rather than a full time-domain elastic solve, and the colour readout is an analogy, not physics.
Horizon — user manual
SOE · Horizon — Schwarzschild & Kerr geodesic lensing · light bent by curved spacetime
What this is
Every pixel on the screen is a real ray of light, traced backwards through the curved spacetime around a black hole. Nothing here is a painted picture of a black hole — the dark shadow, the thin bright ring hugging it, the way the glowing disk wraps up and over the top: all of it falls out of solving Einstein's equation for how light moves, one small step at a time, for every point on the screen. Drag to fly around it and the whole geometry rebuilds itself live.
The bright band is an accretion disk — gas orbiting the hole so fast it glows white-hot. That ring is the honest link back to the rest of Shape of Energy: it is a torus of orbiting matter, the same shape you can build by hand in the Torus studio. There you shape the ring; here you see what such a ring is really orbiting, in full relativistic physics. The same shape, done two ways.
Quick start
- Leave everything at its defaults and just left-drag to orbit. Tilt until the disk is edge-on: the bright line across the middle is the disk seen side-on, and the arcs curving above and below are the same disk — its far side, bent up and over the hole by gravity.
- Raise Spin from zero. The still (Schwarzschild) hole becomes a spinning (Kerr) one — the shadow turns lop-sided and the bright inner edge creeps inward.
- Press True physics to drop the two viewing exaggerations to their real values, then Reset view to return to the opening angle.
The controls
The hole
- Black hole size — the mass, in units of the Schwarzschild radius
rs. It sets everything at once: the size of the shadow, how hard light bends around it, and where the disk's inner edge can sit. - Spin — how fast the hole rotates, from 0 (a still Schwarzschild hole) to 0.998 (a near-maximal Kerr hole). A spinning hole drags spacetime itself around with it — frame-dragging — which lops one side off the shadow and pulls the disk's innermost stable orbit (the ISCO) inward.
The disk
- Disk size — the outer radius of the glowing gas.
- Disk brightness — overall exposure of the disk.
- Hot spot — seeds a brighter clump in the gas. Because the inner gas orbits faster than the outer (the same Keplerian law as the Torus studio's gravity model), that clump is sheared into a trailing spiral as it turns — real differential rotation, not a painted texture.
Viewing
- Doppler emphasis — the side of the disk sweeping toward you really is brighter and bluer; this dial exaggerates that shift so it reads at a glance. The marker labelled true is the literal, unexaggerated value.
- Motion speed — how fast the disk turns. The marker is the true Keplerian rate for this hole; higher is sped up for effect.
- Bloom — the soft glow around bright regions; a camera/eye effect, not the object itself.
- Orbit — a slow automatic drift of the camera around the hole. Centre it (still) to hold a fixed view.
- Starfield — density of background stars, so you can watch them lensed and smeared into an Einstein ring around the shadow.
- Nebula — interstellar gas and dust behind the hole. It is sampled along the same bent ray as the stars, so it lenses with them: wind the camera round and watch the filaments wrap and stretch around the shadow rather than sliding flat behind it. Turn it to zero for clean empty sky.
Toggles & buttons
- Accretion disk — hide the gas to see the bare shadow and photon ring.
- High detail — more integration steps per ray (sharper, heavier). Turn it off for a smoother frame rate on weaker hardware; the reading beside it is the live rate.
- Reset view / True physics — return to the opening angle; snap the two exaggeration dials to their true values.
What's real, and what isn't
In the spirit of the rest of SOE, here is the honest ledger.
Genuinely computed: the gravitational lensing, the black shadow, the thin bright photon ring, the disk wrapping over the top, and the smearing of background stars all emerge from tracing real light rays (null geodesics) through the exact spacetime — the Schwarzschild metric when still, the Kerr metric when spinning. Gravitational redshift, Doppler shift and frame-dragging are folded into one exact shift factor; the disk's inner edge sits at the true innermost stable orbit; and the shadow, photon ring and horizon all scale correctly with mass and spin. These were checked against known results — the 3√3 shadow radius, the prograde/retrograde light limits — before a single pixel was drawn.
Simplified or illustrative: with spin at zero it is a non-rotating hole, and even with spin a clean, isolated one. The disk is treated as geometrically thin, so seen exactly edge-on it reads as a sharp line rather than a soft band. The swirling structure is real orbital motion but not a fluid simulation; the star field is procedural, not a real sky; the colours indicate temperature rather than a calibrated spectrum; and the glow is a camera effect. There are no jets or winds — those need plasma physics no browser can compute. What you are seeing is honest geometry and light, with the gas dynamics left as illustration.