A dark felt bench, a triangular lattice of brass pegs, and tens of thousands of amber beads falling through it. Each bead flips a blind coin at every row; the crowd draws a bell curve every single time.
Galton is a demonstration piece for statisticians, teachers, and the merely curious. Its one job: make the strangest fact in probability — that pure chance, piled deep enough, becomes iron law — visible in a single glance.
The whole page is one idea: the Normal curve building itself out of noise. A three.js InstancedMesh holds up to 32,000 beads in a single draw call. Each released bead is handed a fresh path — eighteen independent coin-flips, ±½ a peg-pitch each — computed in JavaScript, not by a physics solver. That is the true Galton model, and it is cheap enough to run tens of thousands of times.
A bead zig-zags down the lattice, lands in the bin equal to its number of right-turns, and stacks. Bin heights are a binomial, and a binomial is a Normal in disguise. Overlaid as a bright additive ribbon is the analytic N(μ, σ²) for the current count — so the columns are always visibly rising to meet a curve that is itself still growing. At rest the board is pre-seeded to a partial bell (~18,000 beads) so it reads instantly, then keeps pouring toward its full shape.
Every colour is argued from the object: a lecture-hall demonstration bench in low light.
The brief's amber is a line/mark token — it fails 4.5:1 as small text on felt, so all copy uses chalk-ink and its dimmed derivative. Amber is reserved for the things that are actually marks: the beads, the curve, the rule strokes.
Two voices: the lecture and the ledger.
A high-contrast old-style serif with optical sizing — the voice of the demonstration hall and the exhibit label. Weight 500 at large optical size for the wordmark.
Tabular figures for a live tally that must not jitter as digits change. It sets the readouts, captions, and this entire colophon.
updateRange — settled beads are written once and never touched again, keeping tens of thousands of beads cheap.document.hidden with a clamped delta on resume, and a WebGL context-loss listener swaps in a static SVG bell.Tightened the type scale (deliberate 0.66 / 0.86 / 1.02 rem steps, not 16/24/32) and moved all body copy off the amber onto chalk-ink for contrast. Rebalanced the readout grid to tabular figures so the tally stops jittering. Rewrote the intro to a concrete two-sentence claim and set the peak-bin stat to show its live share. The first render exposed the biggest defect: scene fog with the camera at its far plane was fogging every bead and the curve to near-black — the board read as an empty field. Removed the fog, pulled the camera in, and lifted the ambient so the amber marks and the analytic curve read.
Enriched the signature: the Gaussian ribbon now tracks the current count, so the curve and the columns grow together rather than the columns chasing a fixed target. Warmed the bead emissive so the piles glow as granular amber rather than flat fill. Added the faint μ centre-axis and a soft sine-bounce on falling beads as second-read details, and eased the settling drop with a quadratic ease-out. The pour button now recolours and lifts on hover.
375 px rendered the bell entirely behind the bottom panel — the signature was hidden. Fixed it with a portrait camera path that crops the funnel and frames the pegs and bell in the upper band, clear of the panel; nav and wordmark stay inside the viewport and scrollWidth is clean. Confirmed the reduced-motion path renders a full, settled bell in a single frame with no loop. Removed one ornament (a redundant funnel hairline), clamped the resume delta after a hidden tab, and did a final copy read.