release
Create, update, pause, resume, revoke, roll out and roll back releases with hotcodepush release, including conditions, dry runs and progression.
hotcodepush release publishes and steers releases: a bundle assigned to a channel, numbered per channel.
--channel <id|name> names the channel, hotcodepush.json's by default, and --release <number|id> names the release.
Every verb that changes what devices receive confirms once (--yes in a script) and applies within about a minute (How an update reaches a device).
create
Release a bundle to a channel, uploading the build first unless --bundle or --from-channel names one, and wait until it is live.
The condition flags narrow who gets it (targeting, compatibility). --progression widens the rollout in steps (rollouts). --dry-run previews the audience and publishes nothing.
| Option | Type | Description |
|---|---|---|
--attribute <key=value> | string, repeatable | An attribute the app sets that the device must carry, key=value, repeatable. |
--binary-version <range> | string | The app versions served, a semver range such as ">=2.3.0 <3.0.0". |
--bundle <number|id> | string | A bundle already uploaded, by number or id. Without it the build is uploaded first. |
--bundle-version <label> | string | The bundle's version label. Defaults to the project's package.json version. |
--channel <id|name> | string, repeatable | The channel, by id or name, repeatable. Defaults to hotcodepush.json's channel. |
--device <id> | string, repeatable | A device the release is limited to, by id, repeatable. |
--dry-run | boolean | Validate and print the audience the release would reach. Nothing is signed, uploaded or published, so no private key is needed. |
--failure-action <action> | none | notify | pause | revoke | What auto-pause does when a release fails too often: pause, revoke, notify or none. |
--failure-minimum-update-count <count> | number | The applied updates a release needs before auto-pause judges it. |
--failure-threshold-percent <percent> | number | The failure percentage at which auto-pause acts. |
--from-channel <id|name> | string | Release what this channel serves, by id or name, instead of a bundle or a build. |
--git-message <subject> | string | The commit message subject to record, over the detected one. |
--git-ref <ref> | string | The branch or tag to record, over the detected one. |
--git-sha <sha> | string | The commit to record, over the detected one. |
--mandatory | boolean | Devices apply the release at once and restart. |
--no-git | boolean | Detect no git provenance. The typed --git-* flags still apply. |
--notes <text> | string | The release notes. They ride the public index. |
--os-version <range> | string | The OS versions served, a range such as ">=17". |
--path <dir> | string | The build to upload, the framework's build output by default: on React Native and Expo one platform's prepared bundle, Capacitor's webDir or Cordova's www. |
--platform <list> | string | The platforms the bundle serves, ios,android by default. |
--private-key-path <file> | string | The private key file to sign with, as signing-key create wrote it. In CI, HOTCODEPUSH_SIGNING_KEY holds its content. |
--progression | boolean | Widen the rollout step by step while the release stays healthy: 10, 50 and 100 percent by default, each step after at least an hour and 50 applied updates. |
--progression-minimum-seconds <seconds> | number | The seconds a step lasts at least before the next one, with --progression; 3600 by default. |
--progression-minimum-update-count <count> | number | The applied updates each step needs before the next one, with --progression; 50 by default. |
--progression-rollout-percents <list> | string | The percentages the rollout widens through, rising, the last above the starting rollout, with --progression; 10,50,100 by default. |
--rollout-percent <percent> | number | The share of devices the release reaches, 0 to 100; 100 by default, the schedule's first percentage with --progression. |
hotcodepush release create --path dist
hotcodepush release create --from-channel staging --channel production --binary-version ">=2.3.0" --progression --dry-runget
Print a release with its rollout, its progression, its effective auto-pause policy, its status and its counters: applied, confirmed and failed by reason. The progression step, the effective policy and the device count appear in the text output only. Results and reasons explains each failure reason.
| Option | Type | Description |
|---|---|---|
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--release <number|id> | string | The release, by its number in the channel or by its id. |
hotcodepush release get --release 43
hotcodepush release get --channel staging --release 43 --jsonThe first example prints:
ID 8c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f
Number #43
Channel production
Bundle #17 · 1.4.2 (3f0e1f0c-6b2a-4d7e-9a1b-2c3d4e5f6a7b)
Status active
Rollout 50%
Progression 10, 50, 100 percent, each step at least 3600 seconds and 50 applied updates
Progression step 2 of 3, ready at 2026-10-21T14:00:00.000Z
Failure threshold 5% (channel)
Failure minimum update count 50 (default)
Failure action pause (default)
Mandatory no
Notes cart fix
Rolled back from nothing
Live 2026-10-21T12:00:00.000Z
Devices 1204
Applied 980
Confirmed 953
Download failures 9
Verification failures 0
Crash failures 3
Readiness timeout failures 0
Reported failures 0
Created 2026-10-21T11:58:40.000Zlist
List a channel's releases, newest first, with the progression and the devices on each.
| Option | Type | Description |
|---|---|---|
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--limit <count> | number | How many to list, at most 100; 50 by default. |
--offset <count> | number | How many to skip: the offset the previous page ended with. |
hotcodepush release list
hotcodepush release list --channel staging --jsonupdate
Edit a published release in place: flip the mandatory flag, rewrite or clear the notes, change or clear an auto-pause override.
At least one change flag is needed, and a --clear-* flag hands the field back to the channel's value.
| Option | Type | Description |
|---|---|---|
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--clear-failure-action | boolean | Sets the action back to null: the channel's value applies. |
--clear-failure-minimum-update-count | boolean | Sets the minimum update count back to null: the channel's value applies. |
--clear-failure-threshold-percent | boolean | Sets the threshold back to null: the channel's value applies. |
--clear-notes | boolean | Sets the notes back to null. |
--failure-action <action> | none | notify | pause | revoke | What auto-pause does when a release fails too often: pause, revoke, notify or none. |
--failure-minimum-update-count <count> | number | The applied updates a release needs before auto-pause judges it. |
--failure-threshold-percent <percent> | number | The failure percentage at which auto-pause acts. |
--mandatory | boolean | Whether devices apply the release at once and restart. Pass false to turn it off. |
--notes <text> | string | The new release notes. |
--release <number|id> | string | The release, by its number in the channel or by its id. |
hotcodepush release update --release 43 --mandatory
hotcodepush release update --channel staging --release 43 --mandatory false --notes "cart fix" --yesrollout
Set a release's rollout percentage in either direction, or widen it step by step with --progression. A device that has the release keeps it. A percentage set by hand ends a schedule the release had.
| Option | Type | Description |
|---|---|---|
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--progression | boolean | Widen the rollout step by step while the release stays healthy: 10, 50 and 100 percent by default, each step after at least an hour and 50 applied updates. |
--progression-minimum-seconds <seconds> | number | The seconds a step lasts at least before the next one, with --progression; 3600 by default. |
--progression-minimum-update-count <count> | number | The applied updates each step needs before the next one, with --progression; 50 by default. |
--progression-rollout-percents <list> | string | The percentages the rollout widens through, rising, the last above the starting rollout, with --progression; 10,50,100 by default. |
--release <number|id> | string | The release, by its number in the channel or by its id. |
--rollout-percent <percent> | number | The share of devices the release reaches from now on, 0 to 100. With --progression it is where the schedule starts. Defaults to the release's own percentage. |
hotcodepush release rollout --release 43 --rollout-percent 50
hotcodepush release rollout --channel staging --release 43 --rollout-percent 10 --progression --yespause
Pause a release: devices on it keep it, and nobody new gets it until it is resumed.
| Option | Type | Description |
|---|---|---|
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--release <number|id> | string | The release, by its number in the channel or by its id. |
hotcodepush release pause --release 43
hotcodepush release pause --channel staging --release 43 --yes --jsonresume
Resume a paused release: devices get it again, and a new auto-pause window starts. Auto-pause then judges the release on the updates applied from this moment on.
| Option | Type | Description |
|---|---|---|
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--release <number|id> | string | The release, by its number in the channel or by its id. |
hotcodepush release resume --release 43
hotcodepush release resume --channel staging --release 43 --yes --jsonrevoke
Revoke releases for good: devices on them move to the newest older release they qualify for or the embedded bundle.
Pass one form at a time: --release, --release-from, --all or --bundle. Revoked is final, and release create --bundle releases the bundle again.
| Option | Type | Description |
|---|---|---|
--all | boolean | Every release of the channel. Its devices return to the embedded bundle. |
--bundle <number|id> | string | Every release of this bundle, by number or id, across the app's channels. Takes no --channel. |
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--release <number|id> | string | The release, by its number in the channel or by its id. |
--release-from <number> | number | The first release revoked, by number, inclusive: that one and every newer one of the channel. |
hotcodepush release revoke --release 43
hotcodepush release revoke --channel staging --release-from 40 --yes --jsonrollback
Release the channel's previous bundle again, or the one of --to-release, as a new release.
The new release is mandatory unless --mandatory false. Roll back a release is the guide.
| Option | Type | Description |
|---|---|---|
--channel <id|name> | string | The channel, by id or name. Defaults to hotcodepush.json's channel. |
--mandatory | boolean | Devices apply the rollback at once and restart, the default for an incident fix. Pass false to let them wait. |
--to-release <number|id> | string | The release whose bundle comes back, by number or id. Defaults to the channel's previous one. |
hotcodepush release rollback
hotcodepush release rollback --channel staging --to-release 41 --yesLast updated on