Technical features
The native architecture behind routing, data, animation and system integrations.
Screen architecture
Every screen keeps three responsibilities separate: an Expo Router route mounts it, a composed module fetches and coordinates state, and a feature component renders plain props. pnpm check:layers enforces that direction.
Sheets and filters are routes too. This gives them native back behavior, restoration and deep links instead of rebuilding navigation inside modal components.
Introduction to Expo Router
Expo Router's file-based routes explain why StatsHub models sheets and filters as navigation: they keep native back behavior, restoration, and deep links.
Data and interaction
TanStack Query owns server responses, staleness, retries and invalidation. defineQuery declares a key, fetcher and cache policy once so hooks, prefetches and mutations cannot drift onto different keys.

Install TanStack Query
TanStack Query is the server-state layer behind StatsHub's query keys, retries, staleness, and invalidation.
Expo Router owns applied filters, sorting, tabs, dates and selected records. Zustand is limited to durable client choices such as favourites, saved defaults, card layouts and shell coordination. Query results and active board filters are not copied into stores.
Reanimated 4 shared values carry per-frame gesture and scroll state on the
UI thread. Any unbounded or data-driven native collection uses LegendList with
stable keys and render callbacks. A plain ScrollView is for short, fixed
content; detail pages do not get an exception merely because their rows sit
below a header.

Getting started with React Native Reanimated
Reanimated's UI-thread model is why gesture and scroll state stays in shared values instead of React render state.
System surfaces use Expo Widgets and Notifications for scores, countdowns, hit rates and match reminders.
Expo Widgets
Expo Widgets provides the native home-screen widgets and Live Activities used for StatsHub's score and countdown surfaces.
Match data comes from the Go API. Convex and Better Auth hold accounts and sessions; RevenueCat supplies subscription entitlements. Keeping those boundaries separate prevents product data, identity and purchases from becoming one coupled backend.
