The CodePush alternative that keeps the workflow

Microsoft retired App Center CodePush on 2025-03-31. HotCodePush, the over-the-air (OTA) update service for React Native, Expo, Capacitor and Cordova, keeps the release step and adds what CodePush never had.

Compared

What changes, what stays

Verified on 2026-10-21; CodePush figures from Microsoft's retirement notice and the archived docs.

Feature HotCodePush App Center CodePush
Status Maintained, launch 2026 Retired 2025-03-31; self-hosted server archived
React Native support 0.82 and later, New Architecture only Legacy bridge only; no New Architecture support
Frameworks React Native, Expo, Capacitor, Cordova React Native, Cordova
Rollouts Percentage both ways, progression, auto-pause on failures Percentage, manual
Rollback Readiness gate on the device, one-command rollback Automatic without a ready report, otherwise manual
Compatibility Fingerprint of the native contract, by default Target binary version per release
Code signing Optional, customer key, every plan Optional, customer key

Last verified 2026-10-21.

Architecture

No backend on the check path

CodePush answered every check from its server. A HotCodePush device reads a static index from the CDN and decides for itself.

CodePush answered every update check from its server, which also picked the rollout. HotCodePush writes one small index per app, channel and platform to the CDN. The device reads it, takes the newest release that fits its fingerprint and rollout bucket, downloads a delta, one assembled on request, or the full pack, and verifies every file against its hash, or your signature when you sign. The workflow you know stays: promote, roll out, roll back.

How an update reaches a device

Diagram: the CodePush server answering an update check beside a HotCodePush device reading the static index from the CDN.

Switch in four steps

  • 1 · Replace the package

    Replace the react-native-code-push package with ours, @hotcodepush/react-native-code-push, and reinstall it. It is a package swap, not a rewrite: your native layer, your plugins and your store listing stay as they are, on a maintained SDK built for today’s React Native.

  • 2 · Map keys to channels

    Map each deployment key to a channel: your Production key becomes the production channel, your Staging key becomes staging. The split you know from CodePush stays, and a preview channel lets you test the new path on your own devices first.

  • 3 · Ship one store release

    Ship one store release with the new SDK inside. Devices on the old binary keep CodePush until they update from the store; devices on the new binary use HotCodePush from their first start, so both run side by side while your users move.

  • 4 · Release with the CLI

    Replace code-push release-react with hotcodepush release create in your CI step. It packages the bundle, signs it and works out what changed, and the main JavaScript bundle arrives as a small patch when that is smaller than the whole file.

Full migration guide

Switching from CodePush

Yes, on different store releases. Devices on the old binary keep CodePush until they update from the store; devices on the new binary use HotCodePush from the first start. Preview channels
Nothing native. The SDK is a package swap and one store release. Your deployment keys become channels; your CI step changes one command. Migrate from CodePush
Yes. Only changed files travel, and the main JavaScript bundle arrives as a byte-level patch when that is smaller than the file. How an update reaches a device
Your data is yours: the API is the export, and the audit log and usage pages download as CSV. Nothing is locked in a proprietary format. API reference

A package swap, not a rewrite.

Swap the package in your next store release.