Skip to content

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.

Spend together, settle simply.