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: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
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: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:
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
- Expo Build Guide — Expo-specific build and upload
- CI/CD Integration — full CI pipeline setup