Documentation

Getting started with Ubriot CI/CD and Ubriot Notify.

Quickstart: zero to TestFlight

From an empty terminal to a build processing in TestFlight. First app takes about five minutes; every app after that is two commands.

1. Install and log in

npm install -g ubriot
ubriot login

2. Create your app

ubriot apps create \
  --name "My App" --slug myapp \
  --repo https://github.com/you/yourrepo.git --branch main \
  --ios-bundle com.you.myapp

Monorepo? Point Ubriot at the app folder with --expo-project-root apps/mobile.

3. Add Apple credentials (first app only)

Two uploads, once per Apple developer account. Every future app reuses them automatically.

# App Store Connect API key (.p8) - from appstoreconnect.apple.com → Users → Integrations
ubriot credentials upload-asc-key --app myapp --name "ASC Key" \
  --key-p8 AuthKey_XXXX.p8 --key-id XXXX --issuer-id YYYY

# Distribution certificate (.p12) - exported from Keychain or the Apple Developer portal
ubriot credentials upload-ios-cert --app myapp --name "Distribution Cert" \
  --p12 dist.p12 --p12-password <password> --team-id ZZZZ

4. Ship

ubriot ship ios

Signing is provisioned automatically: Ubriot registers your bundle ID with Apple and creates the App Store provisioning profile from your stored credentials. No Apple portal visit, no profile downloads. The command builds the binary, uploads it, and tracks App Store Connect until TestFlight marks the build valid.

Android is the same shape: ubriot ship android after uploading your keystore and Play service account.

Every app after the first

ubriot apps create --name "Next App" --slug nextapp --ios-bundle com.you.nextapp --repo <url>
ubriot ship ios

Credentials are account-level, signing is auto-provisioned: two commands, end to end.

CI/CD - iOS & Android builds

Ubriot handles iOS and Android builds in the cloud. Upload your signing credentials once and trigger builds from the CLI or dashboard.

1. Upload signing credentials

In the dashboard go to Credentials → Add credential (or use the CLI). For iOS, upload your distribution certificate (.p12) and App Store Connect API key (.p8) once; they are account-level and reused by every app. Provisioning profiles are created automatically at ship time: Ubriot registers the bundle ID with Apple and mints the App Store profile for you. For Android upload your keystore and Google Play service account JSON. All credentials are AES-256 encrypted at rest and never logged.

2. Trigger a build

From the CLI:

# iOS build + TestFlight submission
ubriot ship ios

# Android build + Google Play submission
ubriot ship android

# OTA update only (no build required)
ubriot update

Or go to Builds in the dashboard and click Trigger build.

OTA updates

Publish JavaScript-only changes directly to devices without waiting on App Store review. Roll forward or back from the dashboard at any time.

Configure your app

Point expo-updates at your Ubriot manifest URL (replace your-app-slug with your release app slug from Ubriot):

// app.config.js / app.json - updates.url (exact field depends on Expo SDK)
// Example manifest base:
"https://api.ubriot.dev/api/v1/ubriot/updates/manifest?appId=your-app-slug"

// Devices request updates on launch; channel matches your ubriot update --channel.

New binaries must include this URL. Existing installs keep their previous update host until users upgrade the app.

Publish an update

ubriot update --channel production --message "Fix checkout bug"

The update is live to all devices on the production channel within seconds. Roll back from the dashboard under Updates if needed.

Notify - push notifications

Send iOS and Android push notifications directly to APNs and FCM. Per-device pricing, auto-retry, campaigns, and delivery logs.

1. Upload push credentials

Go to Credentials in the dashboard. For iOS: add an APNs auth key (.p8 file with Key ID, Team ID, and Bundle ID). For Android: add a Firebase service account JSON from the Firebase console.

2. Install the SDK

npm install @ubriot/notify-rn

No additional dependencies. Works with Expo, react-native-firebase, or any push library.

3. Register at app launch

Get a native push token however your app already does it, then pass it to Ubriot:

import { UbriotNotify } from '@ubriot/notify-rn';
import * as Notifications from 'expo-notifications'; // or firebase, etc.

useEffect(() => {
  async function register() {
    const { data: nativeToken } = await Notifications.getDevicePushTokenAsync();
    await UbriotNotify.register({
      appId: 'your-app-id',
      nativeToken,
      platform: Platform.OS === 'ios' ? 'ios' : 'android',
      userId: currentUser?.id, // optional
    });
  }
  register();
}, []);

4. Send from your backend

Use the push server key from Credentials → Push server key:

curl -X POST https://api.ubriot.dev/api/v1/ubriot/push/send \
  -H "X-Ubriot-Push-Key: your-server-key" \
  -H "Content-Type: application/json" \
  -d '{
    "to": ["UbriotPushToken[abc123...]"],
    "title": "New message",
    "body": "Alice replied to your post",
    "data": { "screen": "chat", "threadId": "42" }
  }'

5. Broadcast campaigns

To send to all registered devices at once, go to Notify → Campaigns in the dashboard and click Send campaign. Choose a platform filter (All / iOS / Android), write your notification, and send. Delivery counts appear as soon as APNs and FCM respond.

SDK reference

UbriotNotify.register(opts)
Register a native push token with Ubriot. Returns a stable UbriotPushToken. Idempotent - safe to call on every launch.
UbriotNotify.identifyUser(userId, opts)
Link a device to a user ID in your system. Pass pushToken from register(). Call after login.

Need help?

Email hello@ubriot.dev. Enterprise customers get a dedicated Slack channel. Check the FAQ for common questions about builds, credentials, and OTA updates.