Generative Assets · 114 · Wave 5 Deep Time

Afterglow, made

A rendered cosmic microwave background — the 13.8-billion-year-old glow released 380,000 years after the Big Bang, drawn as a living all-sky map. Audience: anyone who has seen the famous mottled oval and wondered what they were looking at. The page's single job: make the oldest light in the universe legible and quietly astonishing.

The concept

The cosmic microwave background is a photograph of the entire sky taken when the universe was 3,000 kelvin and 380,000 years old — the instant it cooled enough to turn transparent. AFTERGLOW renders that surface as a Mollweide-projected temperature field: the whole celestial sphere flattened into one ellipse, false-coloured so its one-part-in-100,000 ripples become visible. The field drifts and resolves so that at rest it reads as a finished, living map rather than a static image — deep time you can watch settle.

Palette — argued from the physics

Cold CMB
#1A2A6C
Cold spots — denser regions where gravity had begun to pull. The base of the thermal ramp.
Warm CMB
#E24B2E
Hot spots — rarefied troughs. The map's warm pole, taken from real CMB false-colour convention.
Peak
#F2C84B
The extreme highs and the acoustic-peak marker. Reserved for the brightest anisotropies and key readouts.
Spectrum ink
#8A5A2A
A muted gold held to lines and marks only — graticule, axes, rules — never small body text.
Ecru body
#DACEBC
The text token. Warm off-white at ~12:1 on the void so copy stays legible over the animated field.
Void
#070A14
Deep space around the ellipse. Cool near-black, faintly blue rather than neutral.

The false-colour ramp runs #0C1436 → #1A2A6C → #6E3A6A → #E24B2E → #F2C84B — cold navy through a violet transition to hot red and a yellow peak, the standard "blue is cold, red is hot" reading with a passage through violet that keeps midtones from muddying. Following the collection's ink/line split, the bright accent is spent only on lines and marks; all text sits on the ecru token with a scrim behind anything over the field.

Type

Afterglow
Space Grotesk · 300 / 600 — display
z = 1100 · 2.725 K · ℓ ≈ 220
Space Mono · 400 / 700 — readouts

Space Grotesk's slightly technical, astronomical-instrument feel suits a subject that is equal parts cosmology and data. It is set light and large for the wordmark with the second syllable lit in the thermal gradient. Every number — temperature, redshift, multipole, age — is Space Mono, so the page reads like a readout panel from a telescope's control room.

Techniques

The all-sky is a single raw-WebGL fragment shader drawn over one fullscreen triangle — no three.js, no textures, no raster assets. For every pixel:

  • An ellipse test masks the Mollweide map; pixels outside become deep-space void with a faint warm rim glow.
  • Inside, the inverse Mollweide projection turns the pixel into a latitude and longitude, then a unit direction on the celestial sphere — so there is no seam and no pole pinching in the noise.
  • That direction samples six octaves of 3D value-noise fBm. The higher octaves fade in over the first six seconds (the u_resolve ramp), so the map arrives soft and sharpens into fine structure — the "resolve".
  • A very slow rotY of the sampling direction plus a drift on the noise's time axis keeps the field alive forever without ever looking busy.
  • The noise value is mapped through the five-stop false-colour palette, then limb-darkened toward the ellipse edge, overlaid with a faint 30° graticule, and finished with a thin peak-yellow rim line.

Beside it, the angular power spectrum is inline SVG: the CMB TT curve with the first acoustic peak marked at ℓ ≈ 220, stroked in the same cold-to-peak gradient. It is the second-read reward — the map shows you the ripples; the sidecar shows you they are music.

Hardening: devicePixelRatio is capped at 2, the canvas resizes to its container, the rAF loop pauses on document.hidden, WebGL context loss and compile failure both fall back to a CSS false-colour gradient ellipse, and prefers-reduced-motion renders one settled static frame instead of animating.

Iteration log

Pass 1 — Craft

Found: the first draft mapped noise directly in lon/lat, which pinched hard at the poles and read as a smeared band rather than a sky. Body copy over the ellipse dipped under 4.5:1 in the warm regions, and the readout numbers sat on the raw field.
Changed: switched the shader to sample 3D noise on the true sphere direction (seamless, no pole smear); introduced the ecru body token at ~12:1 and moved all readouts onto a blurred scrim panel; set a deliberate type scale and lit only the second syllable of the wordmark so the gradient reads as one bright accent, not five.

Pass 2 — Depth

Drove the signature: watched the field across the full settle — confirmed the u_resolve ramp actually adds high-frequency structure (early frames soft, late frames mottled) and that the slow drift changes pixels frame to frame.
Added: the faint 30° graticule so the ellipse unmistakably reads as a map projection; the limb-darkening and peak-yellow rim for depth; the power-spectrum sidecar with its acoustic-peak marker as the second-read detail; and the false-colour legend bar in the body, tied to the exact shader ramp so the map and the scale share one palette.

Pass 3 — Hardening

Drove it again at 375px and under reduced motion. Found: the corner spectrum panel crowded the map on narrow screens; the drip scroll-hint animated under reduced-motion.
Changed: the sidecar now hides below 820px and reappears as a full-width figure inside section 03; the scroll hint's animation is gated behind no-preference and hidden on small screens; verified focus-visible rings, the ellipse floor (hh clamped so it never collapses on short viewports), and a settled static frame under reduced motion. Removed one ornament — an earlier pulsing vignette on the void — per the Chanel rule; the rim glow alone carries the edge.