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
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
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_resolveramp), so the map arrives soft and sharpens into fine structure — the "resolve". - A very slow
rotYof 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
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.
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.
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.