Andrew Fribush

Library lab

Five candidates, each tried against the figure identity. Scroll through — the first spin drives fig 1.1.2 by scroll.

SCROLLAMA · THE FIGURE AS SCROLLYTELLING

scrollama 3.2.0 · ~2 kB · IntersectionObserver steps sail the voyage via the new VoyageHandle

fig. 0.1.1 · the voyage, driven by scroll.
scrollama · the figure as scrollytelling
TROY · 600 MENCICONES −72 · BK 9MALEA · BLOWN SOUTHLOTUS-EATERS · BK 9CYCLOPS −6AEOLIA · BAG OF WINDS · BK 10ITHACA IN SIGHT · BLOWN BACKLAESTRYGONIANS −484 · 11 SHIPS · BK 10CIRCE · ONE YEAR −1 · BK 10SIRENS · BK 12SCYLLA −6 · BK 12THRINACIA −30 · BK 12OGYGIA · CALYPSO · SEVEN YEARS · BK 5SCHERIA · BK 6–12ITHACA · 1 MAN · YEAR 10MEN600LOST 0 · 0.0%SHIPS 12YEARS FROM TROY0510CIRCE · 1 YRCALYPSO · 7 YRS
TROY · 600 MEN

Ten years of war are over. Twelve ships, fifty men to a ship — six hundred set sail for home.

ISMARUS

The wind carries the fleet to the Cicones. They sack the city; the counter-attack costs six men from every ship.

CAPE MALEA

Rounding Malea for the last easy leg home, a nine-day storm drives them south past Cythera — off the chart of the known world.

THE LOTUS-EATERS

Landfall among the lotus-eaters. Three scouts taste the fruit and forget home; Odysseus drags them back to the benches and ties them under the thwarts.

THE CYCLOPS

They beach below Etna. Six men are eaten in the cave before the stake goes into the eye — and the boast on the way out earns Poseidon’s grudge for the rest of the voyage.

AEOLIA

Aeolus, keeper of the winds, ties every contrary wind into a bag and hands it over. Nine days of fair sailing east.

ITHACA IN SIGHT

Close enough to see men tending fires on the home shore. Odysseus, nine days at the steering oar without rest, finally sleeps.

BLOWN BACK

The crew open the bag looking for silver. The storm throws them the whole way back to Aeolia — and this time Aeolus refuses to help a man the gods clearly hate.

THE LAESTRYGONIANS

Six days of rowing north. In the closed harbour the giants spear eleven ships like fish. Only the flagship, moored outside, escapes: 484 men gone in an afternoon.

CIRCE · ONE YEAR

On Aeaea Circe turns the scouts to swine, then keeps the crew a year at her table. One man lost — Elpenor, off the roof. From her island they sail to the land of the dead and back, to ask a ghost the way home.

THE SIRENS

Past the Sirens with wax in every ear and Odysseus lashed to the mast — the only man to hear the song and live to report it.

SCYLLA

In the strait at Messina, Scylla takes six men off the deck — the price, Circe said, of not losing the whole ship to Charybdis.

THRINACIA

Weather-bound a month on the island of the Sun, the starving crew slaughter the cattle of Helios. The storm that follows splinters the ship; one man rides the keel.

OGYGIA · CALYPSO · SEVEN YEARS

Seven years on Ogygia — most of the voyage is this wait. Then Hermes brings the order Calypso cannot refuse: let him go.

SCHERIA

A raft, a last storm from Poseidon, two days swimming. Nausicaa finds him on the Phaeacian beach — and the Phaeacians owe every guest a passage home.

ITHACA · YEAR 10

A Phaeacian ship lands one sleeping man on his own beach. 600 left; one returns.

ROUGH-NOTATION · THE AUTHOR'S PEN

rough-notation 0.5.1 · 3.8 kB · circle / underline / strike / bracket, drawn once on first view

fig. 0.1.2 · hand marks drawn onto set type.
rough-notation · the author's pen

The Catalogue of Ships gives Odysseus twelve ships, and at fifty oars each that is 600 men — a number the poem then spends ten years spending. What the figure makes visible is that the losses are not gradual: almost everyone dies in one afternoon, in the Laestrygonian harbour, where ten eleven ships are trapped against the cliffs and only the flagship, moored warily outside, gets away.

GSAP DRAWSVG · THE PLOTTER STROKE

gsap 3.15.0 (all plugins now free) · the fig's compiled coastline drawing itself, mainland first

fig. 0.1.3 · the coastline, drawn stroke by stroke.
gsap drawsvg · the plotter stroke

CANVAS-SKETCH · THE PLOTTABLE PLATE

canvas-sketch 0.7.8 + util · authoring-only: 18×12 cm generative ridgelines, exportable as a plot-ready SVG

fig. 0.1.4 · a generative plate, ready for the pen.
canvas-sketch · the plottable plate

KATEX · THE FIGURE'S OWN LAWS

katex 0.18.1 · display-mode typesetting of the band-width scale and chart transform

