A complete gym management platform spanning three client surfaces — an admin dashboard, a member web app, and a React Native mobile app — backed by Supabase with PostgreSQL, RLS, RPCs, and views. Memberships, access codes, trainers, and notifications, in one accountable system.
Members sign up, pick a plan, and get an access code that unlocks the gym. The mobile app holds their card, plan status, and history; the web app handles richer profile management. Both pull from the same membership_status view in Postgres.

Staff use the admin dashboard to look up members by access code, manage active memberships, generate new codes via the generate_access_code() RPC, and assign trainers. All authorization is enforced at the database with Postgres RLS — not just in the UI.

Ayasumar needed software that worked for three very different users at once: gym members who care about their access code and renewal dates, staff who need to look up anyone in seconds, and the owner who needs real revenue visibility without becoming a data analyst.
Plan logic — eight tiers ranging from a single-day pass to a one-year membership — had to thread cleanly through every layer of the stack, from the Postgres enum down to mobile UI components, without diverging.
The database is the source of truth — not the app. A membership_status view encapsulates the rules for what makes a membership active; the generate_access_code() RPC handles creation atomically; RLS policies enforce who can read what. All three client surfaces read from the same shape, so a change to the model propagates everywhere at once.
Mobile distribution uses a hybrid pipeline: JS-only changes ship over-the-air via eas update --branch production in seconds. Native or config changes go through a signed APK patch workflow (bundle → patch → zipalign → apksigner) with a locally stored keystore.