Releases
EAS profiles, fingerprint runtime versions, and the release command.
The one command
bun run release:mobile # from the REPO ROOT — never `eas build` directlyIt force-reinstalls node_modules first because the fingerprint runtime version hashes native library dirs — a local expo run:android mutates them in place, and eas-cli then computes a runtime version from a dirty tree while the EAS worker uses a clean install → "Runtime version mismatch" failures.
Profiles (eas.json)
| Profile | Channel | Purpose |
|---|---|---|
production | production | Store build (AAB), auto-increment build/version, APP_ENV=production |
production-apk | production | APK variant |
preview / staging | preview / staging | Internal distribution APKs, APP_ENV=staging |
development | development | Dev client |
simulator | simulator | iOS simulator with E2E env (dev Convex deployment) |
All profiles pin Bun 1.4.0. appVersionSource: "remote" lets EAS own the build number and version code. The app version comes from apps/mobile/package.json (currently 1.10.0).
Every profile with an ios block pins ios.image to macos-tahoe-26.5-xcode-26.6, and android.image stays on latest. When the pin went in, latest pointed at that same image, so no build changed. The pin stops a later move of latest to a newer Xcode from reaching a store build before anyone has verified it. The EAS images run Node 22, the same major as CI and apps/mobile/.nvmrc.
Fingerprint rules
runtimeVersion: { policy: 'fingerprint' } hashes native deps and package.json scripts — adding a script casually orphans OTA updates for shipped binaries.
An SDK bump changes native dependencies on both platforms, so the fingerprint changes with it. The first SDK 58 binary is therefore a store build, and no SDK 58 update can reach 1.10.0 or any older binary.
Since develop moved to SDK 58, it cannot produce an SDK 57 build or an update the shipped app accepts. main still holds SDK 57 until the next develop to main merge, so an SDK 57 hotfix in that window has to start from main. Where it ships from is a release decision the team has not made yet.
OTA and submit
bun run update:staging|productionships EAS Updates per channel (EXPO_NO_DOTENV=1always).- Submit: iOS
ascAppId 6739470101(teamW395XK2FFY); Android service account atcredentials/androidCert.json(gitignored — copy exists in the pre-monorepo checkout at../../../ProjectR/credentials/), trackalpha. With the cert present,eas build --auto-submitcovers both platforms.