Saturday 19 September 2026 · 17:40 BST

Arrivals

Ten minutes of a Saturday afternoon on the Underground, a subproject in my live London display project.

00:00

Two windows

Each flare is one train reaching one Zone 1 platform. Nothing is ever shown moving between stations, because the feed does not know where trains are — only where they are going and when they expect to get there.

The point of recording it this way is the comparison. The map never changes. The rate does. Put ten minutes of a quiet Saturday next to ten minutes of a weekday peak, on the same drawing and at the same playback speed, and the difference between the two is the entire content: how often the centre lights up, how long an outer stretch sits dark, where the service thickens first.

Window one · recorded

Saturday, 17:40

Window two · not yet recorded

Weekday, 09:00

The same ten minutes, the same eleven lines, the same map and the same method. Until it exists this page is half an argument.

Where the data comes from

Transport for London publishes live arrival predictions for the whole Underground, free, with no key and no scraping. One endpoint does almost all of the work:

GET https://api.tfl.gov.uk/Line/{line}/Arrivals

It returns one record per train per upcoming stop — a few hundred per line. Each record is twenty-one fields; these are the ones that matter, taken verbatim from the recording:

{
  "vehicleId":       "235",
  "naptanId":        "940GZZLUOXC",
  "stationName":     "Oxford Circus Underground Station",
  "lineId":          "victoria",
  "platformName":    "Southbound - Platform 5",
  "towards":         "Brixton",
  "timeToStation":   13,
  "currentLocation": "At Oxford Circus",
  "timestamp":       "2026-09-19T16:42:05Z",
  "expectedArrival": "2026-09-19T16:42:18Z"
}

Group those records by vehicleId and you have, for each physical train, the ordered list of stops still in front of it with a predicted time against each. Poll every thirty seconds and that list gets shorter. A stop dropping off the front is a train that has arrived somewhere, and that — not a position, not an interpolation — is what every flare on the map above is. A train vanishing from the feed altogether has reached the end of its journey, which is how a terminus arrival shows up.

The station names and line colours are TfL's too, from the route-sequence endpoint. The map itself is not: its geometry is laid out by hand on a 45-degree grid, because the published Tube map is a copyrighted design and because a solver has no opinion about where a line ought to bend.

One number on this page has been altered. Predicted arrival times are published to the whole second and are heavily quantised — 16.6% of them land exactly on a thirty-second boundary, against 3.3% by chance — which is the cadence of TfL's prediction server rather than of the railway. Left alone the board pulses in time with the server, so each arrival is spread deterministically within ±12 seconds, comfortably inside the feed's own revision spread. Everything else is as published.

Powered by TfL Open Data. Station names and line colours are TfL open data; the map geometry is composed from scratch and is not reproduced from the TfL Tube map.