Ubriot Docs

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

This needs ubriot 1.4.0, which is on its way to npm. The current npm release is 1.2.0.

Wherever a command takes --app, you can pass the app id or its slug.

Account

CommandWhat it does
ubriot loginLog in with your Ubriot email and password.
ubriot logoutSign out and clear the saved session.
ubriot whoamiShow the email you are logged in as.

Apps

apps create

Create a release app.

OptionDefaultMeaning
--name <name>requiredDisplay name.
--slug <slug>requiredSlug used by the CLI and update URLs.
--repo <url>Git repository URL.
--branch <branch>mainDefault branch.
--android-id <id>Android application ID.
--ios-bundle <id>iOS bundle identifier.
--google-play-track <track>internalDefault 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.

OptionMeaning
--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-idRemove the stored App Store Connect app id and look it up by bundle id.
--auto-submit-testflight / --no-auto-submit-testflightTurn 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-playTurn 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.

OptionDefaultMeaning
--app <appIdOrSlug>expo.slug from app.jsonThe app to build.
--profile <profile>productionBuild 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>internalGoogle 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-submitBuild only; do not submit to TestFlight or Google Play.
--reprovision-iosCreate the iOS provisioning profile again before building.
--ios-capability <type...>Apple capability to ensure on the bundle ID, for example HEALTHKIT.
--poll-interval <seconds>15How often to check progress.
--timeout <minutes>180Maximum wait for the build and the store submission.
--yesQueue without confirming toolchain warnings. Requires ubriot 1.4.0 or later.

Builds

CommandWhat 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 queueExplain 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.

CommandOptions
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-testflightGuided 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

CommandWhat 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.

OptionDefaultMeaning
--app <appIdOrSlug>expo.slug from app.jsonThe app to publish to.
--channel <channel>productionOTA channel.
--runtime-version <version>runtimeVersion from app.jsonRuntime version.
--message <msg>current git short SHARelease note.
--platform <platform>allios, android or all.
--export-dir <dir>distExport output directory.
--expo-config <path>resolved app configPath 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 basePublic API base URL used in asset URLs.
--baredetectedBundle 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.jsBare React Native entry file. Requires ubriot 1.3.0 or later.
--no-exportPublish an existing export directory without exporting again.
--yesPublish 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

CommandWhat 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

CommandWhat it does
ubriot updates list --app <app>List published updates.
ubriot updates publishPublish 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

This needs ubriot 1.3.0, which is on its way to npm. The current npm release is 1.2.0.
CommandWhat 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:

OptionDefaultUsed by
--mode <mode>simple (chain for managed create)init, import, configure, managed create
--keyid <keyid>main in simple modeinit, import, configure, issue-leaf, rotate, managed create
--key-dir <dir>../ubriot-keysinit, issue-leaf, rotate
--cert-dir <dir>certsinit, issue-leaf, rotate, managed create, managed rotate
--project-dir <dir>.most signing commands
--validity-years <n>10init, simple mode rotate
--leaf-validity-days <n>365chain mode init
--validity-days <n>365issue-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.jsonconfigure
--also-trust <keyid>configure, ubriot-updates-rn only, repeatable
--certificate <path>configure with a Ubriot-managed certificate
--keep-oldissue-leaf, rotate
--allow-in-repoinit, issue-leaf, rotate: allow private keys inside the git working tree
--yesinit, rotate: skip the backup confirmation

Migrate

CommandWhat it does
ubriot migrate codepushMove a React Native app from App Center CodePush to Ubriot OTA.
ubriot migrate easMove 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.

On this page