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.
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.
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.
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.
Switching from CodePush
A package swap, not a rewrite.
Swap the package in your next store release.
Questions? Join our Discord or contact us.