Overview
This guide shows how to use Expo EAS Build without paying: combining local builds (fully free) and the free cloud queue. You’ll set up minimal config, build Android and iOS, handle signing, and avoid common pitfalls. Fits React Native apps using the Expo-managed or prebuilt workflow.
Quickstart
- Use the free EAS plan and the shared cloud queue when needed.
- Prefer local builds (no quota) to stay “totally free.”
- Build Android locally on any OS; build iOS locally on macOS (Xcode required).
- For iOS devices/App Store, Apple’s paid developer account is required. iOS Simulator builds are free.
Minimal working example
Create a tiny Expo app, configure EAS, and build locally.
# 1) Create a project
npx create-expo-app eas-free-demo
cd eas-free-demo
# 2) Install EAS CLI
npm i -D eas-cli
# 3) Initialize EAS (creates project on Expo backend)
npx eas login # or `npx eas whoami` if already logged in
npx eas init
app.json (minimal config):
{
"expo": {
"name": "EAS Free Demo",
"slug": "eas-free-demo",
"ios": { "bundleIdentifier": "com.example.easfreedemo" },
"android": { "package": "com.example.easfreedemo" }
}
}
eas.json (build profiles):
{
"cli": { "version": ">= 3.0.0" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal",
"ios": { "simulator": true }
},
"production": {
"autoIncrement": true
}
}
}
App.tsx:
import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View } from 'react-native';
export default function App() {
return (
<View style={styles.container}>
<Text>EAS Build Free Demo</Text>
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center'
}
});
Build locally (no cost):
# Android APK locally (works on macOS/Linux/Windows with Android Studio installed)
npx eas build -p android --profile preview --local
# iOS Simulator app locally (macOS + Xcode required)
npx eas build -p ios --profile preview --local
Artifacts will be written to the project’s dist directory when building locally.
Step-by-step: free-first workflow
- Install prerequisites
- Node.js LTS, npm or yarn
- EAS CLI: npm i -D eas-cli
- Android Studio (Android SDK + emulator) for Android local builds
- Xcode (macOS) for iOS local builds
- Initialize and configure
- npx eas init to link the project
- Define bundleIdentifier and package in app.json
- Create eas.json profiles for development, preview (internal/simulator), and production
- Try a local development build
- Android: npx eas build -p android --profile development --local
- iOS (simulator): npx eas build -p ios --profile development --local
- Install the APK on a device/emulator or run the iOS .app on the Simulator
- Produce a production artifact locally
- Android: change profile to production and run with --local to generate an AAB or APK (depending on your Gradle config)
- iOS: production builds for devices or App Store require Apple signing; you can still generate a simulator .app for free
- Use free cloud builds when needed
- If your machine is slow or you lack macOS, you can queue a free cloud build:
- npx eas build -p android --profile production
- npx eas build -p ios --profile preview (simulator)
- Expect shared queues and longer wait times on free plan
- Distribute internally
- Android: share APK from local build
- iOS: share simulator .app for testing on Simulator; physical device installs require signing
Credentials and signing (free-friendly)
Android
- EAS can generate and store a keystore for you at no cost.
- You can also provide your own keystore locally.
- Back up your keystore; losing it prevents updates to an existing Play app.
iOS
- Simulator builds require no signing.
- Installing on devices or submitting to App Store requires Apple signing and a paid Apple Developer account.
- EAS can manage credentials, but Apple program membership is not free.
Strategies to stay totally free
- Prefer local builds using --local to avoid any hosted build limits.
- Use iOS Simulator builds for testing if you don’t have a paid Apple account.
- Keep dependencies compatible with the Expo SDK to avoid native customizations that complicate local builds.
- Cache Android and CocoaPods dependencies locally (Gradle and Xcode will cache by default once installed).
Pitfalls and how to avoid them
Building iOS on Windows/Linux
- Not possible locally. Use macOS or queue a cloud simulator build; device builds require Apple signing.
Native modules not compatible with managed workflow
- Some packages require config plugins or prebuild. If needed, run npx expo prebuild and commit native folders.
Mismatched SDK and CLI versions
- Keep Expo SDK and EAS CLI up to date together. Inconsistent versions cause build errors.
Credentials prompts during build
- For Android, decide once: auto-generate or provide your own keystore. Store passwords in a safe place.
Large assets inflate build times
- Use asset compression and only include needed locales and fonts.
Performance notes (build and runtime)
Build performance
- Local: leverage Gradle and CocoaPods caches by building more than once on the same machine.
- Cloud (free queue): expect wait times; re-run only when necessary.
- Keep eas.json minimal and deterministic; avoid unnecessary post-install scripts.
Runtime performance
- Enable Hermes (default on recent SDKs) for faster startup.
- Use production profile for release builds; development client is slower.
- Strip unused locales/assets; prefer vector icons or on-demand assets.
Reproducibility
- Pin versions in package.json, commit lockfiles, and track buildNumber/versionCode.
Compare free options
- Local builds: unlimited, fastest iteration after first run, requires tooling setup.
- Cloud builds (free): no local setup, shared queue, slower during peak times.
- Hybrid: build locally for day-to-day, use cloud for platform you cannot build locally (e.g., iOS if you lack macOS for Simulator builds).
Tiny FAQ
Is EAS Build usable for free?
- Yes. Use local builds for unlimited free builds. Cloud builds are available on a shared free queue.
Can I ship to the App Store for free?
- No. Apple requires a paid Developer account to sign and submit, regardless of build system.
Do I need a Mac for iOS?
- For local iOS builds, yes. You can queue a free cloud simulator build without a Mac, but device/App Store builds require Apple signing.
How do I get an Android APK without paying?
- Build locally with npx eas build -p android --profile preview --local. Install on device or share for testing.
What’s the difference between classic builds and EAS Build?
- EAS Build supports modern native modules, prebuild, and multiple profiles. It supersedes classic builds.
Next steps
- Add CI to run npx eas build --local on your own runners if you want automated but still free builds.
- Introduce config plugins only when necessary; keep the managed workflow for simpler free builds.