π± Mobile Deployment Guide (Current)
Overviewβ
AttuneLogic Mobile currently uses a split deployment model:
- OTA updates (JS-only) are published by GitHub Actions using
eas update - Native builds are triggered locally via a
pre-pushhook onbuild/*branches
Some older docs in this section reference EAS Workflows (Expo-side CI pipelines). Those pages are legacy and are not the current active pipeline.
Source of truth (mobile repo)β
Repo: attunelogic-mobile/attunelogic-mobile
- GitHub workflow:
.github/workflows/mobile-deploy.yml - Local build hook:
scripts/git-hooks/pre-push - EAS config:
eas.json - Expo config:
app.config.js
Branch modelβ
| Branch | Meaning | What happens |
|---|---|---|
feature/* | Dev work | CI runs + PR opened to beta |
beta | Ad hoc testing | GitHub Actions publishes eas update --branch beta |
alpha | TestFlight stage | GitHub Actions publishes eas update --branch alpha |
main | App Store source | GitHub Actions publishes eas update --branch production |
build/* | Build intent | Local pre-push queues eas build --profile <mapped> |
OTA updates (GitHub Actions)β
On push to:
betaβeas update --branch betaalphaβeas update --branch alphamainβeas update --branch production
Required GitHub Secretβ
EXPO_TOKEN(required to runeas updatenon-interactively)
Skip deployβ
Include [no deploy] in the commit message to skip publishing an OTA update.
Native builds (local)β
Push a build intent branch to queue a build locally before the push completes:
build/betaβeas build --profile beta --platform all --no-waitbuild/alphaβeas build --profile alpha --platform all --no-waitbuild/productionβeas build --profile production --platform all --no-wait
For iOS beta ad hoc onboarding per developer, see:
For iOS alpha TestFlight onboarding per developer, see:
Intended profile usageβ
local/development(iOS): simulator-first local dev workflowbeta: ad hoc/internal device testing (non-store distribution)alpha: TestFlight-ready store distributionproduction: App Store-ready store distribution
Skip the build hook locally:
SKIP_EAS_PREPUSH=1 git push
Local Android development launchβ
For emulator-based Android development against the local API, use the repo's Android-specific startup scripts instead of the generic Expo start command.
Recommended flowβ
Start Metro for the dev client:
cd attunelogic-mobile/attunelogic-mobile
npm run start:android
In a second terminal, build/install the app:
cd attunelogic-mobile/attunelogic-mobile
npm run android
Or run the combined local native flow:
cd attunelogic-mobile/attunelogic-mobile
npm run dev-build:local:android
Why these scripts matterβ
npm run start:androidswitches toenv:androidenv:androidsets the emulator-safe API host:http://10.0.2.2:8080/api/v1
- the Android start/build scripts disable Expo dotenv auto-merging so
.env.localdoes not override the generated Android.env
Avoid this for emulator workβ
npm start
That command runs env:local, which points the app back to localhost. On an
Android emulator, local API traffic must use 10.0.2.2.
Versioning (standard-version)β
Mobile uses standard-version (same pattern as API + Service):
npm run release
# or
npm run release:patch
npm run release:minor
npm run release:major
app.config.js reads the app version from package.json.
Rule of thumb:
- Bump version when preparing a native build
- JS-only OTA updates generally do not require a version bump
OTA compatibility (runtimeVersion)β
The mobile app currently uses runtimeVersion.policy = "appVersion".
If native-impacting changes occur, cut and distribute a new native build with the updated app version before expecting users to receive OTA updates for that runtime.
Related pagesβ
Recommended flowβ
- Build and validate locally on simulator during feature work (
local/development) - Push
feature/*β PR is opened tobeta - Merge to
betaβ GitHub Actions publishes OTA update tobeta(ad hoc lane) - Merge
betaβalphapromotion PR β publishes OTA update toalpha(TestFlight lane) - Merge
alphaβmainpromotion PR β publishes OTA update toproduction(App Store lane)