Skip to main content
Patterns for getting your app binary into Revyl from any CI system.

Pattern 1: Upload from a URL (simplest)

If your build system produces a downloadable artifact URL (EAS, Bitrise, AppCenter, S3, GCS, GitHub Actions artifacts) then you can skip the local download entirely. The Revyl backend downloads the artifact from the URL, validates, and stores the artifact server-side using this command:
For authenticated URLs:

Pattern 2: Revyl CLI in GitHub Actions

Use the CLI after your workflow builds the app. In GitHub Actions, pass the PR head SHA as the build version so Revyl can match the artifact back to the pull request.

Pattern 3: Build on CI, Upload File

Build on the runner and upload the artifact directly:

iOS on macOS runners

GitHub Actions includes macOS runners on all paid plans.

Android on Linux runners

Pattern 4: EAS Cloud + URL Upload (no Mac, no local build)

For Expo teams, delegate the build to EAS and just ingest the result:
The EAS command requires Expo authentication; use EXPO_TOKEN for unattended CI. The Revyl upload separately requires REVYL_API_KEY. Zero Mac is needed on the customer side: Expo’s cloud does the build, and Revyl ingests the artifact.

Pattern 5: revyl build (config-driven)

If .revyl/config.yaml has build commands configured, the CLI can build and upload in one step:
This resolves exactly one named profile/platform recipe, runs its setup_commands followed by build_commands, then resolves and uploads output_path. CI should always configure app_id and pass --profile and --platform explicitly so configuration growth cannot make selection ambiguous. To run that same recipe on a Revyl cloud runner instead of the CI machine:

Pattern 6: Preview URL (no device at upload time)

--preview prints a URL that auto-starts a simulator with that exact build when a signed-in org member opens it. Upload itself does not start a device.
--json stays the same envelope and adds optional preview_url on the build object (/sessions/launch?buildId=<id>). Post that URL on the PR. Opening it starts a simulator and opens the normal session viewer. The launch page reads platform from the uploaded build’s app. Refreshing /sessions/launch while a start is in flight opens the same session. After that start settles, opening the durable preview URL again starts a new device. Refreshing the live session does not start another device. For a link that always opens the app’s most recent build instead of one pinned upload, use /sessions/launch?appId=<app_id>. The latest build is resolved each time the link is opened, so one iOS link and one Android link (one per app) stay current as CI uploads new builds. Copy this link from the Apps page row menu (“Copy preview link”).

CI-Friendly Flags

Next Steps