This content originally appeared on DEV Community and was authored by Cathy Lai
Hot reloading on device, native modules, fast iteration — without the App Store or Play Store hassle.
Tags: expo, reactnative, mobile, eas, devops
Works with: Expo SDK 53, Expo Router, EAS Build/Submit
Why a “development build”?
A development build is your own custom “Expo Go”—it includes your app’s native plugins and permissions so you can test everything on a real device with hot reload. You install it once, then iterate quickly via expo start --dev-client
.
TL;DR (after you’ve done it once)
# 1) Start the dev server
npx expo start --dev-client
# 2) On your phone
# Open your installed development build and scan the QR code
# 3) Code, save, hot-reload
# Rebuild only if you change native stuff (plugins, permissions, SDK version)
Prereqs
- Node + npm/yarn installed
- Logged in to Expo:
npx expo login
(ornpx expo whoami
) - EAS CLI:
npm i -g eas-cli
- Same Wi-Fi for computer & phone (or use tunnel)
iOS specific
- iOS 16+ recommended
- Settings → Privacy & Security → Developer Mode: On (iOS will reboot when enabling)
Android specific
- Enable Developer options and USB debugging (if installing via USB/ADB)
1) Add a development profile
Create or update eas.json
in your project root:
{
"cli": { "version": ">= 10.0.0" },
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"ios": { "resourceClass": "m-medium" },
"android": {}
},
"preview": {
"distribution": "internal"
},
"production": {
"autoIncrement": "version"
}
},
"submit": {
"production": {}
}
}
developmentClient: true
tells EAS to build a dev client (your custom Expo Go) that includes your native modules.
2) Build the development client (install it once)
iOS
eas build -p ios --profile development
- First time? EAS will help register your device (UDID) via QR.
- Let EAS manage certs/profiles.
- When the build is done, open the build page and tap Install on your iPhone.
- If prompted, trust the developer and ensure Developer Mode is enabled.
Android
eas build -p android --profile development
- You’ll get an APK (or AAB if configured).
- Install options:
- From the EAS build page, scan the install QR on your phone, or
- Via USB:
adb install your-app.apk
(authorize USB debugging)
3) Day-to-day: run it on your phone
npx expo start --dev-client
- Open the development build on your phone (it has your app name/icon).
- Scan the QR from the terminal or web UI.
- Edit code → save → hot refresh.
- Rebuild only when you change native stuff:
- Add/modify a plugin or native module
- Change iOS/Android permissions/capabilities
- Upgrade Expo SDK / React Native version
Copy-paste cheatsheets
iOS (wireless)
# First time (one-time)
eas build -p ios --profile development
# Every day
npx expo start --dev-client
# then open the dev client on iPhone and scan the QR
Android (wireless or USB)
# One-time
eas build -p android --profile development
# Daily run
npx expo start --dev-client
# open dev client on Android and scan QR
# If Metro can’t connect over Wi-Fi:
adb reverse tcp:8081 tcp:8081 # optional; maps device port to your machine
Using Expo Router? You’re good
Dev clients work great with Expo Router. Changes to routes, screens, links, and layouts hot-reload instantly. Only native changes need a rebuild.
Troubleshooting
Stuck on “Connecting…”
- Computer and phone on the same network
- Try a tunnel:
npx expo start --tunnel
(bypasses weird Wi-Fi) - Kill other packagers using port 8081
iOS won’t install
- Make sure the iPhone is registered on your Apple team and rebuild after registration
- Enable Developer Mode and trust the developer certificate
- Reinstall from the EAS build page if the app was removed
Changes not showing
- Shake device → Reload in the dev client
- Clear cache:
rm -rf .expo && npx expo start -c
“Do I really need to rebuild?” quick test
- If you only changed JS/TS/Router code → No
- If you added/changed a plugin, permission, or SDK version → Yes
Bonus: instant OTA updates (for preview/production)
This is not required for dev clients, but useful for internal testers or production:
1) In eas.json
, keep a preview or production profile.
2) In app.json
/app.config.ts
, ensure expo-updates
is configured (SDK 53 has it by default).
3) To push an update:
eas update --branch preview --message "Fix copy on home screen"
4) For “update immediately on launch”, set:
updates: {
enabled: true,
checkOnLaunch: "ALWAYS",
fallbackToCacheTimeout: 0
}
Use this in non-dev builds where you want users to fetch new JS quickly. (Dev clients already stream from Metro.)
FAQs
Can I use the App/Play Store for dev?
No—dev clients are installed via EAS internal distribution. That’s the point: fast iteration without the stores.
Can teammates use my dev build?
Yes. Add their devices to your Apple team (iOS) or share the Android APK/QR. They’ll scan your Metro QR when you run expo start --dev-client
.
How do I debug native issues?
- iOS: open the native project in Xcode (generated when you run
npx expo prebuild
or if you use bare). - Android: use Android Studio + Logcat.
- JS debugging: React DevTools, console logs, or Flipper.
Final checklist
- [ ]
eas.json
has a"development"
profile with"developmentClient": true
- [ ] Built and installed the dev client on each device (one-time)
- [ ]
npx expo start --dev-client
running locally - [ ] Phone + computer on same network (or using
--tunnel
) - [ ] Rebuild only when you change native config
If you want, drop your iOS bundle ID and Android applicationId, and I’ll give you a copy-paste script tailored to your setup. Happy building!
This content originally appeared on DEV Community and was authored by Cathy Lai