Londology A curious atlas of London

Data

Every number on this page is invented

A sample piece that exercises every component in the design system, built from a formula rather than from data, so that nothing here can be mistaken for a finding about London.

Published · Data as of

This page exists to prove that the design system works, and to prove it on a page rather than in a description. It uses every component the system has: two figures, three confidence marks, a map that costs nothing until you ask for it, and the block that closes every analysis.

Every value below comes from a formula in pipeline/design-system-sample/fetch.py, not from a measurement.

Fact

The reason for that is not laziness. This repository sells itself on verifiability, and a plausible-looking number about London sitting in a sample file is a small time bomb: someone quotes it, and the site’s one real asset is gone. Synthetic data cannot be misquoted, because it says what it is.

Three synthetic series, twelve months Named after boroughs so the chart has plausible labels. It measures nothing.

Three invented series over 2026, each rising to a peak in a different month and falling back, with Hackney highest throughout.

The numbers behind this figure
Month Camden Southwark Hackney
2026-01 24.4 28 36.4
2026-02 31 30.4 34
2026-03 40 37 36.4
2026-04 49 46 43
2026-05 55.6 55 52
2026-06 58 61.6 61
2026-07 55.6 64 67.6
2026-08 49 61.6 70
2026-09 40 55 67.6
2026-10 31 46 61
2026-11 24.4 37 52
2026-12 22 30.4 43

Source: Synthetic borough readings (CC0-1.0) — full attribution

Three things in that figure are contractual rather than decorative. The lines are labelled where they end, so the reader never has to match a colour to a key — colour is a second channel here, never the only one. The alt text describes what the chart shows rather than what kind of chart it is. And the numbers are underneath it, in a table, without a download.

A direct label beats a legend on almost every chart this site will publish, because it removes the step where a reader has to hold a colour in their head.

Interpretation

A second figure, a second licence

The figure below draws on a different source, under a different licence. That is the point of it: the attribution block at the end of the page groups sources by licence, and a stack that has only ever been tested with one licence has not been tested at all.

A single invented series One source, one licence, so the source line below names only one.

An invented river level rising from 2.4 metres in January to a peak near 3.3 metres in July, then falling back by December.

The numbers behind this figure
Month Level (m)
2026-01 2.40
2026-02 2.63
2026-03 2.85
2026-04 3.04
2026-05 3.18
2026-06 3.27
2026-07 3.30
2026-08 3.27
2026-09 3.18
2026-10 3.04
2026-11 2.85
2026-12 2.63

Source: Synthetic river gauge series (CC-BY-4.0) — full attribution

A map that costs nothing until you ask

Maps load on intent. Before the button below is pressed, this page has fetched no map library, no tiles and no geometry — what it has is a preview image and the finding written out in words, which is what a screen reader and a search engine get too. Pressing the button is the only thing that spends a reader’s bandwidth, and it is their decision.

The interactive shell, with nothing real inside it A demonstration of the loading contract. The real map arrives with the phone-theft piece.
A placeholder standing in for an interactive map, which loads only after the reader asks for it.

What this map shows

  • Nothing here is a map of anything: the module draws a panel saying so.
  • The contract it proves is the one that matters — zero bytes of map code until a click, and a readable alternative for everyone who never clicks.

Loading a map on intent will cost less reader patience than loading one automatically, even though it takes an extra tap.

Hypothesis Test: Whether the phone-theft map in WP-06 loads inside two seconds on a mid-range Android over a real mobile connection.

Behind the data

Method. Two files are generated by a formula in fetch.py — three offset sine curves for the first figure, one for the second — written to data-cache/, checksummed into the manifest, and turned into JSON by transform.py. Running the pipeline twice produces byte-identical output, which is the property that makes just data <slug> a check rather than a hope.

Caveats. There is only one, and it is the whole point: none of these numbers measures anything. The borough names are labels, not subjects. Do not quote a single figure from this page.

What would change my mind. Nothing about London — there is no claim here to overturn. What would change the design: a real piece whose figures need something this shell cannot express, which is exactly what the first three pieces are for.

Sources

  • Synthetic borough readings — Londology. CC0-1.0. Retrieved . Not a measurement of anything. Generated by fetch.py from a fixed formula so that a re-run produces the same checksum, and named after real boroughs only so the chart has plausible labels.
  • Synthetic river gauge series — Londology. CC-BY-4.0. Retrieved . The second licence is the point: it proves the attribution stack keeps two differently licensed sources apart instead of merging them into one line.

Attribution

  • CC0-1.0 Synthetic borough readings Synthetic sample data by Londology, dedicated to the public domain under CC0 1.0.
  • CC-BY-4.0 Synthetic river gauge series Synthetic sample series by Londology, licensed under CC BY 4.0.

Data as of . Last fetched . Pipeline code is available on request.