AthletIQ
White-label sports-academy platform — web + mobile on one multi-tenant backend.
The problem
Sports academies run on spreadsheets and WhatsApp. AthletIQ replaces that with a white-label platform that manages programs, skill rubrics, attendance, and finance for five sports out of the box — Football, Swimming, Karate, Tennis, Gymnastics — across multiple branches, five staff roles, and parent/player/coach personas.
It ships fully bilingual English/Arabic with true right-to-left layouts on both web and mobile, and supports six currencies, one per academy.
One backend, two surfaces
The web app (Next.js 15 App Router) and the mobile app (Flutter with Riverpod) share a single Supabase backend through a config-switched repository layer. With no environment variables set, the entire product runs on typed mock fixtures — every screen, every persona. Flip the env vars and the same screens run against live, RLS-protected data.
That one decision makes the platform demoable with zero setup and testable without touching production data.
Tenancy enforced in the database
Multi-tenancy isn't an application-code convention here — it's enforced by Postgres row-level security on every tenant table via org_id. A platform tier above the academies lets super-admins suspend or activate an academy for a period, and that suspension is enforced in RLS too, not in the app.
Tenant provisioning and staff invites run through database RPCs, with snapshot-sync triggers keeping derived views consistent.




Outcome
Eighteen web views, all mobile personas, real auth with OTP and OAuth, and a one-command dev environment that brings up Postgres, backend, web, and mobile with seeded demo data. Payments, livestream, and QR check-in are deliberately scoped out for a later phase.



Built with
Every technology this project runs on, and the job it does here. Each one links to the other projects it appears in.