Staged Percentage Rollouts

Release to a percentage of devices, watch the failure rate, then widen. Bucketing is deterministic per device and per release.

Roll out to a percentage

terminal
npm run ota:prod -- --rollout 10     # start narrow
yarn ota:prod --rollout 10           # yarn needs no --

Anything after -- is passed straight through to the underlying command, so a flag never forces you back to typing the whole thing.

Watch adoption and the failure rate per platform on the channel page in the dashboard, then publish again at a wider percentage when it looks healthy.

The percentage is fixed at publish time

A released bundle's rollout cannot be edited. To widen it, publish again at the higher percentage (or promote from another channel) — the new release supersedes the narrow one.

Bucketing is sha256(clientId + release) % 100 < rollout: deterministic per device and per release, so a device never flips between "update available" and "no update", and each release samples an independent slice instead of always hitting the same users.

A device outside the rollout is not stranded. The server walks from newest to oldest and serves the first release the device is both runtime-compatible with and inside the rollout for, so excluded devices keep receiving the previous stable release.

Stop a release

terminal
npm run ota:rollback                     # both platforms
npm run ota:rollback -- --platform ios   # one platform only

This takes effect on the next update check — and, unlike simply publishing less, it also rescues devices that already installed the bad release. See Rollback.