LiveOL: A 10-year retrospective
LiveOL is an app that leverages the live result API to display real-time results for orienteering competitions. As it approaches its tenth anniversary, this is a technical retrospective on its journey, highlighting key milestones and lessons learned. The name LiveOL comes from "Live" (self explanatory), and "OL" which in Swedish is "Orienteringslöpning" which means "Orienteering running" - kind of.

The Early Days (2015–2018)
The project began on May 9, 2015, during my second year of high school. I had just started coding for mobile devices using PhoneGap (Cordova), which allowed me to build apps with HTML, CSS, and JavaScript. At the time, jQuery was still popular so I used that. While the app wasn’t native, it worked by embedding web views into a downloadable app.
The screenshots for the final PhoneGap app. Looking back I kind of like the old design!
To handle the live result API, I set up a simple PHP cache server on a DigitalOcean VPS, the cache script was found by just googling "php cache api request script" or something like that. It cached JSON responses from the official API, which was often unreliable due to broken JSON, user input errors, and overload issues. Despite my at the time limited coding skills, I managed to create a functional app, though it was bare-bones and lacked polish.
Transition to React Native (2018)
In 2018, I rewrote the app using React Native, a skill I picked up at my first job after high school. I replaced the PHP cache with a "JSON-P proxy" hosted on Heroku (I realize now that using specifically a "JSON-P" proxy did nothing for my use-case). I also introduced TypeScript for better maintainability, since it was the latest and greatest thing in the JS echo system (and still is!). The app became more robust, though it relied on class-based React components, which, while effective, had their limitations and pitfalls. I really liked those old class-based components though!
Expo and Modernization (2019)
To streamline development, I integrated Expo in 2019. It was an attempt to reduce build-related issues and package incompatibility, but with limited success. I also migrated some class-components to stateless functional components, a significant step toward modern React practices. I also added internationalization (i18n), translating the app into English and Swedish, and later into other European languages like Serbian, Norwegian, German, and Spanish. I had the help of several wonderful orienteers (is that the plural of orienteer?) from many different countries ❤️
Scaling and Refactoring (2020-2022)
In 2020, I left my job and could dedicate more time to LiveOL for a couple of months. I introduced Redux, upgraded libraries, and added landscape mode and split controls, a key feature I had overlooked. I also built a custom backend server using NodeJS + Apollo GraphQL and Redis for faster caching. This improved performance and user experience, as the official API could be a bit slow at times.
Monetization and Growth (2023)
By 2023, I decided to monetize the app. After surveying users, I implemented a $10 annual subscription using RevenueCat. That company has grown a ton since, which is fun to see! Paywalled features included sorting results and following runners, clubs, and classes. While the subscriptions currently covers most of the running costs, it remains a hobby project with potential for further growth.
These are the latest screenshots of the app!
Recent Developments (2024–2025)
In 2024, I replaced Apollo GraphQL with tRPC for better performance, though its rapid changes made upgrades challenging. In 2025, I shifted to Node.js with Express, Zod for validation, and OpenAPI for type generation. I’m also planning a new feature to track runners across competitions, which will require integrating a (real) database for the first time in the projects history.
Looking Ahead
LiveOL has carved a niche in the orienteering community, primarily in Sweden. My vision is to expand globally, leveraging the universal use of the live result API. While the journey has been filled with challenges, it’s also been a rewarding learning experience. One thing I need to get better at is still marketing, I think I have a good product, but how do I reach out to more users?
Here’s to the next decade of orienteering live results 🎉