Case study
Growing a free workout app into a multi-tenant platform for trainers and gyms
Grew Your Whey Fitness from a free workout tracker with no ads into a platform for trainers and gyms, while personal records stay on the phone.
-
Situation
Your Whey Fitness started as the fitness app I wanted to use myself as a former fitness competitor: a .NET MAUI app for iOS and Android with no ads, no account needed, and every record in SQLite on the phone. It grew into a platform for trainers and gyms, with Teams, Locations, classes, waivers, and a business workspace on the web.
-
Constraints
The personal app had to stay what it was: free, offline, and private, with every personal training tool included. Business features needed a real online identity and a connection, yet joining a trainer's Team could not upload anyone's history, and a paid plan could not become a way to see someone's training.
-
Decision
Keep the local account and the online account separate. Personal records stay in SQLite on the device. An optional Shared Account connects to a separate ASP.NET Core service that holds business and account records, each inside an organization boundary, never the local training history. Organizations, Teams, and Locations each carry explicit roles, and a Team sees training only when a member shares one specific item.
-
Tradeoff
Adding Teams and Locations meant one member's data could belong to a gym, a trainer, and the member at once, so permissions and data ownership had to be redesigned without breaking the free personal app. Keeping personal records on the phone has a cost: Teams and Locations need a Shared Account and a connection, there is no automatic cloud sync, and a trainer sees only what a client chooses to share.
-
Outcome
Your Whey Fitness is live on the App Store and Google Play. Personal tracking still needs no sign-up and shows no ads, and every personal training tool is free; Premium Backup is the one optional extra, and the paid plans are business tools for trainers and gyms. Trainers share programs, schedules, and notices with a Team, gyms run classes, reservations, waivers, and attendance, and clients use the same free app.
-
Retrospective
Separating the local account from the online one is what let a business platform grow beside the free app instead of inside it. Roles, membership, and payment never grant access to training data, which keeps every new business feature a narrower question. Cross-tenant tests are required for every shared endpoint.
Detail
The phone app and the business platform share one product but not one trust boundary. Workouts, Sessions, and History live in SQLite on the phone, so personal tracking works without an account or a connection. The Shared Account service, the business workspace, and the website are ASP.NET Core apps on .NET 10, and none of them receives a member’s history by default: a member can share one workout or Session summary with a Team, while raw sets, body data, and notes stay on the device.
Diagram as text
Parts
- On the phone
- SQLite on the phone: Workouts, Sessions, History
- Phone app: .NET MAUI, no account needed
- Online
- Team: sees only what a member shares
- Shared Account service: ASP.NET Core; business and account records
- Business workspace: on the web
Connections
- Phone app to SQLite on the phone
- Phone app to Team (one shared item)
- Phone app to Shared Account service (optional)

Authorization checks the caller’s role in the exact organization, Team, or Location a request names, and denies anything it does not recognize. The app itself starts from the same shared foundation as Adventure Cache, 3DCDesign, and Cache Creature.
Next case study: Running four live mobile apps on one shared foundation