HotCodePush

Bundles and releases

A bundle is the uploaded web or JavaScript build, and a release puts it on a channel with a rollout percentage, conditions and release notes.

A bundle is the uploaded build of your app's web or JavaScript layer. A release puts a bundle on a channel with its conditions, its rollout percentage and its notes. What a device receives, the newest release it qualifies for, is an update.

A bundle

A bundle is the files of one build with a manifest listing the path, hash and size of every file. It is immutable, and bundle upload sends only the files HotCodePush does not hold yet.

A React Native or Expo build serves one platform, and the CLI uploads one per platform. A Capacitor or Cordova web build serves iOS and Android from one upload.

Each bundle carries:

  • A number is counted per app, the console's #42. It names the bundle in bundle get, release create --bundle and the release log.
  • A version label is free text read from package.json by default and set with --bundle-version. It is not unique and nothing is evaluated against it. The console shows #42 · 1.4.2.
  • Its provenance: the git commit, branch or tag, commit subject, a dirty flag and the repository slug are detected at upload.
  • The fingerprint of the native layer it was built from rides with it. Compatibility explains it.
  • A signature over the manifest comes with it when the app has a signing key. Sign your bundles sets one up.

A bundle and each file in it are at most 512 MB. Limits and fair use lists every limit and how long a bundle no release uses is kept.

A release

A release is a bundle assigned to a channel, numbered per channel in the order it was created. A bundle does nothing until it is released, and a release never changes its bundle. It carries:

  • Conditions are the rules a device must satisfy: the bundle's fingerprint, and optionally a binary range, an os range, an attribute the app set or a device list. Every condition is evaluated on the device. Target devices with attributes covers attributes and the audience preview.
  • A rollout percentage, 0 to 100, is the share of the qualifying devices that take it, with an optional progression schedule. Rollouts and auto-pause owns both.
  • A mandatory flag applies the update as soon as it is downloaded. Choose an apply strategy places it among the strategies.
  • Notes are free text shown in the console and handed to the app with the update. Notes ride the public index, so anyone holding the app id and the channel id can read them.
  • A state is active, paused or revoked.

Every release create creates a release, and so do --from-channel, which promotes what another channel serves, and a rollback. A release's notes, mandatory flag, rollout and state change in place, while its bundle never does. Pausing, revoking and rolling back are compared on Roll back a release.

The release log

A channel's page in the console is its release log: every release, newest first, with its state, rollout, conditions, commit and device count. One rule explains the table: a device takes the newest release in the channel that applies to it. A release built for an older store build keeps the devices still on that build.

release list and release get print the same log from the CLI.

Deltas and patches

A device never downloads a bundle it mostly has. It computes the files it lacks by hash, with the embedded bundle's files counting as present. Then it fetches one archive: the delta for its base, a delta HotCodePush assembles on request, or the full pack when it has no base.

On React Native and Expo the main JavaScript bundle travels inside the delta as a byte-level patch when that is smaller. A patch that cannot be applied, or a missing delta, sends the device the whole file or the full pack instead. An update never fails because of a delta, and nothing here is configured.

Last updated on

On this page