Installation

Install dependencies and run the Expo app locally on iOS, Android, web, or Expo Go.

This guide takes you from a fresh clone of soar-expo to the app running in an Expo dev server.

Prerequisites

  • Node.js LTS — use an active LTS release.
  • pnpm — the template pins packageManager: pnpm@10.32.1.
  • Xcode — required only for the iOS simulator and local iOS native builds on macOS.
  • Android Studio — required only for the Android emulator and local Android native builds.
  • Expo Go or web — useful for the first look, with the native-only caveats below.

You do not need every native toolchain to start. pnpm web runs in a browser, and Expo Go can open a physical-device preview. Purchases, native Google Sign-In, some notification behavior, and config-plugin changes require a development build.

Setup

Clone the template

git clone <repo-url> soar-expo
cd soar-expo

Install dependencies

pnpm install

The lockfile is pnpm-lock.yaml; keep pnpm as the package manager so native module versions stay aligned with Expo SDK 54.

Create your local environment

cp .env.example .env.local

Set the Supabase pair first:

EXPO_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key

The Supabase client is created at module load time, so the app expects both values. RevenueCat, Google, PostHog, Sentry, links, and update-policy keys can stay blank while you verify the shell.

Start the Expo dev server

pnpm dev

The script runs expo start -c -p 3000, so it clears the Metro cache and uses port 3000. From the Expo terminal press:

  • i for the iOS simulator.
  • a for the Android emulator.
  • w for the web build.

You can also scan the QR code in Expo Go for a physical-device preview.

Development build vs Expo Go

Expo Go is useful for quick UI review, but it does not include every native module this starter uses. Create a development build when you need the actual native runtime:

eas build --profile development --platform ios
eas build --profile development --platform android
SurfaceExpo Go / web previewDevelopment build
Home, Component, Showcase, i18n, themingWorks for UI reviewWorks
Email auth, todos, profile reads/writesWorks after Supabase is configuredWorks
RevenueCat purchasesNot available on web; Expo Go is not the target runtimeRequired
Native Google Sign-InWeb no-op; Expo Go is not the target runtimeRequired
Apple Sign-IniOS native onlyRequired
Push token and notification behaviorDevice-dependent; useful only as a rough checkRecommended
Config-plugin changesNot reflectedRebuild required

See EAS Build for profiles, channels, and OTA update setup.

Verify the installation

Work through this checklist before adding optional services:

  • Dev server starts without Metro errors.
  • Onboarding appears on first launch, then dismisses after completion.
  • Legal consent modal appears outside the bundled legal screens.
  • Login screen renders from the drawer or signed-in gates.
  • Component tab renders signed out and does not need network access.
  • Home / Showcase / Me render, with signed-in-only rows raising sign-in instead of crashing.
  • Supabase-backed features can sign in and persist data after the Supabase project is configured and migrations are applied.

Useful scripts

CommandWhat it does
pnpm devexpo start -c -p 3000; press i, a, or w
pnpm dev:previewStart Metro with APP_VARIANT=preview
pnpm dev:prodStart Metro with APP_VARIANT=production
pnpm iosStart with cache cleared and open the iOS simulator
pnpm androidStart with cache cleared and open the Android emulator
pnpm webStart with cache cleared and open the web build
pnpm typecheckRun tsc --noEmit
pnpm lintRun expo lint
pnpm formatFormat TS, TSX, JS, JSON, CSS, and Markdown with Prettier
pnpm gen:typesGenerate types/database.ts from Supabase; requires SUPABASE_PROJECT_ID
pnpm cleanRemove .expo and node_modules

Common first-run failures

SymptomLikely causeFix
Missing Supabase environment variables.EXPO_PUBLIC_SUPABASE_URL or EXPO_PUBLIC_SUPABASE_ANON_KEY is missingCopy .env.example to .env.local and fill both values
Port 3000 is already in useAnother dev server is runningStop it or run Expo with another port
Simulator does not openXcode command-line tools or simulator runtime missingInstall Xcode, open it once, and install an iOS simulator
Android emulator does not openAndroid SDK / emulator not configuredInstall Android Studio, create an emulator, and verify JAVA_HOME / SDK paths
Stale route, asset, or native-module errorMetro cachepnpm dev already passes -c; restart it after env or native config changes
Watchman warningsLocal file watcher stateRestart Watchman or clear its watches
Purchases or Google Sign-In unavailableRunning in Expo Go/web or missing keysUse a development build and configure the relevant public keys

On this page