Case study · Technology
SportzOS: a league platform for seven sports, from registration to live scoring
An iOS and Android app, two websites and one Postgres backend that let community organisers run leagues, collect fees, schedule matches, appoint officials, score games ball by ball and publish standings, with players keeping a record across every league they play in.
- Client
- SportzOS (NASportz)
- Industry
- Technology
- Solutions
- Application DevelopmentMobile Development
- Technology
- React NativeExpoNext.jsTypeScriptSupabasePostgreSQLStripeVercel
Challenge
Community sports leagues run on spreadsheets, group chats and goodwill. Registration lives in a form, fees in a payment app, fixtures in a message thread, and the score of last night's cricket match in someone's head. Organisers spend their evenings reconciling all of it, and players have no record of what they played or how they did once the season ends.
The brief was a platform that one person could run a league from a phone with, that handled the awkward parts of real sport (a cricket run-out off a bye, a tennis set decided by advantage rather than tiebreak, a duty team supplying the umpire), and that worked for two brands at once: NASportz, a nonprofit community programme, and SportzOS, the commercial product built on the same engine.
Context
AMTEX designed and built the product end to end: the mobile app, the organiser and player websites, the database and security model, payments, email, push notifications and the App Store and Play Store release pipelines. The app is live on the App Store and is delivered to Android through the same codebase.
Architecture
Experience
- iOS app
- Android app
- Player & organiser webNext.js
- Live scorersCricket · Tennis · Team sports
Backend
Postgres
Row-level security · SQL standings engine
Realtime
Live scores · Chat
Edge Functions
Reminders · Mailers
Auth
Account deletion · Rate limits
Services
- StripePer-brand accounts
- Transactional emailPer-brand senders
- Push notifications
Delivery
- Store builds + OTA updates
- Vercel
- Git + staged SQL migrations
Solution
One Postgres database serves the Expo app and both Next.js websites. Permissions are not an application-layer afterthought: row-level security policies are the product's permission model, so an organiser sees registrant details for their league only, a captain sees their squad, and personal data is masked for everyone else. Standings are computed in SQL from recorded results, so the table is the same on every surface and recalculates when a result is corrected.
Each sport has a scorer that respects its rules. Cricket is scored ball by ball with toss, extras, run-outs, retirements, over caps and a full scorecard with strike rates, economy, fall of wickets and partnerships. Tennis supports both tiebreak and advantage set deciders chosen by the organiser. Soccer, basketball, volleyball and baseball have squads, playing-eleven sheets and box scores. Live scores stream to spectators over Realtime.
- Registration for individuals, doubles pairs with partner invites, and captain-led team entries with approval flows and one-team-per-league enforcement.
- Pay-as-you-go competition credits for organisers, priced by purchasing-power band and locked to the organiser's country in the database.
- Entry fees paid directly to the organiser's own payment handle, so the platform is never the merchant of record for league money.
- Match officials drawn from a duty team at scheduling time; cricket matches cannot be scheduled without one.
- Opt-in contact reveal and match chat with block, report and an acceptable-use agreement, which is what App Store review requires of user-generated content.
- Public player profiles keyed by a generated Player ID rather than a name, so two players with the same name never merge.
- Weekly challenge reminders, league-versus-league battles, private code-gated leagues and hidden test leagues for staff.
Native releases go through the store review process, but JavaScript changes ship over the air to installed apps, so fixes reach players in hours rather than days. Every schema change is a reviewed SQL migration, applied in a recorded order, with a single query that reports which migrations are actually live before anyone diagnoses a problem.
Business impact
SportzOS went live on the App Store in July 2026 with real leagues, real payments and real match data. Organisers now run registration, fees, fixtures, officials and scoring from one place, and players keep a verified record that follows them from league to league.
The engineering that mattered most was not a feature. It was the security model (a personal-data lockdown that still let captains read their squads), the identity model (a player is an account, never a name) and the release model (store builds for native change, over-the-air for everything else).
7
Sports supported
July 2026
App Store launch
iOS · Android · 2 websites
Surfaces on one backend
Key takeaways
- 01Make row-level security the permission model, then test it with the least-privileged user you have.
- 02Identity is an account id. Matching people by name will eventually make a stranger into you.
- 03A SQL standings engine beats a client-side recalculation the first time a result is corrected.
- 04Separate what needs a store build from what can ship over the air, and ship the latter often.
Services involved
Application Development
Web applications, customer portals, internal tools, SaaS platforms and API products, designed and built by a team that also understands the enterprise systems they connect to.
Mobile App Development
Native iOS, Android and cross-platform apps with the backend, authentication, payments, notifications and store deployment done properly, for consumers, employees and field teams.
Facing something similar?
We will walk you through how we approached this one and what would be different for you.