fig. 0.1.5 · the figure system, stating its own laws.
katex · the figure's own laws

MAPLIBRE + DECK.GL · THE WORLD CHART

MapLibre + deck.gl (lazy-loaded) · self-contained basemap from world-atlas 110m, no tile server · TripsLayer pulses on great circles · pan/zoom live

fig. 0.1.6 · the world chart, flows in motion.
maplibre + deck.gl · the world chart

POINTLAW · THE FIGURE AS A SINGLE FORMULA

zero dependencies · new house primitive: (i, t) → point over a 520×520 sheet, ~12k ink dots per frame, source printed as the caption

fig. 0.1.7 · two laws, twenty-four thousand points.
pointlaw · the figure as a single formula
BLOOM · n = 12,500 · THE CAPTION IS THE SOURCE
Loading source…
STANDING SEA · n = 11,520 · THE CAPTION IS THE SOURCE
Loading source…

SURFACELAW · THE ATLAS IN INK

zero dependencies · implicit surfaces F(x,y,z)=0 as tumbling ink point clouds — Newton-projected seeds, depth as color, equation typeset above, field printed below

fig. 0.1.8 · the atlas in ink.
surfacelaw · the atlas in ink
TANGLECUBE QUARTIC · n = 8,000 · THE CAPTION IS THE SOURCE
Loading source…
BARTH SEXTIC · n = 8,000 · THE CAPTION IS THE SOURCE
Loading source…

THREE.JS MARCHING CUBES · THE ATLAS IN PLASTER

three 0.185 (lazy-loaded) · the same Tanglecube field extracted as a real mesh at 72³ and lit as a museum cast — white room, matte plaster, drag to orbit

fig. 0.1.9 · the atlas in plaster.
three.js marching cubes · the atlas in plaster

Loading mesh…

D3 · THE TOYBOX, CHARTED BY THE TOYBOX

d3 7 (force, hierarchy, drag) charting the lab itself · gsap pens the links, rough-notation circles the verdict · sizes measured on disk 2026-07-28

fig. 0.1.10 · the toybox, charted by the toybox.
d3 · the toybox, charted by the toybox
WHO COMPOSES WITH WHOM · DRAG ANYTHING
WHAT EACH TOY WEIGHS · node_modules, 2026-07-28

Dev weight, not shipped bytes — every heavy library is lazy-loaded by exactly one page. Still, the treemap keeps the score honest: the two primitives this lab actually produced, PointLaw and SurfaceLaw, weigh 0 MB — they are not in the treemap because there is nothing to measure.

TUNABLELAW · THE READER EDITS THE EQUATION

zero dependencies · the sea's governing constants are live in the printed source — drag the blue numbers and the law re-renders the same frame

fig. 0.1.11 · the sea, with its constants live.
tunablelaw · the reader edits the equation
STANDING SEA (TUNABLE) · n = 11,520 · THE CAPTION IS THE SOURCE
(i, t) => {
  const x0 = (i % 144) / 143, y0 = floor(i / 144) / 79;
  const h = sin(t * 0.9 + x0 * 9.0 + 2 * sin(t * 0.5 + y0 * 5)) * sin(t * 0.6 + y0 * 7 + x0 * 3);
  const persp = 0.25 + 0.75 * y0;
  return [260 + (x0 - 0.5) * 470 * persp, 150 + y0 * 300 - h * 34 * persp, 0.5 + 0.5 * tanh(1.4 * h)];
}
THE BLUE CONSTANTS ARE LIVE · DRAG THEM

FIGREF · PROSE THAT POINTS AT THE FIGURE

zero dependencies · hover the dotted terms and fig 1.1.2 emphasizes what the sentence names — a module-global highlight channel, no context provider

fig. 0.1.12 · prose that points at the figure.
figref · prose that points at the figure

Of the twelve ships that left Troy, only the flagship survives the Laestrygonian ambush — moored warily outside the closed harbour while eleven crews are speared like fish. And of the flagship’s own crew, one man outlasts the seven years on Ogygia that swallow most of the voyage’s decade.

TROY · 600 MENCICONES −72 · BK 9MALEA · BLOWN SOUTHLOTUS-EATERS · BK 9CYCLOPS −6AEOLIA · BAG OF WINDS · BK 10ITHACA IN SIGHT · BLOWN BACKLAESTRYGONIANS −484 · 11 SHIPS · BK 10CIRCE · ONE YEAR −1 · BK 10SIRENS · BK 12SCYLLA −6 · BK 12THRINACIA −30 · BK 12OGYGIA · CALYPSO · SEVEN YEARS · BK 5SCHERIA · BK 6–12ITHACA · 1 MAN · YEAR 10MEN600LOST 0 · 0.0%SHIPS 12YEARS FROM TROY0510CIRCE · 1 YRCALYPSO · 7 YRS

DRAWGUESS + CALLOUT · THE READER'S WAGER

