EN-TT Sign up
CHANGELOG

WHAT WE SHIPPED.

Every major feature, every release, every infra leap. Newest at the top.

v1.1.0 02 Jul 2026 improvement

Match fees move to WAM

The payment rail switches from WiPay to WAM - a mobile wallet built in Trinidad and Tobago and regulated by the Central Bank. One hosted checkout takes WAM wallet, card, or QR. Cash and bank-transfer marking stay exactly as they were.

Match fees move to WAM

Tap “Pay your share” and you land on WAM’s hosted checkout - pay from your WAM wallet, a card, or by scanning the QR. The moment WAM settles, the app knows: your fee flips to paid in the roll call without you refreshing anything. If you drop out of a match after paying by card, your captain can now send the refund back from inside the app.

What changed

  • Checkout is now WAM hosted - wallet, card, or QR in one place
  • Payments confirm themselves the instant WAM settles
  • Captains can push a card refund to a player who drops out
  • Cash and bank-transfer “mark paid” untouched
  • TTD native, end to end

Coming next: live real-money payments the moment our WAM Business onboarding clears.

v1.0.0 24 May 2026 feature

Roll call locks in two taps

The match-day attendance lock is live across every external match and sweat. Captains stop chasing a WhatsApp thread to find out who is actually showing up.

Roll call locks in two taps

Roll call sits on the match screen one hour before kick-off. Each rostered player gets a one-tap In / Out / Late. The list is shared, live, and locked at the whistle so the post-match stats only attribute minutes to confirmed names. Captains see the warm-dark roster grid with a single flame “Lock the eleven” CTA when the count balances.

What changed

  • New /games/$gameId/roll-call route
  • Live attendance state via Supabase Realtime
  • Late toggle resolves once a player checks in physically
  • Lock action freezes the lineup and seeds the post-match stat sheet
  • Roster Captain Markers moved to a FUT-style flame badge on the avatar

Coming next: auto-suggest a replacement when someone drops within two hours of kick-off.

v0.9.0 21 May 2026 feature

Escrow goes live in sandbox

WiPay wired end-to-end. Match fees flow into hosted checkout, sit in escrow, and release on result confirmation. Live cards wait on the client's business registration; everything else is real.

Escrow goes live in sandbox

The /payments ledger gives every actor a single line per match: amount, status, payout target, receipt. Captains can drop a cash or bank-transfer record onto a fee for the players who paid offline. The MD5 hash field order is locked against the WiPay v1.0.8 spec so reconcile and webhook can never drift, and the match_fee_payments UPDATE policy now denies client writes outright.

What changed

  • payments-initiate + payments-reconcile Edge Functions behind a provider port
  • New /payments ledger and /payments/callback routes
  • Captain cash / bank-transfer mark-paid path via mark_match_fee_paid_manual RPC
  • Hardened RLS - no more client-side self-mark-paid
  • Mock mode works end to end today; live is a config flip

Coming next: automatic payout splits to referees and field owners on result verification.

v0.8.0 19 May 2026 design

Warm-dark design system v5 lands

Nine waves of page-by-page rebuild. The app now sits on a warm-dark canvas with cherry / flame ambient gradients, paper cards floating on the canvas, and Bebas Neue claiming every hero number.

Warm-dark design system v5 lands

The whole app was rebuilt against the locked system - home, auth, teams, games, discover, profile, notifications, search. Cards float with --e1 shadow and a 1px hairline border at rest. Flame is reserved for urgency; pitch for paid / won / verified. Bebas owns hero numbers; Inter owns everything else. Tabular nums via font-variant-numeric (JetBrains Mono retired).

What changed

  • Six-level elevation ladder (--e0 through --e5)
  • New <Screen> shell with iOS-style collapsing hero title
  • Flame / flame-2 / flame-3 contrast pair for white-on-flame surfaces
  • Tab indicator springs on layoutId + 8ms haptic on press
  • Photo gradients (warm / cool / mono / pitch / flame / ink) + grain overlay
  • 5-agent verification gate: 4 GREEN, 1 YELLOW (mobile Lighthouse 82)

Coming next: pushing mobile Lighthouse from 82 to 85 without a UX trade-off.

v0.7.0 14 May 2026 feature

Scout card lands on your profile

The Digital Scout Card is now interactive. Pointer tilt on desktop, gyroscope tilt on mobile, holographic sheen, and tap-to-flip back face that scrolls internally without breaking the silhouette.

Scout card lands on your profile

Verified stats only. The card pulls career goals, assists, clean sheets, last-10 form pips, and badges from materialised views that refresh on confirmed results - no padding the numbers in a sweat your captain set up for you. Card cap is max-w-[380px] with aspect-[5/7] so it reads as a real trading card. All four affordances (share, flip, edit, gyro) sit on the card corners.

What changed

  • New PUBLIC route /u/$userId for logged-out QR scans
  • PII-safe anon read surface via public_player_match_stats view
  • Share sheet: WhatsApp first, native share, save-as-image, lazy QR, X, FB, copy
  • Three seeded badges (Golden Boot, Clean Sheet King, Reliable Baller) carry a quiet “Tracking soon” on locked tiles
  • Web Audio chime + 12ms haptic on flip

Coming next: auto-generated season highlight cards on the last weekend of every league window.

v0.6.0 07 May 2026 feature

Referee booking and earnings ledger

Refs get their own home, calendar, and earnings page. Set availability, accept bookings, see what is owed and when it lands.

Referee booking and earnings ledger

