Migrate from CodePush
Migrate from CodePush
Microsoft retired App Center CodePush in 2025. Bundle Drop provides the same core OTA model for JavaScript and bundled assets, with channels, staged and targeted rollouts, managed publishing, patch delivery, and safe rollback.
How CodePush Concepts Map
- Deployment keys and deployments become channels. Apps check a named channel, and proven bundles can be promoted between channels.
codePush(App)andcodePush.sync()becomeBundleDrop.init,useBundleDrop, and update policies.- Install modes and mandatory updates map to update policies and managed publishing.
- Target binary version gating maps to runtime version.
- Differential updates map to Bundle Drop patch delivery with automatic full-bundle fallback.
- Rollback maps to dashboard rollback and on-device crash protection.
Run the Guided Migration
Install Bundle Drop, remove neither CodePush nor its native hooks yet, and run setup from the project root:
yarn add @gfean/react-native-bundle-drop
cd ios && pod install && cd ..
npx bundle-drop login
npx bundle-drop doctorThe project-aware setup detects the existing CodePush integration, previews the required Bundle Drop configuration, and asks before applying changes. In a bare project, it updates the existing Android and iOS bundle-resolution paths while preserving the app's current ReactHost, ReactNativeHost, or AppDelegate structure. Expo projects use the config plugin path described in Expo.
If you need to rerun the migration plan:
npx bundle-drop init --project-type bareThere is no separate native initialization command.
Remove Remaining CodePush Configuration
After the Bundle Drop plan is applied:
- Remove
react-native-code-pushfrompackage.json. - Remove the
codePush(App)wrapper andcodePush.sync()calls from JavaScript. - Remove
CodePushDeploymentKeyfrom iOSInfo.plistand Androidstrings.xml. - Remove the
codepush.gradleapply line from Android Gradle configuration. - Run
pod installagain and rebuild the native app.
Run npx bundle-drop doctor after cleanup to confirm that the project has one consistent OTA owner.
Move Release Tracks to Channels
Recreate CodePush deployment tracks as Bundle Drop channels. A common mapping is:
- CodePush Staging →
developorbeta - CodePush Production →
production
Initialize the SDK with the intended channel, then publish the first compatible Bundle Drop update. Do not reuse CodePush deployment keys; Bundle Drop project configuration and channel names replace them.
After Migrating
- Configure startup behavior with BundleDrop.init.
- Publish with Uploading.
- Control eligibility with Managed Publishing.
- Release gradually with Staged Rollouts.
- Review compatibility rules in Runtime Version.