zero dependencies · NYT's You-Draw-It on the house sheet: sketch the crew's decline, the truth draws over your line, the annotation layer marks the two decisive moments

fig. 0.1.13 · the reader’s wager against Homer.
drawguess + callout · the reader's wager

600 men leave Troy with Odysseus; one arrives home ten years later. Draw how you think the crew declined — then see what Homer actually did.

00530010600YEARS FROM TROYMENDRAW THE CREW OVER TEN YEARS · DRAW LEFT TO RIGHT

source: Odyssey body counts · fig 1.1.2 data

UNITREGROUP · 600 MEN, RE-MUSTERED

zero dependencies · one dot per man in the voyage's leg colors; regroup BY SHIP ⇄ BY FATE with object constancy — the dots walk, the chart is never swapped

fig. 0.1.14 · six hundred men, re-mustered.
unitregroup · 600 men, re-mustered
SHIP 01 · 50SHIP 02 · 50SHIP 03 · 50SHIP 04 · 50SHIP 05 · 50SHIP 06 · 50SHIP 07 · 50SHIP 08 · 50SHIP 09 · 50SHIP 10 · 50SHIP 11 · 50SHIP 12 · 50

source: Odyssey body counts · fig 1.1.2 ship accounting

THE 3D CITY · TWO RUNGS

maplibre pitched over OpenFreeMap extrusions (keyless, live now) · Google photoreal Tile3DLayer wired behind an env key · synthetic localization frustums after Sidhu — drag to orbit downtown Austin

fig. 0.1.15 · the city in three dimensions.
the 3d city · two rungs

KEYLESS RUNG: OPENFREEMAP OSM EXTRUSIONS · the photoreal Tile3DLayer is wired and lights up when NEXT_PUBLIC_GOOGLE_3DTILES_KEY exists · FRUSTUM POSES ARE SYNTHETIC — THE GENRE, NOT THE PIPELINE (AFTER B. SIDHU'S AUSTIN GEOLOCATION TEST)

CUBE STUDIES · ONE MOTIF, SIX LAWS

zero dependencies · the Fuhrer discipline in house ink: six PointLaw treatments of the same tumbling cube — wireframe, lattice, scanlines, dissolve, beads, and the cube dreaming of the sphere

fig. 0.1.16 · one cube, six laws.
cube studies · one motif, six laws
CUBE · 6 STUDIES · 2026 — SAME MOTIF, SAME TUMBLE, DIFFERENT LAW
STUDY 1 · WIREFRAME · n = 1,440 · THE CAPTION IS THE SOURCE
Loading source…
STUDY 2 · LATTICE · n = 2,197 · THE CAPTION IS THE SOURCE
Loading source…
STUDY 3 · SCANLINES · n = 7,680 · THE CAPTION IS THE SOURCE
Loading source…
STUDY 4 · DISSOLVE · n = 6,000 · THE CAPTION IS THE SOURCE
Loading source…
STUDY 5 · BEADS · n = 5,940 · THE CAPTION IS THE SOURCE
Loading source…
STUDY 6 · THE CUBE DREAMS OF THE SPHERE · n = 7,000 · THE CAPTION IS THE SOURCE
Loading source…

USETIMELINE · SCRUB, PLAY, AND A SHAREABLE CURSOR

the timeline primitive on trial: rAF playback, step and scrub, reduced-motion safe — and the cursor mirrors into the query string, so a moment is a link

fig. 0.1.17 · the timeline and the shareable cursor, on trial.
usetimeline · scrub, play, and a shareable cursor

line 0 / 12,107 · book 1 · 0 dawns · 0 dead

the cursor lives in the url — copy the address bar to share this exact moment

source: homerStats.data.ts (trial data) · useTimeline + useFigUrlState

SHEETMULTIPLES · N PANELS, ONE SCALE

small multiples with a shared y-domain: both poems' books on one honest scale — the iliad's are longer, and no number needs reading

fig. 0.1.18 · small multiples on one honest scale, on trial.
sheetmultiples · n panels, one scale

the odyssey · 12,107 lines

0227455682909159131721BOOKLINES

Use the left and right arrow keys to read points. Escape clears the selection.

View chart data

the iliad · 15,687 lines

0227455682909159131721BOOKLINES

Use the left and right arrow keys to read points. Escape clears the selection.

View chart data

source: homerStats.data.ts (trial data) · SheetMultiples

REFERENCE — THE D3 GALLERY, ON CALL

all 173 notebooks from @d3/gallery, catalogued locally and runnable in place via @observablehq/runtime

Browse the gallery →

REFERENCE — THE SUBDIVISION ATLAS

boundary basis for anywhere at any level: world + US states/counties installed, German Kreise + Chinese counties compiled, and a geoBoundaries pipeline for every other country (ADM0–ADM5) · plus the source registry

Open the atlas →

FIGURE — THE ACT–CHECK WEAVE

the instrument that watched this lab being made: every touch, check, and prompt of the session, timestamped — after the Poet Engineer's TD Field Observer

See the weave →