Matches
Fixtures and live scores across 120+ competitions, the calendar behind it, and the fixture cards you can configure.
src/app/(main)/(tabs)/matches · src/app/(main)/home/matches.tsx
Today's fixtures and live scores. The tab most sessions start in, and the one
that has to be right at 15:00 on a Saturday.
The day is the state
The calendar strip drives everything. src/lib/core/calendar-date.ts owns the
arithmetic and is tested without a render — days, weeks, and the boundaries that
go wrong around a timezone.
Two related screens sit under (tools): calendar and calendar-fixtures, for
picking a date further out than the strip reaches.
Cards are configurable
board-card-settings/[board] lets you choose what a fixture card shows. That is
not decoration: on a phone a card is the whole row, and someone tracking corners
wants different numbers on it from someone tracking cards.
The settings are client state, so they live in a zustand store — see Data.
Pinned leagues
src/lib/core/pinned-leagues.tsx and league-order.ts decide what comes first.
120+ competitions is unusable without it, and the ordering is a preference the
reader sets, not a ranking the app imposes.
Live scores
A fixture in progress updates while the screen is open. Anything that polls is a
query with a short staleTime, not a subscription — see
Data for the defineQuery primitive and where staleness
is declared.