(01) · Case study

19 core systems

Tournamate Mobile/ Mobile Application

Tournamate is a tournament and game-hosting mobile application I built for a UK-based startup, launching November 2025. It handles bracket generation, live match scoring, venue check-in, payments, and organizer tooling — across both competitive PC and grassroots pub-league formats.

  • DateOctober 26, 2025
  • RoleLead Software Engineer
  • TypeMobile Application
  • Duration5 months (to launch)
  • ClientTournamate (UK)
  • Built withReact Native · TypeScript · Zustand · Jotai · React Hook Form · Zod Schema Validation · TanStack Query · Expo · Supabase · TailwindCSS · NativeWind · System Design · RBAC & Role Gates · CRDT / Offline-First · Optimistic Updates · Figma → Pixel · B2B Vendor Portals · Inventory & Scoring Tools · Data-Driven Tables
Tournamate Mobile — hero
02/ Problem
The challenge

Tournaments run offline in pubs and sports halls with zero Wi-Fi, and every bracket dispute is a riot risk.

Grassroots tournament organizers don't run these things in convention centers with enterprise Wi-Fi. They run them in pubs, church halls, and community centers where a 4G signal is lucky. Losing a scoring update or dropping a bracket edit because the connection hiccups means two teams genuinely believe they advanced — and at a pub league, that gets loud fast.

03/ Approach
The strategy

Treat the phone as the source of truth. Reconcile with the server only when connectivity lets it.

Every device keeps a CRDT-backed local copy of the bracket and match state. Scoring updates happen instantly on device and are queued for sync. When two organizers edit the same match offline, the CRDT merges deterministically with a clear audit trail — not last-write-wins. Users see a tiny status chip on every screen so they always know if the update is local-only or globally confirmed.

04/ Build
How it works

CRDT state, offline-first payments, and an organizer role-gate that is genuinely hard to misuse.

Jotai atoms wrap Yjs CRDT documents that live in SQLite via expo-sqlite. Match edits, bracket re-seeds, and check-ins all mutate the same doc tree; a sync engine uses binary websockets when up, exponential-backoff retries when down. Stripe Terminal runs offline-capable payment captures so on-the-door entry fees still settle even with no signal. The organizer toolkit has separate roles (Referee / Admin / Door) with hard-coded capability sets — a referee cannot accidentally refund a payment.

05/ Impact
The outcome

Live alpha ran 12 pub tournaments with zero bracket disputes and one 3-hour full offline window.

Three beta venues ran 12 pub-league events through the alpha between June and September 2025. Zero bracket disputes escalated to manual intervention. During one event the venue suffered a full router outage for 3 hours; referees kept scoring, doors kept checking people in, and when Wi-Fi came back the CRDT merge settled every update in 6 seconds with no UI reload required. Launch is scheduled for November 2025 with 18 contracted venues.

(06) · Impact

The numbers tell the rest of the story.

  • 18

    Contracted launch venues

  • 12

    Alpha events completed

  • 0

    Bracket disputes required manual fix

  • 180+ min

    Longest offline window survived

(07) · Gallery

01 frame

Tournamate Mobile — screenshot 2
02