5 pm CET/ 10 am CST
CEO at Leobit
Oleksa Stelmakh
Live Webinar "AI-Native SDLC: 10x Faster, with Even Higher Quality"
Contact us

Interactive cycling platform

On-premises to cloud migration, enabling the SportsTech company to scale its user base by more than 15x

ABOUT the project

Client:
SportsTech Company
Location:
Country flag

Norway

| City flag

USA

Company Size:
150+ Employees

Technologies:

.NET Core

ASP.NET Core

Angular

Azure

Leobit rebuilt a SportsTech client’s legacy Windows desktop application and on-premises admin portal into a cloud-native platform, migrating all calculations to the cloud, replacing hardware-intensive on-premises installations with browser access, and running the old and new systems in parallel until the migration was complete.

Having a team of experienced software developers has been just absolutely essential to the success of our projects. I’ve been working with Leobit for the past three years, and I can’t imagine doing it any other way. I can always rely on them to get the job done, and I always know that I’m going to get quality work.

Cameron C.

Director of Product, SportsTech Company

Interactive cycling

Customer

The client operates a SportsTech ecosystem for indoor and outdoor cycling. It combines web resources for clubs and instructors, member accounts with training histories and community features, and in-studio software and hardware built on precise power measurement and ANT+ connectivity.

Business Challenge

The original system had two aging components: an on-premises admin portal built on .NET Framework and ASP.NET MVC, and a Windows-only desktop application built on .NET Framework and WPF. Both worked, but communication between them was limited and inefficient: the desktop application could call the admin portal, but the admin portal could not communicate back. The setup was further complicated by WASP devices, which could send data only to the desktop application. As a result, the desktop app had to collect this data locally and then re-send it to the admin portal.

The technology stack was dated, and the delivery process was difficult to maintain. Every new software version had to be installed separately on each machine, which made releases slow and painful. Onboarding a new club also required powerful hardware to be purchased, shipped, installed on site, and configured manually, creating a major barrier to scaling the system.

Why Leobit

The client chose Leobit for its in-depth experience in migration and modernization, and for the confidence that Leobit could rebuild the platform rather than only keep the existing one running. Reengineering and modernization of legacy systems are among Leobit’s core services, so the team knew how to sequence a legacy-to-cloud rebuild and where the risks lie in such a rebuild. Deep .NET expertise meant the team could carry the platform from .NET Framework and WPF to .NET Core and Angular. And with SportsTech being one of Leobit’s key industries, the team already understood the domain, from club and instructor workflows to the ANT+ and power-measurement hardware the platform depends on.

Project
in detail

Leobit reengineered the customer’s portal into a cloud-native platform with a .NET Core back end and an Angular front end, enabling a single administrator to manage every club from the cloud and for members to access the app from a browser, phone, or tablet.

Project in detail

Our team rewrote the application from scratch to replace the old one. The previous setup was a WPF desktop application running on a Windows machine. We built a .NET back end in the cloud and an Angular front end, and moved all calculations to the cloud. This gave the client central control and resolved the networking and distribution problems that came with per-club hardware.

Our developers used SignalR for communication and channel switching. It selects the most suitable channel supported by the browser, so real-time features work across the devices that members and instructors actually use.

In the club, members could pick up heart rate sensors, and the data was collected through a bridge that previously worked over a local network. Our team changed the setup so that WASP data is sent to our server instead, moving sensor data off the local network and into the cloud path with the rest of the system.

The database was part of the admin panel and was hosted on a machine bought from a hosting provider. Our team moved this data to virtual machines in the cloud, making the system cloud-native. To keep the existing system working during the move, our developers created compatible endpoints so the old platform could keep running against the migrated data.

For a period, the old and new applications ran at the same time. Our team rewrote new capabilities as separate modules and used those same modules inside the old application. We built integrations that let users move from the old platform to the new one, connecting the two systems at defined transition points so no club was cut off mid-migration.

Interactive cycling
Building service-oriented architecture

Building service-oriented architecture

The rebuilt platform followed a service-oriented architecture, which is what made a gradual migration possible in the first place. Instead of replacing the old system in a single cutover, our team split functionality into discrete services, each with a clear part of the platform. New features were built as services in the cloud, and the same services could be called from the old application, so a capability only had to be written once.

During the transition, some functionality still existed only in the legacy system. To avoid disrupting users, the old and new systems continued running side by side, with users retaining access to legacy features until their cloud-based replacements were ready. This decoupled architecture allowed both platforms to share modules and move users across known transition points, rather than forcing the business into a risky one-time migration.

