CLI reference
Every ubriot CLI command and option for apps, builds, credentials, push, OTA channels, updates, signing and migrations.
Install the CLI with npm install -g ubriot. It needs Node.js 18 or newer. Run ubriot <command> --help for the same options in your terminal.
Version
This page describes ubriot 1.4.0. Commands and options marked "Requires ubriot 1.3.0 or later" or "1.4.0 or later" are not in older releases. Check yours with ubriot --version.
On its way to npm
Wherever a command takes --app, you can pass the app id or its slug.
Account
| Command | What it does |
|---|---|
ubriot login | Log in with your Ubriot email and password. |
ubriot logout | Sign out and clear the saved session. |
ubriot whoami | Show the email you are logged in as. |
Apps
apps create
Create a release app.
| Option | Default | Meaning |
|---|---|---|
--name <name> | required | Display name. |
--slug <slug> | required | Slug used by the CLI and update URLs. |
--repo <url> | Git repository URL. | |
--branch <branch> | main | Default branch. |
--android-id <id> | Android application ID. | |
--ios-bundle <id> | iOS bundle identifier. | |
--google-play-track <track> | internal | Default Google Play track. |
--expo-project-root <path> | Path to the Expo app inside the repository, for monorepos. |
apps list
List your release apps with their id, slug, App Store Connect app id and whether TestFlight auto-submit is on.
apps update
Change app settings. --app <appId> is required.
| Option | Meaning |
|---|---|
--ios-bundle <id> | iOS bundle identifier. |
--android-id <id> | Android application ID. |
--expo-project-root <path> | Path to the Expo app inside the repository. |
--asc-app-id <id> | App Store Connect app id, from the app's URL in App Store Connect. |
--clear-asc-app-id | Remove the stored App Store Connect app id and look it up by bundle id. |
--auto-submit-testflight / --no-auto-submit-testflight | Turn TestFlight submission after each successful iOS build on or off. |
--google-play-track <track> | Default Google Play track, for example internal, alpha, beta or production. |
--auto-submit-google-play / --no-auto-submit-google-play | Turn Google Play submission after each successful Android build on or off. |
apps activity
ubriot apps activity <app> shows who changed what on an app, newest first. --limit <n> (default 50, at most 200) and --offset <n> page through older entries. Requires ubriot 1.3.0 or later.
ship
ubriot ship ios or ubriot ship android builds a store release and submits it to TestFlight or Google Play, then waits until the store accepts it. See Builds for the full flow.
| Option | Default | Meaning |
|---|---|---|
--app <appIdOrSlug> | expo.slug from app.json | The app to build. |
--profile <profile> | production | Build profile. |
--repo <url> | Override the repository URL. | |
--branch <branch> | Branch to build. | |
--local [path] | Build from a local directory instead of cloning the remote. The path defaults to the current directory. | |
--track <track> | internal | Google Play track for Android. |
--release-status <status> | Google Play release status: draft (the default on production) or completed for a live release. Requires ubriot 1.3.0 or later. | |
--rollout <percent> | Staged rollout percentage for a live release, above 0 and below 100. Requires ubriot 1.3.0 or later. | |
--release-notes <text> | Release notes for the Google Play release. Requires ubriot 1.3.0 or later. | |
--no-submit | Build only; do not submit to TestFlight or Google Play. | |
--reprovision-ios | Create the iOS provisioning profile again before building. | |
--ios-capability <type...> | Apple capability to ensure on the bundle ID, for example HEALTHKIT. | |
--poll-interval <seconds> | 15 | How often to check progress. |
--timeout <minutes> | 180 | Maximum wait for the build and the store submission. |
--yes | Queue without confirming toolchain warnings. Requires ubriot 1.4.0 or later. |
Builds
| Command | What it does |
|---|---|
ubriot builds create --app <app> --platform <platform> | Queue a build. Platform is android, ios or web. |
ubriot builds list [--app <app>] | List recent builds. |
ubriot builds queue | Explain why your queued builds have not started: queue position, worker availability and a rough start time. Requires ubriot 1.3.0 or later. |
ubriot builds last-good [--app <app>] | Show the last successful build per app, platform and profile, and how many builds have failed since. Requires ubriot 1.3.0 or later. |
ubriot builds show <buildId> | Print the build record as JSON. |
ubriot builds logs <buildId> | Print the build logs. |
ubriot builds watch <buildId> | Stream logs and status changes until the build and any store submission finish. |
ubriot builds cancel <buildId> | Cancel a queued or running build. |
ubriot builds retry-upload <buildId> | Retry only the artifact upload stage of a failed build. |
ubriot builds submit-testflight <buildId> | Upload the build's .ipa to App Store Connect. |
ubriot builds reset-testflight <buildId> | Clear a stuck TestFlight submission so you can retry. |
ubriot builds submit-google-play <buildId> | Upload the build's .aab to Google Play. |
ubriot builds reset-google-play <buildId> | Clear a stuck Google Play submission so you can retry. |
ubriot builds artifacts <buildId> | List the build's artifacts. |
builds create takes --profile (default production), --repo, --branch, --wait, --submit-testflight (iOS), --submit-google-play (Android), --track (default internal), --release-status, --rollout, --release-notes, --poll-interval (default 15), --timeout (default 180) and --yes, with the same meaning as on ship. builds submit-google-play takes --track, --release-status, --rollout and --release-notes. On both commands, --release-status, --rollout and --release-notes require ubriot 1.3.0 or later, and --yes on builds create requires ubriot 1.4.0 or later. builds watch takes --poll-interval (default 5), --timeout (default 180) and --no-logs to print only status changes.
Credentials
Every upload takes --app <appId> and --name <name>. See Credentials for when you need each one.
| Command | Options |
|---|---|
ubriot credentials upload-asc-key | --key-p8 <path>, --key-id <id>, --issuer-id <id> |
ubriot credentials upload-ios-cert | --p12 <path>, --p12-password <pwd>, --team-id <id> |
ubriot credentials upload-ios-profile | --profile <path>, --bundle-id <id> |
ubriot credentials upload-apple-id | --apple-id <email>, --app-specific-password <password> |
ubriot credentials setup-testflight | Guided Apple ID setup; takes only --app. |
ubriot credentials upload-android | --keystore <path>, --keystore-password <pwd>, --key-alias <alias>, --key-password <pwd> |
ubriot credentials upload-google-service-account | --json <path> |
ubriot credentials upload-apns-key | --key-id <id>, --team-id <id>, --bundle-id <id>, --key-p8 <path>, --environment <production or sandbox> (default production) |
ubriot credentials upload-firebase-service-account | --json <path> |
ubriot credentials upload-github-token | --token <token> |
ubriot credentials list | --app <appId> |
ubriot credentials copy | --from <credId>, --to-app <appIdOrSlug>, optional --name <name> and --bundle-id <id> |
ubriot credentials delete <credId> | None. |
Push
| Command | What it does |
|---|---|
ubriot push setup --app <app> | Guided setup of APNs and Firebase credentials and a backend server key. |
ubriot push create-server-key --app <app> [--name <name>] | Create a server key for your backend. The key is shown once. |
ubriot push list-server-keys --app <app> | List server keys and whether each is active or revoked. |
ubriot push revoke-server-key <keyId> | Revoke a server key. |
push setup options: --project-dir <dir>, --expo-config <path>, --platform <ios, android or all> (default all), --name <prefix> (default Ubriot Push), --ios-bundle <id>, --android-package <id>, --apns-key-id <id>, --apns-team-id <id>, --apns-key-p8 <path>, --apns-environment <production or sandbox> (default production), --firebase-service-account <path>, --server-key-name <name> (default Backend), --skip-server-key, --new-server-key and --force-credentials. See Notify.
OTA updates
update
ubriot update exports and publishes an OTA update from the current Expo or bare React Native app. See OTA updates.
| Option | Default | Meaning |
|---|---|---|
--app <appIdOrSlug> | expo.slug from app.json | The app to publish to. |
--channel <channel> | production | OTA channel. |
--runtime-version <version> | runtimeVersion from app.json | Runtime version. |
--message <msg> | current git short SHA | Release note. |
--platform <platform> | all | ios, android or all. |
--export-dir <dir> | dist | Export output directory. |
--expo-config <path> | resolved app config | Path to app.json or an exported Expo config JSON. Defaulting to the resolved app.config.js or app.json requires ubriot 1.3.0 or later; older releases default to app.json. |
--public-url <url> | your API base | Public API base URL used in asset URLs. |
--bare | detected | Bundle a bare React Native app with the React Native bundler instead of expo export. Requires ubriot 1.3.0 or later. |
--entry-file <file> | package.json main or index.js | Bare React Native entry file. Requires ubriot 1.3.0 or later. |
--no-export | Publish an existing export directory without exporting again. | |
--yes | Publish without confirming the runtime reach warning or the local Node.js version warning. Requires ubriot 1.3.0 or later; the Node.js check needs 1.4.0. | |
--private-key-path <path> | OTA signing private key PEM. Requires ubriot 1.3.0 or later. | |
--certificate-path <path> | Signing certificate PEM matching the private key. Requires ubriot 1.3.0 or later. | |
--sign-with <keyid> | Sign with this local key; repeat during a rotation. Requires ubriot 1.3.0 or later. |
channels
| Command | What it does |
|---|---|
ubriot channels list --app <app> | List channels and the update group each points at. |
ubriot channels create --app <app> --name <name> | Create a channel. |
ubriot channels point --app <app> --channel <name> --update-group <id> | Point a channel at an update group, for example to roll back. |
updates
| Command | What it does |
|---|---|
ubriot updates list --app <app> | List published updates. |
ubriot updates publish | Publish an existing expo export output or manifest files. |
ubriot updates resign --app <app> | Sign live update groups again with the current key. Requires ubriot 1.3.0 or later. |
updates publish requires --app, --channel and --runtime-version, and takes --message, --export-dir <dir>, --expo-config <path> (default app.json), --platform (default all), --public-url, --manifest-android <path>, --manifest-ios <path>, --yes, --private-key-path, --certificate-path and --sign-with. --yes, --private-key-path, --certificate-path and --sign-with require ubriot 1.3.0 or later. Pass --export-dir, or at least one of the manifest options.
updates resign takes --group <id> to sign only one update group, plus --sign-with, --private-key-path, --certificate-path and --project-dir.
Signing
Requires ubriot 1.3.0 or later. See OTA code signing for the full guide.
On its way to npm
| Command | What it does |
|---|---|
ubriot signing init --app <app> | Generate a key and certificate, keep the private key outside the repository, register the certificate. |
ubriot signing import --app <app> --certificate <path> --keyid <keyid> | Register an existing certificate, for example one from EAS Update. |
ubriot signing configure --app <app> | Write the certificate into app.json for expo-updates or ubriot-updates-rn. |
ubriot signing status --app <app> | Show keys, expiry, device counts, rejections and recent unsigned publishes. |
ubriot signing retire --app <app> --keyid <keyid> | Stop accepting new publishes signed by a key; existing signatures keep being served. |
ubriot signing revoke --app <app> --keyid <keyid> | Stop serving a key's signatures and refuse publishes signed by it. --confirm <keyid> skips the prompt. |
ubriot signing require --app <app> | Refuse unsigned publishes. --off allows them again. |
ubriot signing issue-leaf --app <app> --root-key <path> | Chain mode: issue a new signing certificate from the offline root, register it and re-sign live updates. |
ubriot signing rotate --app <app> | Guided rotation. Chain mode issues a new leaf; simple mode creates the next key for a new binary. |
ubriot signing verify-binary <file> | List the signing certificates embedded in an .ipa, .apk or .aab. --app also compares them with the app's keys. |
ubriot signing managed create --app <app> | Create a Ubriot-managed signing key (paid plans). |
ubriot signing managed rotate --app <app> | Rotate the Ubriot-managed key. |
ubriot signing managed audit --app <app> | Show every managed signature and key change. |
Common signing options:
| Option | Default | Used by |
|---|---|---|
--mode <mode> | simple (chain for managed create) | init, import, configure, managed create |
--keyid <keyid> | main in simple mode | init, import, configure, issue-leaf, rotate, managed create |
--key-dir <dir> | ../ubriot-keys | init, issue-leaf, rotate |
--cert-dir <dir> | certs | init, issue-leaf, rotate, managed create, managed rotate |
--project-dir <dir> | . | most signing commands |
--validity-years <n> | 10 | init, simple mode rotate |
--leaf-validity-days <n> | 365 | chain mode init |
--validity-days <n> | 365 | issue-leaf, chain mode rotate |
--root-certificate <path> | import, issue-leaf, rotate | |
--chain <path> | chain mode import | |
--private-key-path <path> | import (the path is remembered locally, never uploaded) | |
--expo-config <path> | app.json | configure |
--also-trust <keyid> | configure, ubriot-updates-rn only, repeatable | |
--certificate <path> | configure with a Ubriot-managed certificate | |
--keep-old | issue-leaf, rotate | |
--allow-in-repo | init, issue-leaf, rotate: allow private keys inside the git working tree | |
--yes | init, rotate: skip the backup confirmation |
Migrate
| Command | What it does |
|---|---|
ubriot migrate codepush | Move a React Native app from App Center CodePush to Ubriot OTA. |
ubriot migrate eas | Move an Expo app from EAS Build and EAS Update to Ubriot. |
Both are a dry run unless you pass --apply. Options: --project-dir <dir> (default .), --expo-config <path> (default app.json), --app <slug> (default expo.slug), --channel <channel> (default production), --runtime-version <version>, --apply, and --yes to skip the clean git tree check.
ask
ubriot ask "<question>" asks the Release Copilot about your builds, failures, release health and readiness. Requires ubriot 1.3.0 or later.