RevOnc EAS Deployment
Complete guide for deploying the RevOnc mobile app through EAS (Expo Application Services).
Account & Project Identity
| Property | Value |
|---|---|
| Account | revonc |
| Project | @revonc/RevOnc |
| Project ID | 2c936c80-d59b-480b-aad7-77fcba4c01cf |
| EAS CLI Version | 16.16.0+ required |
Dashboard Links
| Resource | URL |
|---|---|
| Project Dashboard | https://expo.dev/accounts/revonc/projects/RevOnc |
| Builds | https://expo.dev/accounts/revonc/projects/RevOnc/builds |
| Updates | https://expo.dev/accounts/revonc/projects/RevOnc/updates |
Build Profiles Overview
┌─────────────────────────────────────────────────────────────────────────────┐
│ EAS BUILD PROFILES │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ development preview testflight-internal testflight │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌─────────┐│
│ │ Simulator│ │ Internal │ │ Internal │ │External ││
│ │ + Debug │ │ QA │ │ Beta Testers │ │ Beta ││
│ │ Client │ │ │ │ (staging) │ │ (prod) ││
│ └──────────┘ └──────────┘ └──────────────┘ └─────────┘│
│ │
│ Channel: Channel: Channel: Channel: │
│ development preview staging production │
│ │
│ Purpose: Purpose: Purpose: Purpose: │
│ - Local dev - APK/IPA QA - Revonc_team (5) - Pilot (102)│
│ - Metro bundler - Internal test - Test OTA first - Production │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
| Profile | Distribution | Channel | iOS | Android | Purpose |
|---|---|---|---|---|---|
development |
Internal | development |
Simulator | APK | Local debugging |
development:device |
Internal | development |
Device | APK | Physical device debugging |
local |
Internal | — | Simulator | APK | Fast local builds (no channel) |
preview |
Internal | preview |
Default | Default | Internal QA |
testflight-internal |
Store | staging |
— | — | Internal beta (Revonc_team) |
testflight |
Store | production |
— | — | External beta (Pilot) |
production |
— | production |
— | App Bundle | Store release |
Quick Commands
Check Status
# Account info
eas whoami
# Project info
eas project:info
# List recent builds
eas build:list --limit 10
# List channels
eas channel:list
# List updates on a branch
eas update:list --branch production --limit 5
Build Commands
# Internal testing (Revonc_team) - staging channel
eas build --profile testflight-internal --platform ios --auto-submit
# External testing (Pilot) - production channel
eas build --profile testflight --platform ios --auto-submit
# Preview APK for Android QA
eas build --profile preview --platform android
# Production release
eas build --profile production
eas submit --profile production
OTA Updates (Over-The-Air)
# Push to internal testers first (Revonc_team)
eas update --channel staging --message "description"
# Push to production after verification (Pilot + App Store)
eas update --channel production --message "description"
# Rollback if needed
eas update:rollback --channel production
TestFlight Distribution
Two-Channel Strategy
| Profile | Channel | TestFlight Group | Purpose |
|---|---|---|---|
testflight-internal |
staging |
Revonc_team (5 internal) | Test OTA updates first |
testflight |
production |
Pilot (102 external) | Stable, verified updates |
Staged Publishing Workflow
1. Push to staging → eas update --channel staging --message "..."
└─► Revonc_team (5 internal testers) receives update
2. Verify update works (test in app)
3. Push to production → eas update --channel production --message "..."
└─► Pilot (102 external testers) + App Store users receive update
Build & Submit Commands
# Build for internal TestFlight (staging channel)
eas build --profile testflight-internal --platform ios --auto-submit
# Build for external TestFlight (production channel)
eas build --profile testflight --platform ios --auto-submit
Channel vs Profile Names
⚠️ CRITICAL: Profile names ≠ Channel names
Build Profile → Embedded Channel
─────────────────────────────────────────
development → development
preview → preview
testflight-internal → staging
testflight → production ← NOT "testflight"!
production → production
WRONG:
eas update --channel testflight --message "Fix" # Creates orphan updates!
CORRECT:
eas update --channel production --message "Fix" # TestFlight + App Store receive
OTA vs App Store Releases
| Change Type | Method | Command |
|---|---|---|
| Bug fix (JS only) | OTA | eas update --channel production |
| New feature (JS only) | OTA | eas update --channel production |
| New native module | App Store | eas build --profile testflight |
| SDK upgrade | App Store | eas build --profile testflight |
| App icon/splash change | App Store | eas build --profile testflight |
App Configuration
Current values from app.config.js:
| Property | iOS | Android |
|---|---|---|
| Bundle ID / Package | be.revonc.mobileapp |
be.revonc.mobileapp |
| Version | 1.0.0 |
1.0.0 |
| Build Number | 102 (manual increment) |
Version Code: 18 |
| Apple Team ID | J6V6MWLU44 |
— |
| Expo SDK | 52.0.48 |
52.0.48 |
| Runtime Version | 1.0.0 |
1.0.0 |
Incrementing Build Number
For new TestFlight submissions, increment buildNumber in app.config.js:
ios: {
// Build 102 submitted Jan 29, 2026. Increment manually for new TestFlight builds.
buildNumber: "103", // ← Increment this
}
Local TestFlight Builds (Free)
Build and submit to TestFlight without EAS costs (requires Mac with Xcode):
# Automated script
./scripts/deploy-testflight.sh
# Skip prebuild for faster rebuilds
./scripts/deploy-testflight.sh --skip-prebuild
First-Time Setup
- Create App Store Connect API Key (appstoreconnect.apple.com → Users and Access → Keys)
- Download
.p8file to~/.appstoreconnect/private_keys/ - Create
.env.localwith credentials:
API_KEY_ID=your-key-id-here
API_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
APPLE_TEAM_ID=your-team-id-here
⚠️ WARNING: Local builds do NOT embed EAS channels. Users on local builds cannot receive OTA updates!
Submit Configuration
iOS (App Store Connect)
| Apple ID | ASC App ID |
|---|---|
tech@revonc.be |
6752873821 |
Android (Play Store)
| Service Account | Track |
|---|---|
./service-account-file.json |
internal |
Troubleshooting
OTA Updates Not Received
- Verify channel in
eas.jsonmatches update target - Check runtime version compatibility (
1.0.0) - Have users close app completely and reopen twice
Build Failures
# Clear EAS cache
eas build --clear-cache --profile <profile> --platform <platform>
# Check build logs
eas build:view <build-id>
Credential Issues
# Re-configure credentials
eas credentials --platform ios
eas credentials --platform android
Users Not Getting Updates
- Check if binary was built with correct channel:
- EAS build → has channel → receives OTA
- Local build → NO channel → cannot receive OTA
- Verify user is on correct TestFlight group
- Check
eas update:list --branch production
Pre-Deployment Checklist
## RevOnc Mobile Release Checklist
### Code Readiness
- [ ] All tests pass: npm run test:run
- [ ] Linters pass: npm run lint && npm run typecheck
- [ ] No console errors in app
### Testing
- [ ] Feature tested on iOS Simulator
- [ ] Feature tested on Android Emulator
- [ ] OTA pushed to staging first
- [ ] Revonc_team verified update works
### Release
- [ ] Build number incremented (if new binary)
- [ ] Commit message clear
- [ ] OTA pushed to production
Triggers
/eas/revonc-deploy- "deploy to testflight"
- "push ota update"
- "build ios"
- "build android"
- "publish to app store"
- "eas build"
- "eas update"