DeployPulse

Moving from other OTA services

Stallion, Hot Updater, Codemagic Patch and Pushy each have their own SDK and their own update protocol. None of them speaks CodePush or Expo Updates, so DeployPulse cannot serve their builds. Moving means replacing their SDK with one that talks to DeployPulse, then shipping a new build.

Coming from App Center, a self-hosted CodePush server, or another CodePush-compatible service such as Codemagic CodePush, Revopush, Bitrise, Appcircle or AppZung? Those already use the CodePush protocol: see App Center Migration and Other SDKs.

The general path

  1. Remove the other SDK completely. Uninstall its package, remove its Expo config plugin entry if you have one, its keys in Info.plist and strings.xml, the native lines that hand it the JavaScript bundle (in AppDelegate and MainApplication), and its wrapper around your root component. Two update SDKs in one app both try to own the bundle at launch, so do not install ours next to theirs.
  2. Install a DeployPulse client.
  3. Create the apps with dpctl app add and the right --platform, and put their keys (or, for Expo Updates, the project ID) in the app.
  4. Ship a new build to the App Store and Google Play. The SDK is native code, so the switch only reaches users through a store update.
  5. Replace the release step in CI with dpctl release-react or dpctl release-expo. See Apps and deployments for the commands and CI for where they go.

Builds already in users' hands keep their old SDK and keep updating from the old service until users install your new build. Keep releasing there for those users until enough of them have upgraded.

After the old SDK is gone, search the project for its name to catch leftovers: imports, native imports, Podfile and Gradle lines, Jest mocks and CI steps.

Stallion

Stallion's SDK is react-native-stallion. Expo apps configure it with the expo-stallion-plugin config plugin (options projectId and appToken, optionally publicSigningKey).

To remove it:

  • Uninstall react-native-stallion, and expo-stallion-plugin with its entry in your app config's plugins.
  • In bare projects, remove StallionProjectId, StallionAppToken and StallionPublicSigningKey from Info.plist and strings.xml.
  • Replace its bundle hooks: StallionModule.getBundleURL() in AppDelegate becomes CodePush.bundleURL(), and Stallion.getJSBundleFile(...) in MainApplication becomes CodePush.getJSBundleFile(). iOS Setup and Android Setup show the exact code.
  • Replace withStallion(App) around your root component with codePush(App), and remove any useStallionUpdate or other Stallion calls.

Stallion signs releases with its own key. To sign DeployPulse releases, generate a key pair and follow Code Signing.

Hot Updater

Hot Updater's SDK is @hot-updater/react-native, configured by a hot-updater.config.ts file at the project root.

To remove it:

  • Uninstall @hot-updater/react-native and the other @hot-updater/* packages, and delete hot-updater.config.ts. Remove its config plugin entry if your app config has one.
  • Replace its bundle hooks: HotUpdater.bundleURL() in AppDelegate and HotUpdater.getJSBundleFile(...) in MainApplication become the CodePush calls in iOS Setup and Android Setup.
  • Replace the HotUpdater.wrap(...) around your root component with codePush(App).
  • Remove the HOT_UPDATER_CHANNEL key from Info.plist if it is set. The channel is now chosen by the deployment key the build carries (for example Staging or Production), or for Expo Updates by the expo-channel-name header.

Hot Updater is self-hosted. Keep your Hot Updater server and bundle storage running until no one is left on a build that uses it.

Codemagic Patch

Codemagic Patch's SDK is @codemagic/react-native-patch. It is a different product from Codemagic's CodePush SDK (@code-push-next/react-native-code-push), which Other SDKs covers.

To remove it:

  • Uninstall @codemagic/react-native-patch, and remove its entry in your app config's plugins (options deploymentKey, apiUrl, downloadBaseUrl, publicKey).
  • In bare projects, remove CodemagicPatchDeploymentKey, CodemagicPatchApiUrl, CodemagicPatchDownloadBaseUrl and CodemagicPatchPublicKey from Info.plist and strings.xml.
  • Replace its bundle hooks: CodemagicPatch.bundleURL() in AppDelegate and CodemagicPatch.getJSBundleFile(applicationContext) in MainApplication become the CodePush calls in iOS Setup and Android Setup.
  • Replace Patch.wrap(App) around your root component with codePush(App), and move any direct sync() calls to the CodePush SDK's codePush.sync().

Its deployment keys are not DeployPulse keys: put the keys from your DeployPulse apps in CodePushDeploymentKey.

Pushy and Cresc

Pushy and Cresc share one SDK, react-native-update. The app creates a Pushy or Cresc client with its appKey and usually wraps the app in UpdateProvider.

To remove it:

  • Uninstall react-native-update.
  • Remove the client, its appKey and the UpdateProvider from your JavaScript, and wrap your root component with codePush(App) instead.
  • Replace the native bundle hook its setup added ([RCTPushy bundleURL] on iOS, UpdateContext.getBundleUrl(...) on Android) with the CodePush calls in iOS Setup and Android Setup. Follow Pushy's own setup guide in reverse to find every native line it added.

Any other OTA SDK

The same path works for any other update SDK, react-native-ota-hot-update included: remove the package, its native bundle hook and its JavaScript wrapper, then set up DeployPulse from Which SDK do I need?. If you are unsure whether your setup works, get in touch.