Skip to content
supastack
Browse documentation
MobileExpo

For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /docs/mobile/tech-stack.md (or send Accept: text/markdown).

Mobile tech stack

The technologies inside the Expo app and the role each one plays.

Before you begin

The Mobile app is a small native surface: every library below is already pinned in apps/mobile/package.json, so nothing on this page needs a separate install. This page explains what each piece does so the later guides make sense.

The backend keeps its own stack — Next.js, Postgres and the provider adapters — in the Web repository. The app reaches it over EXPO_PUBLIC_API_URL instead of embedding any of it, which is why a Mobile-only checkout stays small.

Expo + React Native

Expo is the toolchain that runs, bundles and builds the app; React Native renders real native interface elements rather than a webview. Expo Router gives file-based navigation: every file under apps/mobile/app/ becomes a screen, with the signed-in stack grouped under app/(app)/.

Expo Go opens the shared development preview on your phone, while a development build is your own installable app — required once a native module such as purchases or the biometric lock must run.

TypeScript

All app code is TypeScript, and the package ships a strict typecheck. You can check every file without a device or a running backend.

Better Auth Expo + secure storage

Sign-in rides the Better Auth Expo client through the system browser: the app opens the backend's auth page, the backend returns to the app's deep-link scheme, and the session token is kept in expo-secure-store — the Keychain on iOS and the Keystore on Android — never in plain storage or bundled config.

The same modules cover passkeys, an optional biometric app lock through expo-local-authentication, and sign-out that clears the workspace-scoped offline cache.

RevenueCat purchases

react-native-purchases connects StoreKit and Play Billing to the kit's entitlement sync: the app starts the store purchase, the backend verifies it through the RevenueCat webhook, and the server decides what the workspace may use.

Purchases stay off in the first preview (EXPO_PUBLIC_MOBILE_PURCHASES_PROVIDER=off). Real purchase and restore testing needs an EAS development build, because Expo Go cannot run the native purchase module.

EAS Build + Submit

eas.json ships three profiles: development builds a dev client for the iOS Simulator, preview builds an internal Android APK for testers, and production builds the store binaries with auto-incremented versions and a Play internal-track submit step.

Builds run in Expo's cloud, so you do not need a local Xcode or Android Studio to produce binaries — only to run simulators on your own computer.

Shared packages

@supastack/ui-native carries the cross-platform view-models — createEntitlementCard turns server entitlement state into one card contract — and @supastack/design-tokens carries the theme values. Only these two shared packages ship inside the Mobile checkout; the server packages live with the Web backend.

Verification tooling

Deterministic Vitest suites cover session storage, deep links, chat streaming and cancellation, entitlements, purchases, the offline cache and notification routing — they run on your computer without a device. Native-only behavior such as the app lock, push delivery and store purchases is verified in an EAS development build instead.

corepack pnpm --filter @supastack/mobile test
corepack pnpm --filter @supastack/mobile typecheck