← projectsCronotopo
// project — Cronotopo

Cronotopo

The history of humankind on a globe you can spin.

01// historia

Where and when, on the same screen

When you study history, the map and the timeline usually live apart: one book tells you the year something happened and another shows you where. I wanted to see them together. The globe is space, the line at the bottom is time, and you choose where and when to look.

Hence the name. Cronotopo comes from the Greek chrónos (time) and tópos (place). It starts with the first Homo sapiens at Omo Kibish and goes all the way to the contemporary world without leaving the screen.

3D globe in the era of the first humans, with markers in Ethiopia, South Africa and France

↳ Era 1: Omo Kibish, Blombos Cave and Chauvet joined by arcs over the globe.

02// decision

Every card has to hold up

A history atlas that makes up dates is useless. Each place has five elements, one per category: a landmark, a person, a technology, a cultural expression and an event. Every one has a year, coordinates, a confidence level and a link to its source.

Zod validates all 300 elements on every build: unique ids, years consistent with their era, coordinates in range and https sources. Then I ran the content through an adversarial audit that caught four factual errors and several misplaced coordinates. Dates marked "c." were dropped to medium confidence, even if that makes the content look less sure of itself.

20
eras
60
places
300
sourced elements
Pompeii panel with landmark and person cards, each with a source and confidence level

↳ Pompeii in the Roman era: each card shows its date, its source and how certain it is.

03// arquitectura

Choreography, not loose animations

Motion follows one rule: what matters moves first and most. The camera before the markers, the markers before the arcs, the arcs before the UI. It all comes from a single file with four GSAP timelines (intro, era change, selection and close), and any of them can be interrupted halfway without anything jumping.

When the era changes, a band of light sweeps the globe from pole to pole and the whole interface takes on the color of the period. The 3D scene and the UI only talk through a Zustand store. Three.js and GSAP load separately, so the initial JavaScript went from 363 to 273 KB gzipped.

4
named timelines
≈ 3 s
era change
273 KB
initial JS (gzip)
Roman era view with markers in Rome, Pompeii and Constantinople over the Mediterranean

↳ The camera frames each era based on how spread out its places are.

04// media

Documentaries made only with code

Six cards have a "Watch scene" button. It isn't a video: it's a procedural 3D scene with no downloaded models or textures, and every caption describes what's on screen at that moment. There are scenes on the birth of writing in Uruk, the Great Pyramid, the Parthenon, the Mainz printing press, the Manchester mills and the eruption of Vesuvius.

Each scene's visual state depends only on time: a paused timeline driven by seek and seeded random numbers. That lets you scrub forward, rewind or send someone a link to an exact second, and it always looks the same.

6
scenes
0
downloaded assets
72–88 s each
length
Animated Pompeii scene: the eruption column of Vesuvius seen from Misenum

↳ "The day Pompeii disappeared": the pine-shaped cloud Pliny the Younger described.

05// aprendizaje

Six agents, six scenes

The scenes were built by six Claude agents in parallel, each in its own git worktree. I set the technical contract, the script's facts and the editorial rules, and left them free on shots and pacing. To keep them from colliding, each scene registers its own metadata file and nobody touches shared files.

What I learned: parallelism pays off when the contract is clear from the start. The scenes still need polish, especially the endings, and that's written down in the repo.

Animated Uruk scene: a clay tablet and a reed stylus

↳ "Writing is born": a scribe in Uruk presses a reed stylus into wet clay to record barley and quantities.

06// resultado

Works on a phone and with a keyboard

On desktop a place opens in a side panel and on a phone in a bottom sheet, with no horizontal scroll from 360 px up. Everything works with the keyboard, focus is managed on every transition, and reduced-motion mode swaps the camera flights for fades. State lives in the URL, so any era or place can be shared and the back and forward buttons work.

Fourteen Playwright e2e tests cover the full flow, and a separate harness records the four transitions on video to review them frame by frame.

14/14
e2e tests
360 px
min width
yes
reduced motion
Cronotopo on a phone with the bottom sheet open

↳ On mobile the panel becomes a bottom sheet and the globe is framed above it.

Built with:Next.js 16 (static export), React 19, strict TypeScript, Three.js with React Three Fiber and drei, GSAP, Zustand, Tailwind 4, Framer Motion, Zod, Vitest and Playwright. Built with Claude Code.
next project
Code Arena→

Because a university programming contest should feel like a live arena, not a static form.