MysticX Release Workflow
1. Local Development
Run the app locally with hot-reload:
| Platform | Command |
|---|---|
| iOS Simulator | npx expo start --ios |
| Android Emulator | npx expo start --android |
| Both + picker | npx expo start |
2. Build Locally
Build on your machine — faster feedback, no queue wait.
Prerequisites:
- iOS: Xcode + CocoaPods (
sudo gem install cocoapods) - Android: Android SDK + JDK 17
- Credentials configured via
eas credentials
Development builds
bash
eas build --profile development --platform ios --local
eas build --profile development --platform android --localPreview builds
bash
eas build --profile preview --platform ios --local
eas build --profile preview --platform android --localProduction builds
bash
eas build --profile production --platform ios --local
eas build --profile production --platform android --localOutput files are saved to the project root (.ipa for iOS, .aab/.apk for Android).
3. Submit to Stores
Submit a locally-built artifact:
bash
eas submit --platform ios --path ./build-*.ipa
eas submit --platform android --path ./build-*.aabThis sends:
- iOS build to App Store Connect → available in TestFlight
- Android build to Google Play Console → available in internal testing track
First time setup: Run eas credentials to configure your Apple and Google credentials.
4. OTA Updates (quick JS-only fixes)
Push JS-only updates without rebuilding:
bash
eas update --branch production --message "description of change"This updates both iOS and Android apps simultaneously.
Requires: expo-updates to be installed and configured in your app.
5. Publish to Stores
iOS — App Store
- Go to App Store Connect
- Select your app → prepare a new version
- Choose the build from TestFlight
- Fill in release notes, screenshots, etc.
- Submit for App Review
Android — Google Play
- Go to Google Play Console
- Select your app → Production
- Create a new release and select the build from internal testing
- Fill in release notes, screenshots, etc.
- Submit for review
EAS Remote Builds (alternative)
When you prefer to offload builds to EAS servers instead of building locally.
Remote development builds
bash
eas workflow:run .eas/workflows/create-development-builds.ymlRemote preview builds
bash
eas workflow:run .eas/workflows/create-preview-builds.ymlRemote production builds
bash
eas workflow:run .eas/workflows/create-production-builds.ymlRemote build + submit to stores
bash
eas workflow:run .eas/workflows/submit-to-stores.ymlOTA update
bash
eas workflow:run .eas/workflows/ota-update.ymlPR preview
Automatically runs on pull requests — lints, type-checks, and publishes a preview update.
Lint + type-check
bash
eas workflow:run .eas/workflows/lint-and-typecheck.ymlQuick Reference
| Task | Command |
|---|---|
| Local Development | |
| Run locally (iOS) | npx expo start --ios |
| Run locally (Android) | npx expo start --android |
| Local Builds | |
| Dev build (iOS) | eas build --profile development --platform ios --local |
| Dev build (Android) | eas build --profile development --platform android --local |
| Preview build (iOS) | eas build --profile preview --platform ios --local |
| Preview build (Android) | eas build --profile preview --platform android --local |
| Production build (iOS) | eas build --profile production --platform ios --local |
| Production build (Android) | eas build --profile production --platform android --local |
| Submit | |
| Submit iOS build | eas submit --platform ios --path ./build-*.ipa |
| Submit Android build | eas submit --platform android --path ./build-*.aab |
| OTA Update | |
| Push JS update | eas update --branch production --message "fix" |
| EAS Remote (alternative) | |
| Remote dev builds | eas workflow:run .eas/workflows/create-development-builds.yml |
| Remote preview builds | eas workflow:run .eas/workflows/create-preview-builds.yml |
| Remote production builds | eas workflow:run .eas/workflows/create-production-builds.yml |
| Remote build + submit | eas workflow:run .eas/workflows/submit-to-stores.yml |
| Remote OTA update | eas workflow:run .eas/workflows/ota-update.yml |
| Remote lint + type-check | eas workflow:run .eas/workflows/lint-and-typecheck.yml |