/referee opens with today’s bookings, the pending acceptance queue, and the running weekly earnings tally. Availability is set as recurring weekday windows plus blackout dates. Once a captain books a slot the ref accepts or declines in one tap; the slot goes onto their calendar and the match goes into the queue. Earnings render with W/D/L outcome chips so refs can spot the matches that disputed.

What changed

  • Four new routes: /referee, /referee/availability, /referee/bookings, /referee/earnings
  • Per-role onboarding wizard (role-pick, credentials, payout target)
  • Pending-approval splash for refs awaiting admin verification
  • 11-position taxonomy migration (GK / CB / LB / RB / CDM / CM / CAM / LW / RW / ST / SS)
  • Role-aware home redirect in _authenticated.tsx

Coming next: ref sign-off RPC so a verified ref can lock a result without captain agreement.

v0.5.0 23 Apr 2026 feature

External match challenge flow ships

Captain-to-captain challenges. Pick a team, send a date, watch acceptance lock the match. The opponent's captain sees one card in their inbox with Accept or Decline.

External match challenge flow ships

Challenges live on a new /challenges route with two columns: incoming and outgoing. Each card shows the opponent’s team crest, kit colors, last-five form ribbon, and proposed kick-off. Accept locks the match; decline returns a short reason; withdraw cancels a sent challenge that has not been touched. Pending external matches read “Challenge sent” on team cards instead of generic “Pending.”

What changed

  • /challenges route with inline Accept / Decline / Withdraw
  • Captain QuickNav tile points to the inbox
  • Accept / Decline / Withdraw gated to the actual captain of the relevant team
  • New BusinessRuleError class and P0001 mapping in mapSupabaseError
  • “Challenge sent” wording on cards beats generic “Pending”

Coming next: repeat-match shortcut so two teams that played last week can rebook in one tap.

v0.4.0 09 Apr 2026 feature

Result verification and dispute review

Post-match stats now go through a two-sided verification handshake. If captains disagree, the match drops into an admin dispute queue with a 48-hour review window.

Result verification and dispute review

The home captain enters the result; the away captain verifies or flags. Verified results push to scout cards, team form, and the live discover feed. Flagged results pause stats, capture both captains’ versions, and surface in the admin /admin console with the original sheet, the flagged sheet, and any roll-call evidence. Refs can also lock a verified result without captain agreement once their availability is on file.

What changed

  • Two-sided verification handshake on /games/$gameId
  • Dispute modal with reason picker and free-text note
  • 48-hour admin SLA on /admin dispute queue
  • Materialised player_career_stats + team_stats refresh only on verified results
  • Match-won + ref-verified peak moments (Web Audio chime + canvas-confetti burst)

Coming next: per-player stat dispute (flag a single assist credit, not the whole result).

v0.3.0 26 Mar 2026 infra

Push notifications via OneSignal

Notifications are real. The in-app DB centre runs first; OneSignal web-push delivers when permission is granted. Quiet hours and per-category preferences land in settings.

Push notifications via OneSignal

The outbox pattern dispatches via pg_cron every five minutes. Every category - match invite, RSVP change, result verified, payment received, mention, team invite, roster change, article published - has its own toggle, channel matrix (push / email / in-app), and quiet-hours window. The bell in the topbar opens a Radix popover with the latest five unread, mark-all, and a link to the full /notifications inbox.

What changed

  • notifications_outbox + notification_deliveries tables
  • notifications-dispatch Edge Function (mock provider + OneSignal stub)
  • notification_category_enum extended with six new categories
  • Push-permission banner with one-tap grant
  • Quiet hours and channel matrix bitmap on notification_preferences

Coming next: OneSignal web-push service worker activation and the iOS Safari permission walkthrough.

v0.2.0 19 Feb 2026 feature

Algolia search rolls out

Global Cmd+K palette searches players, teams, facilities, and matches in one ranked list. Mobile gets a topbar search bar on desktop and a full-screen search modal on the phone.

Algolia search rolls out

Four indices, one query. Players surface with avatar, kit number, and position. Teams surface with crest and kit colors. Facilities surface with the next available slot. Matches surface with state pill (upcoming / live / completed / disputed). Backfill happens via algolia-sync Edge Function; live-sync triggers are documented and shipping next. algoliasearch is dynamic-imported so it stays off the first-paint bundle.

What changed

  • Cmd+K global search palette on every authenticated route
  • Four Algolia indices: players, teams, facilities, matches
  • algolia-sync Edge Function for backfill
  • SearchProvider port behind a TypeScript interface (Algolia real, Postgres stub for dev)
  • Dynamic import keeps Algolia off the boot bundle

Coming next: live-sync triggers so changes land in the index in under five seconds.

v0.1.0 29 Jan 2026 feature

The sweat loop end-to-end

Private sweats are live. Captain creates the match, players join, captain enters stats, the internal leaderboard updates. No verification needed - sweats are casual by design.

The sweat loop end-to-end

A sweat is a single match with one team and a player pool. The captain picks the ground, sets a kick-off time, and shares an invite link or QR code. Players join with one tap. Post-match the captain enters goals, assists, cards, and minutes on a position-aware stat sheet. The numbers feed an internal leaderboard for the squad but stay off public scout cards - separate from competitive records by construction.

What changed

  • /games/create-sweat wizard with ground picker
  • Shareable invite link + QR for one-tap joining
  • Position-aware stat sheet (different fields for GK vs outfield)
  • Internal sweat leaderboard at /teams/$teamId/sweats
  • Sweats render honestly in the match list (no false “match” framing)

Coming next: external match flow - the competitive loop with two real teams, verification, and scout-card-eligible stats.