A section drawing
that builds itself.
MACROTERMES is a fictional field-biology imprint. Its single job: let a visitor watch a termite mound assemble from nothing but local rules, then see the same structure breathe. Nothing on the page is a picture — the mound is carried into place by an agent simulation, and the airflow is a solved field.
Emergence you can sit and watch
Real Macrotermes michaelseni hold their brood near 30°C in a desert that swings from frost to 40°C — with no plan, no foreman, and a builder whose entire behaviour fits in three rules. The page stages that as a live cutaway: a stigmergic build, then a thermosiphon that ventilates the deep nest. The argument is that architecture and physiology here are the same emergent thing.
Laterite earth, cool air, deep shade
A museum voice and an instrument voice
Geometric-humanist with just enough quirk to read like a modern natural-history museum. Set huge for the headline — the one line of typographic bravery, with no italicised and “that cools itself.” dropped into flue-blue.
The section-drawing voice: scale ticks, leader labels, live readouts and the pass log. Monospace gives the whole thing the feel of a measured field instrument.
What is actually running
- Canvas 2D agent simulation — 200 agents on a 120×86 grid pick up and deposit soil; a cement-pheromone field diffuses and decays; a humidity/CO₂ template biases where walls close and flues stay open.
- SVG cutaway chrome — scale bar, leader lines and the “Section A–A′” label live in an SVG whose viewBox matches the grid, so annotations pin exactly to features the simulation produced.
- Boussinesq vorticity–stream-function solve — the convection is a real field, not a scripted loop (detailed below).
- No JS libraries. Google Fonts only; everything else is hand-written canvas, SVG and CSS. Layout is CSS grid; entrances use IntersectionObserver.
The mound is never drawn. Each agent runs one blind loop — fetch a grain near the surface, climb the scent gradient, set it down where fresh cement pheromone is strongest — and structure is the side effect. Deposits reinforce their own neighbourhood (stigmergy), so pillars thicken into walls; a faint template of the mound envelope and flue spacing steers where, exactly as humidity and CO₂ gradients do in the field. No agent holds the plan, yet flues, galleries and a domed royal cell resolve out of the traffic.
Then it breathes. Heat from the fungus combs sets a temperature field across the pore-space the agents left behind; its horizontal gradient generates vorticity; we relax the stream-function Poisson equation (∇²ψ = −ω, with ψ = 0 on every wall) until the flow is divergence-free, and take velocity as the curl. Tracers ride that field — warm air up the central flues, cooling at the porous shell, sinking on the flanks — a closed current solved on galleries that were themselves emergent.
Three passes
The mound read as a flat mesa
The first height profile saturated into a plateau with near-vertical sides. Retuned it to a narrow central Gaussian (σ≈0.11) plus two shoulder spurs, so the section resolves into a spired cathedral with a real apex and buttresses. Clamped the cap so flues stay sealed 3–4 rows under the surface, and tightened the metastrip rhythm.
Made the air worth watching
Convection tracers now vary line-width with local flow speed and glow via lighter compositing, and shift warm→cool along the current. Added a slow metabolic-heat pulse at the fungus combs — a second-read detail you only notice once the mound is breathing. The stream-function auto-corrects its sign so the central updraft is guaranteed regardless of the temperature layout.
375px, reduced-motion, and one ornament gone
Verified the mobile box — nav collapses to wordmark + Index with nothing crossing the 375px edge. Reduced-motion renders a fully-assembled section with static flow arrows (never blank); the rAF loop pauses on document.hidden and clamps delta on resume; DPR is capped at 2 with a grid-safe resize. Dropped two of four corner brackets (the Chanel rule) for a cleaner drafting frame, and did a final copy read.