Skip to content

Differences from EAS ​

React Native Deploy aims to be a drop-in for the build and submit half of EAS. Where it behaves differently, it does so on purpose and says so at the command line.

Held to by tests ​

ClaimHow it is tested
Your eas.json resolves identicallyDifferential tests run every fixture through this implementation and the real @expo/eas-json, asserting the resolved profiles and the rejections match
Commands and flags are the sameA contract test reads eas-cli's oclif.manifest.json and checks every command id, alias, flag, short char, option list and default
The CLI and the runner agreeA workflow contract test checks every plan output the workflow reads is one the CLI sends, and pins signing, failure handling and install publishing

Deliberate differences ​

EASReact Native DeployWhy
Expo account, eas login with SSO/browserGitHub tokenGitHub runs the builds
The eas commandThe rnd commandSame subcommands and flags, so a script only needs eas swapped for rnd
Builds on Expo's machinesBuilds on GitHub-hosted runners in your repoThe point of the project
eas build --localRefusedUse a runner, or npx expo run:ios
Credentials stored and generated on Expo's serversRepository secrets; rnd credentials reports, it does not create yetSee Credentials
eas build:version:set, remote version sourceRefused; versions live in app.jsonThere is no version server
eas submit --urlRefusedasc uploads local files; download first
Android eas submitNot wired up yetNeeds a Google Play service account, not asc. Upload the .aab to Play Console directly
eas update, branch, channel, env, secret, webhook, workflow:run, deploy, metadataRecognised and refused with the alternativeThey are Expo-hosted services. See the list
Internal distribution links on expo.devInstall pages on your own Cloudflare WorkerSee Internal distribution

Not there yet ​

These are known gaps rather than design decisions:

  • autoIncrement is read from the profile but not applied on the runner: every build uses the buildNumber / versionCode in app.json. App Store Connect rejects a second upload with the same build number, so bump it yourself before each store build for now.
  • rnd build --auto-submit, --auto-submit-with-profile and --what-to-test are accepted but do nothing. Run rnd build:download and rnd submit --path … after the build.
  • Credential setup has no wizard; the manual steps are in Credentials.
  • App extensions (widgets, notification services) are not signed: one provisioning profile per build, applied to the app target.
  • rnd device:create prints the asc command to run rather than registering the device.

Builds run on your GitHub Actions minutes; signing assets stay in your repo secrets.