Metro
Metro is a Python tool that turns public transit schedule data into black-background maps of moving trains — coloured lines, correct geography, dots creeping along between stations. Give it a network and a moment in time, and it’ll tell you where every train on the system is right now, interpolated from the timetable down to the fraction of a second.
Yes, much of this has been done before, but I like trains.
I also took an amazing trip to Europe in the northern-hemisphere summer of 2026, and managed to travel on metros in 5 different countries.
How it works
Public transit agencies publish their schedules as GTFS feeds — a standard bundle of CSV files describing routes, stops, trips and stop times. Metro loads a feed, works out which trips are running at a given date and time, and then interpolates: if a train left one station at 08:21:00 and is due at the next at 08:23:30, and it’s currently 08:22:15, it’s roughly halfway along that stretch of track, and gets drawn there.
Do that for every active trip on a network and you get a live-looking snapshot, built entirely from a timetable and a clock — no live vehicle feed required. For Paris specifically, there’s an optional extra step: the PRIM SIRI Lite API can supply real departure delays, which shift the interpolated positions to match what’s actually happening rather than what was scheduled.
Each network gets its own entry in a networks.yaml registry — a GTFS path, a route-type filter (metro vs. rail vs. ferry vs tram), optional line colours and map bounds. Adding a new city is just a config entry and a downloaded feed, no code changes.
Around the world
Paris

And here’s a photo I took of the most excellent Arts + Metiérs station, very steampunk.

London
Same renderer, wildly different shapes. London’s radial sprawl:

New York
New York’s tangle of express and local services:

Singapore
Singapore’s MRT, mid-morning:

Rome
Rome’s three lines, X-ing at Termini:

Rome has an interesting station - digging out a new station for the new line C, they discovered historical ruins - wells, artifacts, skeletons and so on.

Helsinki

I have a soft spot for this one as the Hakaniemi metro station was featured in Freestyler. This is the station and a metro train, but some 20+ years after the video.

Auckland
And Auckland — home turf, and a rather smaller service to keep the trains company:

Snapshots and animations
metro/snapshot.py renders a single moment as a PNG; metro/snapshot_all.py does every configured network at once, which is how the images above were generated. metro/animate.py steps through an entire 24-hour service day frame by frame and saves it as a GIF or MP4 — watching a whole city’s network wake up, peak, and quiet down again is oddly hypnotic, especially somewhere like Paris with fourteen-odd lines all going at once.
There’s also a small FastAPI backend and React frontend in web/ for serving snapshots straight to a browser — originally built so I could leave a live map running on a spare monitor, per the project’s original brief: black background, thin coloured lines, trains moving in real time (or sped up).
Stack
Python 3.14, partridge for fast GTFS parsing, pandas/numpy for the interpolation, matplotlib for rendering (with an optional contextily basemap overlay), and ffmpeg for MP4 export. Currently configured for Paris, London, New York, Rome, Singapore and Auckland — more networks are just a GTFS download and a YAML entry away.