Short answer
- Legacy CodePush is useful as a vocabulary and protocol reference, but App Center retired and Microsoft archived the original React Native client repository.
- EAS Update is the natural default for teams already centered on Expo’s runtime versions, channels, branches, previews, and EAS services.
- NitroPush fits React Native and Expo teams that prefer deployment-key environments, a Nitro Modules SDK, native update analytics, health-confirmed rollback, ECDSA signing, and optional binary deltas.
Feature and operating-model comparison
| Decision area | App Center CodePush | EAS Update | NitroPush |
|---|---|---|---|
| Service status | App Center retired; original RN repository archived | Actively maintained by Expo | Actively developed NitroPush platform |
| Release organization | Apps, deployments, target binary versions | Projects, runtime versions, channels, branches | Projects, environments, app versions, platforms |
| Client selection | Deployment selected by client/deployment key | Channel-to-branch mapping with runtime compatibility | Deployment key plus platform, app version, and rollout bucket |
| Expo workflow | Not its primary model | First-party Expo integration | Expo config plugin |
| Bare React Native | Historical native integration | Supported through expo-updates integration | Documented Swift/Kotlin bundle hooks |
| Rollouts | Percentage-based deployment releases | Gradual rollouts through EAS Update tooling | Percentage-based release rollout |
| Rollback model | Rollback/release history plus client recovery behavior | EAS rollback and error-recovery mechanisms | Previous-bundle recovery when notifyAppReady() never confirms launch |
| End-to-end signing | Legacy CodePush signing support | Available on EAS Production and Enterprise plans | ECDSA P-256 project key; private key stays with publisher |
| Delta delivery | Package diff behavior varied by service/client | Expo documents bundle diffing for current SDKs | Optional bsdiff patch with hash and full-bundle fallback |
| Billing model | Original hosted service retired | Plan allocation plus updated MAUs and edge bandwidth | Free evaluation; Pro base plus authenticated developer seats |
Release vocabulary mapping
| Intent | CodePush | EAS Update | NitroPush |
|---|---|---|---|
| Separate test and production | Deployments | Channels and branches | Environments and deployment keys |
| Native compatibility boundary | Target binary version | Runtime version | App version and platform |
| Publish update | CodePush CLI release | eas update | nitropush release upload |
| Progressive release | Rollout percentage | Rollout strategy/channel mapping | Release rollout percentage |
Migration effort
Moving away from the original App Center service normally requires a new native binary because the installed application must point at a maintained provider and, for EAS Update or NitroPush, use a different native runtime. That means the transition has two populations: users on the old binary and users who installed the replacement-enabled binary.
Expo’s official guide instructs teams to remove CodePush, configure EAS Update, and resubmit the app. NitroPush likewise requires its SDK and deployment key to ship in a store build. Plan the overlap instead of assuming an OTA provider can replace itself over the air.
Security and signing
TLS protects transport, while end-to-end signing lets the installed app verify who produced the bundle. Expo documents code signing for Production and Enterprise subscriptions. NitroPush registers your public key, signs in local development or CI with your private PEM, and verifies the ECDSA P-256 signature on-device before activation.
Sources: EAS Update code signing and NitroPush bundle signing.
Cost model
EAS Update’s current usage model combines updated monthly active users and global edge bandwidth beyond plan allocations. NitroPush Pro starts at $29 per month with five authenticated developer seats and charges $5 per additional seat; device and traffic analytics are not billable. Compare the complete operating model rather than base prices alone.
Source: Expo usage-based pricing documentation. Prices and allocations last checked August 29, 2026.
Which should you choose?
Choose EAS Update when…
Your team already benefits from Expo’s runtime, channel, preview, build, workflow, and dashboard model.
Choose a compatible host when…
The smallest possible change to an existing CodePush SDK and deployment workflow is the top constraint.
Choose NitroPush when…
You want the NitroPush release model, native analytics and recovery signals, signing, and optional delta delivery across Expo or bare React Native.
The biggest conceptual difference: who controls the release stream?
CodePush applications traditionally request a deployment selected through a deployment key, and the client can override that target at runtime. EAS Update defaults to a server-side mapping: a build points to a channel, the channel points to a branch for a compatible runtime, and the service returns the selected update. NitroPush uses a deployment key to select an isolated environment, then filters by platform, runtime version, release state, and rollout bucket.
This affects preview workflows. A CodePush-style system can make a test build switch deployments. EAS supports channel-focused workflows and documents channel surfing for controlled runtime switching. NitroPush environments are designed as explicit test, stage, and production boundaries. Choose the model your release operators can explain during an incident.
Runtime compatibility in practice
Suppose native binary 2.0 adds a new camera method. A JavaScript bundle that calls it cannot safely run on binary 1.9. CodePush target binary versions, EAS runtime versions, and NitroPush runtime/app-version targeting all exist to prevent that mismatch. The provider can enforce only the value you publish, so the release process must update the compatibility identifier whenever the native contract changes.
A strong test suite should publish one compatible and one incompatible update for every native release candidate. Confirm selection on both old and new binaries before production. Fingerprinting can help detect native changes, but it does not replace a documented runtime-version policy.
CI/CD workflow differences
CodePush-style pipeline
The historical workflow bundles JavaScript, targets an app/deployment and binary version, publishes a label, and optionally applies a rollout percentage or mandatory flag. Compatible services often preserve some of that CLI and deployment vocabulary.
EAS Update pipeline
EAS CLI exports and publishes an update to a channel or branch within an Expo project. Teams can connect publication with EAS Workflows or another CI provider. Runtime version and environment configuration determine compatibility, while the EAS dashboard exposes update groups and adoption information.
NitroPush pipeline
The NitroPush CLI accepts a prepared Expo export directory or CodePush-style Hermes/JavaScript artifact, or can bundle a project. The release declares project, environment, runtime version, label, and bundle source. Signing and delta generation are explicit upload options. Promotion and rollout operate on release records after publication.
Rollback is three separate operations
- Stop future delivery: prevent additional devices from receiving a problematic release.
- Move already-running users: publish or select a known-good update for devices that successfully activated the bad release.
- Recover failed launches: restore the previous local bundle when the new one cannot reach a healthy state.
Marketing pages often collapse these into one “rollback” checkbox. Ask each provider to demonstrate all three cases, including an offline device and an application that crashes before JavaScript telemetry initializes.
Analytics are not directly comparable
A download count answers whether bytes moved. An install event answers whether the SDK wrote or activated a package. A launch event answers whether the application started it. A health confirmation answers whether the application reached a known-good state. Adoption dashboards can use different denominators, so request the event definitions before comparing percentages.
NitroPush emphasizes native lifecycle events because failed JavaScript startup can prevent JavaScript analytics from running. EAS publishes update insights and adoption tooling as part of its service. Legacy CodePush installations and compatible providers vary, so validate the exact server and SDK combination you plan to deploy.
Organizational fit matters as much as SDK features
Small Expo-focused team
EAS Update often minimizes conceptual and tooling overhead because it shares the project, account, build, preview, and workflow ecosystem the team already uses.
Mixed Expo and bare React Native portfolio
NitroPush can provide one update API and control plane while allowing Expo plugin integration and direct native integration. Validate each app’s React Native version and native host structure.
Large organization preserving CodePush processes
A maintained compatible provider may reduce retraining and CI changes. Balance that convenience against the maintenance history and architecture limits of the chosen client fork.
Regulated or infrastructure-heavy organization
Self-hosting can help meet data-residency or network requirements, but it also creates an operational system that needs access control, audit logs, signing-key processes, disaster recovery, capacity testing, and an owner.
Questions teams ask before deciding
Does EAS Update work with bare React Native?
Yes. Expo documents integration into existing native apps, although the application adopts Expo modules and the expo-updates runtime.
Is NitroPush a drop-in CodePush server?
No. NitroPush uses its own native SDK and release protocol. The migration requires a store binary and CI changes, which is why the dedicated migration guide begins with native-binary adoption.
Can we use EAS Build with another OTA provider?
Build and OTA delivery are separate decisions. A team can use an Expo/EAS build workflow while embedding another native OTA client, provided the application configuration and build process are tested together.
Which product is cheapest?
There is no universal answer. Model updated installations, average payload after compression, release frequency, bandwidth, seats, storage, support, and engineering time. Recalculate when providers change plan allowances.