Onboarding Basics
10 examples for day-one machine setup - Xcode, Android Studio, EAS CLI, simulators, and SDK 57 pin - so a new teammate runs the app before lunch.
Search across all documentation pages
10 examples for day-one machine setup - Xcode, Android Studio, EAS CLI, simulators, and SDK 57 pin - so a new teammate runs the app before lunch.
Clone the team repo and confirm the SDK contract in package.json before installing native tooling. If the project uses the default template, expect Expo Router and managed workflow (no committed ios/ / android/ until prebuild or EAS).
git clone git@github.com:your-org/your-app.git
cd your-app
node -v # expect 20.x
cat package.json | grep '"expo"'Target stack for this section:
{
"engines": { "node": ">=20.0.0" },
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}Tooling: These examples target Expo SDK 57 (
expo~57.0.4), React Native 0.86.0, and React 19.2.3. See Project Setup Basics for scaffold flags and folder layout.
Install Node 20 LTS with nvm, fnm, or mise - SDK 57 tooling and EAS CLI expect it.
# nvm example
nvm install 20
nvm use 20
node -v # v20.x.x
npm install
# or: corepack enable && pnpm install{
"engines": {
"node": ">=20.0.0"
}
}CONTRIBUTING.mdnpm ci on CI; locally npm install is fine after cloneengines fails, fix Node before chasing Metro errors - wrong Node causes cryptic transform failuresRelated: Project Setup Basics - lockfile and
.gitignorehygiene
The expo package version is the compatibility contract for every expo-* module.
npm install
npx expo-doctor
npx expo install --check{
"dependencies": {
"expo": "~57.0.4",
"react": "19.2.3",
"react-native": "0.86.0"
}
}npx expo-doctor compares your graph to the SDK 57 matrix - run it on day one and after every git pullnpx expo install <pkg> resolves peer versions - never hand-pick expo-camera without itRelated: create-expo-app Templates -
default@sdk-57scaffold
Copy the example env file before first run - missing API URLs cause silent blank screens.
cp .env.example .env.local# .env.example (committed)
EXPO_PUBLIC_API_URL=https://api.staging.example.com
# EAS secrets - not in .env for production builds// app.config.ts - surface public vars via extra when needed
export default {
expo: {
extra: {
apiUrl: process.env.EXPO_PUBLIC_API_URL,
},
},
};EXPO_PUBLIC_* vars embed in the JS bundle - never put private keys here.env filesEXPO_TOKEN, staging accounts, and TestFlight invitesnpx expo start -cConfirm JavaScript boots before installing multi-gigabyte native IDEs.
npx expo start
# press i for iOS simulator (requires Xcode)
# press a for Android emulator (requires Android Studio)
# scan QR with Expo Go on a physical device{
"scripts": {
"start": "expo start",
"ios": "expo start --ios",
"android": "expo start --android"
}
}expo start -c clears Metro cache when imports look stale after branch switcheseas.json for development profiletsc --noEmit passesRelated: Expo Router Basics - file-based routes in
app/
iOS development requires Xcode from the Mac App Store and command-line tools.
xcode-select --install
sudo xcodebuild -license accept
xcode-select -p
# /Applications/Xcode.app/Contents/Developer
# List simulators
xcrun simctl list devices available
# Open Simulator app
open -a Simulatornpx expo start --ios
# or: npx expo run:iosrun:ios may trigger CocoaPods (pod install) if ios/ exists or after prebuildarm64 - faster than Rosetta x86 imagesAndroid builds need Android Studio with SDK Platform 35 and a virtual device (AVD).
# After Android Studio install - set ANDROID_HOME
export ANDROID_HOME=$HOME/Library/Android/sdk # macOS
export PATH=$PATH:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools
adb devices
emulator -list-avdsAndroid Studio → SDK Manager:
npx expo start --androidadb reverse helps Metro reach localhost APIs: adb reverse tcp:8081 tcp:8081EAS CLI links your machine to Expo's cloud build service - required for store-shaped binaries.
npm install -g eas-cli@latest
# or project-local: npx eas-cli@latest
eas login
eas whoami
cd your-app
eas build:configure # creates eas.json if missing// eas.json (minimal starter)
{
"cli": { "version": ">= 16.0.0" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {}
}
}eas login uses your Expo account - request org invite from mobile leadeas build:configure wires project ID in app.config.ts via extra.eas.projectIdEXPO_TOKEN robot account - humans use eas login; never commit tokenseas build --profile development --platform ios --local optional; default is cloudRelated: EAS Build Basics - profiles, credentials, first build
When the app adds custom native modules or config plugins, Expo Go is not enough - install a dev client.
npx expo install expo-dev-client
eas build --profile development --platform ios
# Install IPA via QR from EAS dashboard
npx expo start --dev-client{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"ios": { "simulator": true }
}
}
}expo-dev-client and native code from config pluginsios.simulator: true) install faster for iOS-only UI workRelated: EAS Build Basics -
developmentClient: true
Standardize device names so pairing sessions and screenshots match.
# iOS - boot named simulator
xcrun simctl boot "iPhone 16"
open -a Simulator
# Android - start AVD by name
emulator -avd Pixel_8_API_35 &
# Expo targets specific device
npx expo run:ios --device "iPhone 16"
npx expo run:android --device Pixel_8_API_35// package.json - team shortcuts (optional)
{
"scripts": {
"ios:16": "expo run:ios --device 'iPhone 16'",
"android:pixel": "expo run:android --device Pixel_8_API_35"
}
}xcrun simctl erase all (destructive)Run this script block before opening your first PR - catches 90% of onboarding drift.
node -v # 20.x
npm ci
npx expo-doctor
npm run typecheck # or: npx tsc --noEmit
npm run lint
npm test -- --passWithNoTests
npx expo start## CONTRIBUTING.md excerpt - Machine setup
1. Node 20 via nvm
2. Clone + `npm ci`
3. `cp .env.example .env.local` (ask #mobile for values)
4. `npx expo-doctor` - must pass
5. `npx expo start` - iOS sim + Android emu smoke
6. `eas login` + org invite
7. Install dev client from EAS `development` profile if repo has expo-dev-clientnpx expo customize tsconfig.json if typed routes fail on clean cloneexpo-doctor in your onboarding PR if your team tracks hire checklistsRelated: Project Setup Best Practices - conventions that survive week two
For full-stack mobile teams, yes on macOS - you will touch both platforms in review. Windows/Linux hires can skip Xcode and use EAS for iOS binaries.
Expo Go if package.json has no expo-dev-client. If the README mentions a development build QR, install that first - Expo Go will not load custom native code.
20–40 minutes cloud-side. Start it after lunch on day one while reading the codebase tour - do not block morning Metro setup on it.
Post output in #mobile with your OS version. Do not manually bump packages - run npx expo install --fix only when the lead confirms.
app/ mental modelStack versions: This page was written for React 19.2.3, React Native 0.86.0, and Expo SDK 57 (
expo~57.0.4).
Reviewed by Chris St. John·Last updated Jul 16, 2026