Inspiration
We are currently preparing for HYROX Poznań, and HRX Coach started as an app we wanted for our own training.
Training for a hybrid race is difficult because it asks for several different qualities at once: running endurance, strength, efficient transitions, and the ability to keep working while tired. We found plenty of fixed plans, workout trackers, and individual coaching tools, but not one simple place that connected the whole process. We wanted something that understood our race date, the days we could train, the equipment we actually had, and how previous sessions had gone.
Instead of trying to design the perfect plan on paper, we decided to build the tool ourselves. The central idea was straightforward: the plan should respond to what we actually do, not just what was written on day one. If a workout feels unusually hard, a session is missed, the gym is busy, or a new personal record is logged, the next sessions should take that information into account.
That is how HRX Coach began: as a practical training companion for our own preparation for Poznań. We wanted to open the app, immediately understand today's work, complete it without juggling notes and timers, and know that the plan would keep moving with us.
What it does
During onboarding, HRX Coach asks about the athlete's race, target date, experience, available training days, goal, and equipment. It then creates a short rolling queue of upcoming sessions rather than generating an entire multi-week plan that quickly becomes outdated.
After each completed or skipped workout, the app reviews recent training, reported effort, workout feedback, completed exercise values, and strength personal records. It uses that context to decide what should come next. Athletes can also talk to the coach before a session and ask for practical changes such as making the workout shorter, reducing the load, adding more running, or replacing equipment that is unavailable.
The workout player records what was actually performed set by set. Weight, repetitions, distance, and time can be edited during the session. A standard Bluetooth heart-rate monitor can be connected directly, without a separate vendor account, and the complete heart-rate trace is saved with the workout. Completed sessions can also sync with Strava, while supported activities recorded elsewhere can be imported into training history.
How we built it
HRX Coach is a native iOS app built with SwiftUI. The interface follows an MVVM structure, while SwiftData stores profiles, planned sessions, completed workouts, exercise results, feedback, and heart-rate samples on the device.
The app is offline-first: workout data is saved locally before it is synced to Supabase. This matters in real gyms, where reception is often unreliable. Supabase provides authentication and cloud persistence, while failed syncs remain queued for a later retry.
The adaptive coach uses OpenAI with a strict structured response format. Each generated session must use exercises from the app's catalogue, respect the athlete's available equipment, and return the correct fields for running, strength, stations, cardio, or mobility work. Responses are validated before they can become part of the plan. The coach is also given recent completed sessions and the athlete's best logged lifts, which keeps its suggestions grounded in real training data.
Live heart rate is implemented with CoreBluetooth and the standard Bluetooth Heart Rate Service, so the app can work with common chest straps and armbands without depending on a manufacturer SDK. Strava support is handled through OAuth and dedicated import and export services.
Challenges
The hardest part was making adaptation useful without making it unpredictable. A language model can produce a plausible workout, but plausible is not enough when weights, equipment, recovery, and race-specific station standards are involved. We created a constrained exercise catalogue, a structured schema, and validation rules so an invalid response is rejected instead of silently appearing in an athlete's plan.
Another challenge was keeping the product reliable when the network is not. Starting, editing, and finishing a workout must never depend on a server response. Designing local persistence as the source of truth, then layering cloud sync on top, made the data flow more deliberate but gave the workout experience the reliability it needed.
Heart-rate recording introduced a different set of problems: Bluetooth state changes, reconnecting to a previous device, background delivery, and preserving a clean timeline when a session is edited. Treating heart-rate samples as part of the workout record, rather than as a temporary display, helped keep the implementation consistent.
What we learned
We learned that adaptive training depends as much on boundaries as it does on intelligence. The coach becomes more useful when it has a small, clear exercise vocabulary, reliable workout history, explicit equipment constraints, and honest feedback from the athlete.
We also learned that the simplest screen can require the most careful product decisions. The Today view looks intentionally quiet, but it combines the race countdown, the current training phase, the reason for the session, and the action that matters most: starting the workout.
What's next
Next, we want to deepen the feedback loop with HealthKit and watchOS support, improve long-term progress insights, and use recovery and training trends to make adaptations even more precise. The goal remains the same: keep the plan realistic, keep it moving, and help the athlete arrive at race day prepared.
Log in or sign up for Devpost to join the conversation.