Shipped productLive on the App Store
FitTrack+
Built and shipped a native SwiftUI fitness app with Apple Watch workout flows, backed by a Java/Spring Boot/MySQL API and a Next.js client.
2,000+ App Store downloads200+ active usersSelf-reported, as of October 2026
- Who it helps
- People who train with weights and want quick set logging, programs and progress history from their iPhone or Apple Watch.
- What I owned
- The whole product: interface design, the SwiftUI iPhone, Apple Watch and widget targets, the Spring Boot API and MySQL data model, the Next.js web client, and App Store releases.
- When
- Released December 2025 · version 3.5.7, October 2026
- History
- The mobile client started in React Native; the current iPhone and Apple Watch apps are native SwiftUI.
- Checked
- App Store listing checked October 26, 2026: seller Belal Embaby, first release December 9, 2025, version 3.5.7 released October 23, 2026.

Training home: today's program and saved splits. 
After a workout: the muscles each completed set worked. 
Between sets: the rest timer starts automatically. 
Progress: weight, volume and strength trends.
Screenshots from the public App Store listing.
Tech stack
- Apple apps
- Swift
- SwiftUI
- watchOS
- HealthKit
- WatchConnectivity
- WidgetKit and Live Activities
- Back end
- Java 17
- Spring Boot
- Spring Security
- JPA
- Data
- MySQL
- Web
- Next.js
- TypeScript
- Delivery
- Docker
- Railway
- GitHub Actions
- App Store releases
The problem
A strength workout can start on the iPhone or the Apple Watch, and both devices need to show the same session (the sets, the rest timer, the current exercise) even when the watch drops out of range. Early versions only listened for watch messages while the workout screen was open, so watch actions could be lost and offline updates could overwrite each other.
My scope
I designed and built every surface: the SwiftUI iPhone app, the watchOS app, widgets and Live Activities, the Spring Boot API with its MySQL schema, and the Next.js web client. I also run the App Store releases.
Constraints
- WatchConnectivity only delivers live messages while the watch is reachable; its offline channel keeps just the latest payload.
- A finished workout must be saved exactly once, even if the request is retried or sent later from an offline queue.
- One account has to work across iPhone, Apple Watch and the web, against a single API.
Approach
- The iPhone owns logged data (sets, reps, completion, position) and the watch owns live metrics (heart rate, calories), so the two devices never write to the same field.
- One workout engine on the phone, alive for the whole session, is the only place session state changes. Each change bumps a version and sends a full snapshot to the watch, which replaces its state and ignores anything older.
- Watch actions such as logging a set, skipping rest or ending the workout go back through that same engine, so a repeated tap is harmless and the next snapshot confirms it.
- When the watch wakes or reconnects, it asks for the current snapshot, so an interrupted session restores instead of drifting.
- The web client calls the API through a same-origin /backend proxy, which keeps authentication cookies first-party.
Architecture
Text description of the diagram
- iPhone app → Apple Watch app: Versioned session snapshots.
- Apple Watch app → iPhone app: Set actions + live metrics.
- iPhone app → Spring Boot API: HTTPS · idempotency-keyed workout logs, offline replay.
- Next.js web client → Spring Boot API: Proxied HTTPS, first-party cookies.
- Spring Boot API → MySQL: Reads and writes.
Key decision
Full snapshots for live state, idempotency keys for finished workouts
Sending individual events looked lighter, but because the offline channel keeps only the newest payload, back-to-back events could erase each other. A versioned full snapshot makes “latest wins” correct: a missed update is simply superseded. Finished workouts need the opposite guarantee, so each one is frozen once with an idempotency key and replayed byte-for-byte on retry or from the offline queue, letting the server recognize a duplicate instead of saving it twice.
Validation
- iOS unit tests cover watch snapshot reconciliation and offline-queue replay of finished workouts.
- API endpoints check authorization with Spring Security method-level rules; the backend has its own test suite.
- GitHub Actions runs separate native, backend and web checks for the paths a change touches.
Result
FitTrack+ has been on the App Store since December 2025 and reached version 3.5.7 on October 23, 2026, with an Apple Watch app alongside the iPhone and iPad app. It has reached 2,000+ App Store downloads and 200+ active users (my own figures as of October 2026). The web client runs at fitstrack.com.
Limitations
- The download and active-user figures are my own, as of October 2026. There's no public analytics page to link to.
- Recovery and readiness views are informational. FitTrack+ doesn't give medical advice.
- The API enforces authorization, but it hasn't had an independent security audit.
- This write-up covers the native apps and the API. The web client is linked but not covered here.