ADR-001: Tech stack
Status: Accepted
Context
A two-person (extensible) household needs a mobile app to track shared spending with real-time sync across phones and a future web client.
Decision
- Expo + React Native + TypeScript for one codebase across Android/iOS and a future web target.
- Expo Router for file-based navigation.
- NativeWind for styling (Tailwind semantics in RN).
- TanStack Query for server state, Zustand for local UI state.
- React Hook Form + Zod for forms and validation.
- expo-sqlite for the offline cache.
- Supabase (Postgres + Auth + RLS + Realtime) as the backend from day one.
Alternatives considered
- Flutter: native feel but a separate stack from the team's React experience.
- Local-only storage: rejected because real-time multi-device sharing is a hard requirement and a web client cannot read on-device storage.
- Firebase: viable, but Postgres + RLS gives stronger relational modeling and a cleaner web reuse path.
Consequences
Android-only SMS parsing requires a native module behind a platform check. NativeWind pulls a web react-dom peer that requires legacy-peer-deps. Jest is pinned to v29 to match the Expo SDK 56 preset.