EAS Build Basics
Ten examples for eas.json, build profiles, and your first cloud iOS/Android build - the operational foundation for shipping Expo SDK 57 binaries without local Xcode or Android Studio on every machine.
Search across all documentation pages
Ten examples for eas.json, build profiles, and your first cloud iOS/Android build - the operational foundation for shipping Expo SDK 57 binaries without local Xcode or Android Studio on every machine.
Start from a blank Expo app with SDK 57 pinned and EAS CLI installed globally or via npx:
npx create-expo-app@latest EasBuildBasics --template blank-typescript@sdk-57 --yes
cd EasBuildBasics
npm install -g eas-cli@latest
eas loginConfirm the stack pin before configuring builds:
{
"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. Read Prebuild Basics before your first EAS build under Continuous Native Generation (CNG).
EAS Build is Expo's cloud compile service. For a typical CNG app it:
app.config.ts, lockfile, and modules/ (not gitignored ios/ / android/)npx expo prebuild when native folders are absenteas build:configureeas build:configure creates eas.json and links the project to your Expo accountEvery build needs an Expo project ID in app.config.ts:
eas init// app.config.ts
import type { ExpoConfig } from "expo/config";
const config: ExpoConfig = {
name: "EasBuildBasics",
slug: "eas-build-basics",
version: "1.0.0",
ios: {
bundleIdentifier: "com.example.easbuildbasics",
},
android: {
package: "com.example.easbuildbasics",
},
extra: {
eas: {
projectId: "00000000-0000-0000-0000-000000000000", // from eas init
},
},
};
export default config;npx expo config --type public | jq '.extra.eas.projectId'eas init writes projectId - commit app.config.ts after linkingprojectId fail early with a clear config erroreas.json is the build contract - profiles name credential sets, distribution channels, and environment variables:
{
"cli": {
"version": ">= 16.0.0",
"appVersionSource": "remote"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {}
}
}eas build --profile preview --platform ioscli.version pins the minimum EAS CLI - CI should match or exceed itappVersionSource: "remote" lets EAS auto-increment buildNumber / versionCode on store profilesEngineers need a native binary with expo-dev-client embedded - not Expo Go:
npx expo install expo-dev-client{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"environment": "development",
"ios": {
"simulator": true
},
"android": {
"buildType": "apk"
}
}
}
}# iOS Simulator binary (no device registration)
eas build --profile development --platform ios
# Android APK for USB sideload
eas build --profile development --platform androiddevelopmentClient: true compiles the dev menu and custom native modulesPreview builds look like production but install via internal distribution - TestFlight internal, ad hoc, or APK links:
{
"build": {
"preview": {
"distribution": "internal",
"environment": "preview",
"channel": "preview",
"ios": {
"simulator": false
},
"android": {
"buildType": "apk"
}
}
}
}eas build --profile preview --platform alldistribution": "internal" skips public store release - see Internal Distributionchannel ties the binary to EAS Update bundles published with eas update --channel previewProduction compiles release binaries signed for App Store Connect and Google Play:
{
"build": {
"production": {
"distribution": "store",
"environment": "production",
"channel": "production",
"autoIncrement": true,
"android": {
"buildType": "app-bundle"
}
}
}
}eas build --profile production --platform all --non-interactivedistribution": "store" produces App Store / Play-ready artifactsbuildType": "app-bundle" is required for Play production - AAB not APKautoIncrement": true bumps iOS buildNumber and Android versionCode remotelyInteractive first build walks credential setup - accept EAS-managed credentials unless you have an existing cert chain:
eas build --profile production --platform iosPrompt flow (first time):
? Generate a new Apple Distribution Certificate? › Yes
? Generate a new Apple Provisioning Profile? › Yes
? Log in to your Apple Developer account › ...After success:
eas build:list --platform ios --limit 3--non-interactive buildsAndroid first build generates or uploads a keystore - let EAS create one for greenfield apps:
eas build --profile production --platform android? Generate a new Android Keystore? › YesInspect stored credentials:
eas credentials --platform androidTrack in-flight compiles and retrieve install links:
# Watch the latest build
eas build --profile preview --platform ios --wait
# List recent builds
eas build:list --status finished --limit 5
# Open build page in browser
eas build:view// Example finished build metadata (abbreviated)
{
"status": "FINISHED",
"platform": "IOS",
"artifacts": {
"buildUrl": "https://expo.dev/artifacts/eas/....ipa"
}
}buildUrl with QA for APK/IPA sideload or ad hoc installs--non-interactive and polls eas build:list or EAS webhooksStandard CNG apps gitignore native folders - EAS regenerates them on every build:
# .gitignore
ios/
android/{
"build": {
"production": {
"env": {
"EXPO_NO_CAPABILITY_SYNC": "0"
}
}
}
}# Local sanity check before spending EAS minutes
npx expo-doctor
npx expo prebuild --no-install
eas build --profile production --platform allInfo.plist - express native changes in pluginsexpo run:ios or Xcode debugging on your laptop."simulator": true) still use cloud macOS workers.expo prebuild when folders are absent.package-lock.json - upload size and install time drop.Stack 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