Inspiration

We wanted to build something that measures real reliability in a way people can compare instantly for their daily TfL journies, so we turned each line into an Elo-rated “player” for ease of comparison.

What it does

It tracks train-level events in real time using TfL's API, classifies them as on-time, late, or cancelled, and updates Elo ratings for all 11 Underground lines on a live dashboard.

How we built it

We used TfL APIs for line status, stop points, and arrivals, stored events in SQLite, computed a custom Elo-style score with lateness and cancellation penalties, and built the frontend in Streamlit.

Challenges we ran into

The biggest issues were SQLite lock contention, noisy disappearance of predictions causing false cancellations, and tuning the formula so rankings felt fair and realistic. We also had to harden operations: retries, busy timeouts, safe service restarts, branch/version mismatches during deploy, and Linux permission/service issues while bringing the website fully live. Getting reliable deployment and uptime was the hardest part of the build.

Accomplishments that we're proud of

We delivered a full end-to-end live system with event-level scoring, historical Elo memory, and a clean multi-page dashboard that is demo-ready in a widely available website that can permanently update (with a bit of cleaning up).

What we learned

Real-time transport data is messy, and good outcomes come from strong event logic and operational stability, not just the scoring formula.

What's next for TFL ELO Tracker

Add more cities, potentially include National rail and overground.

Share this project:

Updates