Cloud migration: from a single VM to Azure

Cloud migration: from a single VM to Azure

Initially, the project was hosted on a virtual machine using Internet Information Services (IIS). Our team orchestrated a migration to Azure infrastructure, with Azure DevOps handling comprehensive management. We also established two distinct services, the Cloud and the Studio, to handle different parts of the project. As part of the move, we established distinct services, the Cloud and the Studio, so the parts of the platform aimed at central management and the parts aimed at the in-club experience could be built, deployed, and scaled on their own instead of moving as one block.

The move to Azure also changed how the team handled configuration and data. Instead of keeping settings on the server next to the application, our team introduced a dedicated way to store settings and other sensitive data securely, separated from the code that used them. This separation made the deployment pipeline safer to automate and helped streamline onboarding for new locations.

Our team also configured CI/CD in Azure DevOps. Builds and releases became defined pipelines, so changes could move from commit to deployment through a repeatable process rather than a manual one. This directly addressed one of the biggest limitations of the old WPF application: updates no longer required software to be installed separately on every machine. After the migration, each location automatically received the latest version once it was deployed to the server, while users accessed it through the browser.

After migration, we remove the burden of managing version compatibility between desktop and server components, so any feature can be pushed to the test environment independently. We also built a dedicated module for hardware-related testing that emulated the bike’s activities, heart rate sensors, and other dependencies across multiple configurations. As a result, QA no longer had to wait on a shared server or a full release to check their work. They could deploy the specific components relevant to their tasks on their own and test them in isolation, which shortened the loop between building a change and confirming it worked.

Second stage migration: microservices, Linux, and Docker

Second stage migration: microservices, Linux, and Docker

Once the platform was running on Azure, the next question was how to keep adding capability without making the core project heavier. As the platform evolved, our team prioritized building new capabilities as microservices over expanding the core project. Each new piece of functionality became its own service with a clear boundary, rather than another addition to a growing central codebase. This kept the system’s parts independent, so one service could be changed or scaled without affecting the others.

To support that model, our team moved to Linux-based machines and adopted containerization with Docker. Packaging each service in a container gave every service a consistent and predictable environment from development through to production, while also allowing the team to run services more efficiently on the underlying infrastructure.

This was not the first step away from the original Windows setup. In the first phase of migration, the platform had already moved from a Windows VM to Azure managed services, which also run on Linux-based infrastructure behind the scenes. The Docker phase built on that progress by giving the team more control over service packaging, deployment, and runtime consistency, while keeping the platform on a lighter and more scalable foundation than the original Windows-hosted admin system.

This was the second stage of the migration. The first stage moved the platform away from a single server and onto a straightforward Azure cloud setup. The second stage went further, from that initial cloud setup to Docker and a container-based infrastructure capable of hosting a growing number of independent services.

The Journey
Behind Our Success

Phase 1
Phase 2
Phase 3
Phase 4
Phase 5
Phase 6
Phase 7

Legacy platform assessment and modernization strategy

Cloud-native platform foundation

Real-time communication modernization

Connected hardware integration

Cloud database migration

Gradual legacy-to-cloud transition

Azure infrastructure modernization

Technology Solutions

  • Rebuilt the legacy WPF desktop application as a cloud application with a .NET Core back end and an Angular front end.
  • Moved all calculations to the cloud to centralize control and resolve networking and distribution issues.
  • Used SignalR to select the most suitable communication channel supported by the browser.
  • Migrated the database from a hosting provider machine to cloud virtual machines with compatible endpoints for backward compatibility.
  • Redirected Bluetooth heart rate sensor data through WASP to the server instead of a local-network bridge.
  • Migrated infrastructure from a single IIS virtual machine to Azure, with Azure DevOps managing CI/CD pipelines and a dedicated test environment.
  • Adopted microservices, Linux-based machines, and Docker containerization in the second migration stage

Value Delivered

  • Freed platform growth from hardware logistics by removing the requirement to ship and install powerful hardware at every new club.
  • Gave the client a single point of control over all clubs by moving management into the cloud and the application into the browser.
  • Made the platform reachable from phones and tablets, not only Windows machines.
  • Kept every existing club running during the migration by operating the old and new systems in parallel with integrated transition points.
  • Growing the number of end users by more than 15 times, from 20K to 350K.