Skip to content
← All work

Open-source real-time Formula 1 companion

FormulaVision

Live race telemetry — timing, standings and track maps — streamed to an Android app that anyone can fork.

  • Flutter
  • SignalR
  • Express
  • PostgreSQL
  • Docker
Downloads
660+
Lines of Dart
18.8k
Open testing
Play

The problem

Formula 1 publishes a great deal of live data during a session, and almost none of it reaches people in a form they can use. The official app is regional, paywalled in places, and closed. Timing data that exists in real time ends up as a table someone screenshots and posts.

FormulaVision is an unofficial, free and open-source Android app that puts live session data in front of anyone who wants it.

Real-time is the whole problem

A race app is only interesting if it is live. Poll every thirty seconds and you have built a worse version of a results page.

The data arrives over SignalR, Microsoft's real-time transport, which is not where a Flutter app usually finds itself. Getting a Dart client speaking it reliably — through connection drops, session boundaries, and the reconnection behaviour that follows a red flag — was most of the work. A dropped connection mid-session has to recover without the user noticing, because the moment they notice is the moment the app is useless.

On top of that stream the app renders:

  • live timing and sector deltas
  • drivers' and constructors' championship standings
  • the season schedule, parsed from calendar feeds
  • interactive track maps

The backend

I built and run the companion API myself: Express and Sequelize over PostgreSQL, containerised, and shipped to a cloud VM through a GitHub Actions build-and-push pipeline. It handles the aggregation and caching that a mobile client should not be doing on a phone battery during a two-hour race.

Open source, and used

The app is on Google Play in open testing and has passed 660 downloads across public releases. It has a contributor base and its own subreddit, which was not something I planned for and has turned out to be the most useful part — bug reports from people watching a different session in a different timezone find things I never would.

18,800 lines of Dart, MIT-ish in spirit and genuinely forkable: the point of building it as open-source was that a free F1 companion should not depend on me continuing to care about it.

What I would change

The app is Android-only. The Flutter codebase is largely portable, but the release, signing and testing overhead of a second platform is real, and I would rather ship one platform well.

The reconnection logic also grew organically around bugs I hit during live sessions rather than being designed up front. It works, but it is the part of the codebase I would rewrite first — ideally as an explicit state machine, since that is what it has become anyway.