# Migrate from CodePush — Bundle Drop Docs

> Migrate from the retired App Center CodePush to Bundle Drop with guided setup, channels, runtime versions, and safe rollback.

Canonical: https://bundledrop.app/docs/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](/docs/channels). Apps check a named channel, and proven bundles can be promoted between channels.
- **`codePush(App)` and `codePush.sync()`** become [`BundleDrop.init`](/docs/init-update-manager), [`useBundleDrop`](/docs/use-bundle-drop), and [update policies](/docs/update-policies).
- **Install modes** map to update policies.
- **Mandatory release flags** have no direct per-release equivalent. Application policy and UI own any required prompt or blocking flow; managed publishing controls server-side eligibility rather than forcing client installation.
- **Target binary version gating** maps to [runtime compatibility](/docs/runtime-version): explicit platform versions by default, opt-in native fingerprints, or both.
- **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:

**Terminal**

```bash
yarn add @gfean/react-native-bundle-drop
cd ios && pod install && cd ..
npx bundle-drop login
npx bundle-drop doctor
```

The 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](/docs/expo).

If you need to rerun the migration plan:

**Terminal**

```bash
npx bundle-drop init --project-type bare
```

There is no separate native initialization command.

### Remove Remaining CodePush Configuration

After the Bundle Drop plan is applied:

- Remove `react-native-code-push` from `package.json`.
- Remove the `codePush(App)` wrapper and `codePush.sync()` calls from JavaScript.
- Remove `CodePushDeploymentKey` from iOS `Info.plist` and Android `strings.xml`.
- Remove the `codepush.gradle` apply line from Android Gradle configuration.
- Run `pod install` again and rebuild the native app.

Run `npx bundle-drop doctor` after cleanup to confirm that the project has one consistent OTA owner.

Choose the [compatibility strategy](/resources/native-fingerprints-runtime-versions) before building the migrated app. Fingerprint mode is Beta and opt-in; it does not let an existing CodePush binary acquire Bundle Drop's native integration through an OTA. Test and distribute the rebuilt binary before publishing updates for its compatibility line.

### Move Release Tracks to Channels

Recreate CodePush deployment tracks as Bundle Drop channels. A common mapping is:

- CodePush Staging → `develop` or `beta`
- 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](/docs/init-update-manager).
- Publish with [Uploading](/docs/uploading).
- Control eligibility with [Managed Publishing](/docs/managed-publishing).
- Release gradually with [Staged Rollouts](/docs/staged-rollouts).
- Review compatibility rules in [Runtime Version](/docs/runtime-version).

### Related Docs

- [Installation](/docs/installation)
- [Expo](/docs/expo)
- [Channels](/docs/channels)
- [Update Policies](/docs/update-policies)
- [Rollback](/docs/rollback)
