Concepts

EAS build profiles

Builds are described by profiles in eas.json. Three matter:

Profile Distribution For
development internal Dev client, local development
preview internal → APK / ad-hoc Testers. Sets APP_ENV=preview
production store The stores. Store signing
{
  "cli": { "version": ">= 14.4.1", "appVersionSource": "remote" },
  "build": {
    "preview": {
      "distribution": "internal",
      "autoIncrement": true,
      "env": { "APP_ENV": "preview" }
    }
  }
}

Local builds

We build locally (the --local flag) so we don’t spend EAS cloud credits. The compiled .apk / .ipa / .aab lands in ./build/ on your machine.

The golden rule

An internal (ad-hoc) build can’t be uploaded to the store, and a store build can’t be installed directly on a phone. They’re signed differently and are not interchangeable. Mixing them up is the number-one time-waster — keep the two paths separate in your head.

Firebase App Distribution ≠ the stores

Firebase App Distribution is a free channel that hosts a build and emails testers a link. Registering an “app” there creates no App Store or Play listing — it’s purely a delivery pipe, which is exactly why we can automate it from the command line.

Bundle id

An internal build that uses the production bundle id will replace the store app on a device (they can’t coexist). On Android, if a differently-signed store version is installed, the tester must uninstall it first.