ProjectR Docs
Mobile

Releases

EAS profiles, fingerprint runtime versions, and the release command.

The one command

bun run release:mobile   # from the REPO ROOT — never `eas build` directly

It 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)

ProfileChannelPurpose
productionproductionStore build (AAB), auto-increment build/version, APP_ENV=production
production-apkproductionAPK variant
preview / stagingpreview / stagingInternal distribution APKs, APP_ENV=staging
developmentdevelopmentDev client
simulatorsimulatoriOS 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|production ships EAS Updates per channel (EXPO_NO_DOTENV=1 always).
  • Submit: iOS ascAppId 6739470101 (team W395XK2FFY); Android service account at credentials/androidCert.json (gitignored — copy exists in the pre-monorepo checkout at ../../../ProjectR/credentials/), track alpha. With the cert present, eas build --auto-submit covers both platforms.

On this page