CITY. ← Back to the city

How this city was built.

CITY was designed and coded end-to-end by Claude Fable 5, working autonomously inside Claude Code: no design files, no templates, no image assets. One prompt in, a deployed site out. Here is the whole method, so you can do the same.

01

Start from real work, not lorem ipsum

The material is an actual credit research report — Consumer Credit NPL 2026 (OJK portal data, Jan–Apr 2026), written earlier on the same desk. Fable read the report, extracted every series, table and caveat, and kept the numbers untouched. A data-driven site is only impressive if the data is real.

02

Find the one metaphor the data already contains

Consumer credit is households. Households are a city at night. So the central visual is literal: each lending product is a district, building volume tracks book size, and windows light at the exact rate loans perform — red windows are the NPL ratio. The metaphor does the explaining before a single chart appears.

03

Build the city procedurally in WebGL

One THREE.InstancedMesh holds ~700 buildings. A custom GLSL shader draws the window grid per face: a hash per window cell decides lit / dark / red, with the red probability set to each district's true NPL rate. No textures, no models — the whole city is math, and ships in a single HTML file.

04

Choreograph the camera to the scroll

Ten camera keyframes — one per story section — joined by a Catmull-Rom spline. Scroll position maps to spline position with smoothing, so reading the story flies you between districts: up to a satellite view for the national table, down to street level for Jawa Barat. Mouse parallax and a slow ambient drift keep it alive when you stop.

05

Hand-roll the charts

No chart library. Sparklines, the shrinking-book paradox chart, the ranked province bars, and the Jawa Barat dumbbell are all generated as inline SVG from the data arrays, with stroke-dash draw-on animation triggered by IntersectionObserver. Every mark exists because the report says so.

06

Art direction as a system

Palette: ink #070b12, paper #f3ead8, amber #ffb454 for performing credit, coral #ff5f4a reserved exclusively for non-performing. Type: Fraunces (editorial serif, optical sizing) for voice, Space Grotesk for body, IBM Plex Mono for figures. Film grain, vignette and fog give the render a photographed quality.

07

Iterate like a design reviewer, then ship

The site was served locally, screenshotted in a real browser, and put through three full critique passes — hunting misaligned grids, dead hover states, unreadable contrast, weak transitions — with fixes after each. Then: a tiny Express server (this /guide route is on it), deployed to Railway with a generated domain. Total stack: one HTML file, one server file, zero build step.

The stack, in full

Three.js r160Custom GLSLInstancedMesh Inline SVG chartsIntersectionObserverExpress RailwayGoogle FontsNo frameworksNo build step

Honesty notes