ZOOXANTHELLA
Colophon · Reef Time-Lapse

How the reef
was grown.

Zooxanthella is an interactive reef time-lapse for anyone who has heard the word bleaching without watching it happen. A single coral colony accretes polyp by polyp across simulated centuries; warm the lagoon past 29.5 °C and it blanches, honestly, then reseeds its algae if you cool it. The page has one job: make a slow, invisible catastrophe legible in fifteen seconds.

01 — Palette

Four colours, argued from the water.

Nothing here is decorative. The teal is the lagoon; the coral and gold are the two pigments a healthy polyp carries; the white is what's left when the algae leave. The whole bleaching effect is a single interpolation between coral-plus-gold and this bone white.

Lagoon #0E4A54
The water column and every dark ground. A saturated tropical teal so the coral reads warm against it. Reserved for fields, never for small text.
Coral #E87A5C
Living tissue and the accent that marks danger on the temperature track. Used for lines, marks and headlines — text over water uses a lighter coral-ink (#F0A488) to clear 4.5:1.
Polyp gold #F0C86A
The zooxanthellae themselves — the rented pigment. It fills the calyx dots, the night fluorescence, and the motes that drift off during bleaching.
Bleach white #EFECE2
Bare aragonite skeleton, and the body-text ink. When symbiont density hits zero, tissue lerps entirely to this — the reef goes bone-white on screen.
02 — Type

Spectral for the field notes, Outfit for the instruments.

Spectral · display
A reef, grown by the hour.
A high-contrast text serif with a genuine italic. It carries the wordmark, the headlines and every temperature readout — the humanist warmth reads like a naturalist's notebook, and the italic gives one moment of bravery in the hero.
Outfit · interface
LAGOON CONTROL · 29.5° BLEACH · REEF HEALTH 100%
A geometric sans set wide in small caps for every label, tick and eyebrow. It keeps the console reading like calibrated equipment against the organic canvas, and stays legible at 10px with heavy tracking.
03 — Technique

The signature: a colony that builds and un-builds itself.

The reef is a real agent simulation on a single canvas 2D context — no images, no video, no WebGL, no libraries beyond the two webfonts. It grows from a handful of larvae seeded on the substrate. Each is a branch with a living tip; on every growth tick the tip deposits one tapered segment of skeleton, wanders slightly with an upward light-bias, and occasionally buds a daughter branch — a stochastic L-system that produces staghorn structure without ever repeating.

Colour is a separate, per-segment quantity: a symbiont density from 0 to 1. Temperature sets an algal carrying-capacity; each frame every segment eases toward it, but asymmetrically — pigment leaves roughly eight times faster than it returns, exactly as on a real reef. Tips carry a higher heat-sensitivity, so blanching starts at the growing edges and spreads inward. Sustained severe heat marks tissue dead; dead tissue only ever recolonises to a muted forty percent, so a scorched reef never quite comes all the way back. Rendering just lerps each segment between bone-white and coral by its own symbiont value — so the bleach is emergent, not a scripted colour swap. Growth halts whenever colony health drops below forty percent: a bleached reef stops calcifying, and resumes only once you cool the water.

One segment, four states: pigmented, stressed at the tips, fully bleached with algae drifting off, and recovered — with dead branches (grey-green) that never took their colour back.

Discipline around it: everything else is quiet. A diel clock breathes the whole colony and extends polyp tentacles at night; five caustic bands ripple at the surface; a warm vignette creeps in above 29 °C. The canvas caps device-pixel-ratio at 2, resizes to its container, clamps its frame delta, and parks the animation loop entirely when the tab is hidden. Under prefers-reduced-motion it fast-forwards to a mature colony and paints one settled frame — the slider still bleaches and heals it, event-driven, with no running loop.

04 — Iteration log

Three passes, honestly kept.

Pass 1 — Craft

Coherence & contrast
  • The Age readout showed 1yr while the hero promised "est. 300 years" and the copy said "three centuries" — a flat contradiction. Re-derived age from accreted skeleton (segments ÷ 4.5) so a full colony lands near three hundred years, which is what the accretion actually represents.
  • Gave the big temperature number live feedback: it lerps from bone-white toward coral as the water crosses into the danger zone, so the readout itself signals stress.
  • Confirmed body text uses the bleach-white ink, not gold, over the lagoon and panels — clearing 4.5:1 everywhere, per the collection's most-repeated contrast lesson.

Pass 2 — Depth

Enrich the signature
  • Slowed the accretion (growth interval 0.09→0.12s, steps-per-frame 6→3) so the time-lapse is genuinely watchable — the colony now builds over ~12s instead of flashing into existence.
  • Added a second-read detail: living coral tips softly fluoresce gold at night, an additive bloom that only appears if you watch through a full diel cycle. Real corals do this; here it also quietly marks which tips are still alive.
  • Kept the existing bleaching tell — expelled zooxanthellae drift upward as gold motes — as the paired micro-interaction to the temperature slider.

Pass 3 — Hardening

375px · reduced-motion · restraint
  • On mobile the docked console covered the entire reef — the signature element was invisible. Raised the substrate to 66% height on narrow screens and capped branch length to 0.7× so the canopy lifts into the clear band between the lede and the panel.
  • Verified the reduced-motion path renders a full settled colony (not a blank frame), and that the 375px console, wordmark and nav all sit inside the viewport box — not just a passing scrollWidth.
  • Chanel rule: the drag hint carried two bobbing arrows flanking the label. Cut it to one. Confirmed focus-visible rings, DPR cap, resize reseed and hidden-tab pause all hold.