A full-stack live fitness training platform connecting certified personal trainers with clients through real-time video streaming. Web app on Next.js 14, native Android via React Native + Expo, and LiveKit WebRTC for full-HD broadcast — all wired through Supabase for auth, data, realtime, and storage.
Trainers get a complete operating system on the web — track followers, sessions hosted, participants and ratings, review recent sessions, set their realtime status (Available, Live, Busy, Rest Day, Offline), schedule classes, and go live with one click. Status updates propagate instantly through Supabase channels.

The public site is where clients discover FitLive — connect with elite trainers for real-time workout sessions, join live classes, and track progress. Built with Next.js 14 and Supabase, with live trainer counts and session stats pulled straight from the database.

The native mobile app puts the trainer's world on their phone — go live in seconds, track followers, sessions and rating at a glance, set realtime availability, manage clients, and review recent sessions. Built with React Native and Expo, sharing the same Supabase backend as the web app.

Most live fitness platforms assume a US-grade home internet connection. FitLive ships to a market where mobile data is unreliable and broadcast latency really matters — a trainer's cue needs to land before the rep is over.
We needed full-HD WebRTC video with adaptive quality, realtime trainer status that doesn't poll the database every second, and a two-sided product that works on web for trainers (who often broadcast from a laptop) and Android for clients (who follow along on a phone).
Next.js 14 powers the web app and trainer dashboard. React Native with Expo handles the Android client. Both talk to the same Supabase backend — auth, profiles, sessions, follower graph, ratings, and a wallet/credits ledger ready for billing integration. LiveKit handles the WebRTC layer with adaptive bitrate, so streams degrade gracefully instead of dropping.
The status system is the unsung hero. Five states (Available, Live, Busy, Rest Day, Offline) propagate through Supabase Realtime channels so a client browsing trainers sees updates the instant they change — no refresh, no polling. When a trainer hits "Go Live," followers get a push notification within seconds.