Gyms are some of the worst connectivity environments a mobile app will ever run in. Concrete basements, steel equipment, crowded 5pm wifi — signal drops constantly. A fitness app that pauses to "sync…" mid-set loses the user instantly. UltraFit360 is built offline-first so the workout is always the source of truth, and the network is a background detail.
Local-first writes
Every action a user takes — logging a set, finishing a rep, completing a workout — writes to the device first and returns instantly. Firestore's offline persistence keeps a local cache that the UI reads from, so the app feels fast whether or not there is a connection. When signal returns, the queued writes flush to the server automatically and in order.
Conflict handling
Because a user might log workouts on a phone with no signal and a watch with intermittent signal, writes can arrive out of order. The studio uses last-write-wins on simple fields and server-timestamp ordering on the workout log so the timeline reconstructs correctly once both devices sync. Programme edits — which are higher-stakes — use transactions instead.
What we cache and what we don't
- Active programme + the next few workouts — always cached locally
- The user's recent history — cached for streak and progress views
- Coaching audio — pre-fetched on wifi before the session, never mid-workout
- Leaderboards and social feeds — network-only, they degrade gracefully to a placeholder
