A schematic, non-geographic map of London's rail & tube network in the style of the official TfL diagram, with live train positions interpolated from real-time arrival predictions.
The full TfL network: all Underground lines, the Elizabeth line, every London Overground line (Liberty, Lioness, Mildmay, Suffragette, Weaver, Windrush), DLR, Trams and Thameslink — 507 stations and 21 lines.
Station positions come from the official Tube map's own grid references (the A1–F9 cells in the printed index). Each station is anchored inside its real grid cell, then lines are straightened by relaxation and stations nudged apart so nothing overlaps — a schematic, non-geographic diagram that matches the official map's overall shape. Labels reveal progressively as you zoom in.
Live train positions come from the TfL Unified API. Browsers block that call directly (CORS), so this build routes requests through a small proxy (see tfl-proxy-worker.js / the PROXY_BASE setting in app.js). With the proxy set, real trains appear; without it, SIM mode previews the same experience. Lines without a "between stations" location feed (Elizabeth, DLR, Overground, trams) are placed approaching their next predicted stop instead, matched by station name.
TfL doesn't publish GPS positions for tube trains. Positions are inferred from the Arrivals API's text location ("Between X and Y", "At X", "Approaching X") and a countdown timer, then eased smoothly along the schematic line path between polls. Status (approaching / departing / in transit / at platform) is derived from that same interpolated progress, and trains keep moving between the 30-second data refreshes.
Transport for London Unified API (Arrivals), called from your browser. Browsers block that cross-origin call from many origins (CORS), so live trains often won't appear on a standalone copy — the map still works, and SIM mode previews it. For real data, deploy the included tfl-proxy-worker.js (free Cloudflare Worker) and set PROXY_BASE at the top of app.js to its URL. Each line is fetched on its own request, so one renamed line ID can't blank out the others. Thameslink/National Rail isn't TfL-operated so it has no live layer here. Departure boards resolve stop IDs on demand (and learn them from the live feed), so most stations with service show real departures. The diagram is schematic — positions approximate the official map, not real geography.