Skip to main content
.revyl/config.yaml is the configuration file for local and remote builds. It is generated when revyl init runs for the first time in your project. Optional overrides can also be passed into revyl build.

A complete example

build:
  platforms:
    ios:
      app_id: "<your-ios-app-uuid>"
      commands:
        - bun install
        - bunx expo prebuild --platform ios
        - cd ios && pod install
        - cd ios && xcodebuild -workspace YourApp.xcworkspace -scheme YourApp -configuration Release -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' -derivedDataPath build ARCHS=arm64
      output: ios/build/Build/Products/Release-iphonesimulator/*.app
      image: ios-macos-26-xcode-26.5
      env:
        EXPO_PUBLIC_API_URL: https://staging.example.com

    android:
      app_id: "<your-android-app-uuid>"
      commands:
        - bun install
        - bunx expo prebuild --platform android
        - cd android && ./gradlew assembleRelease
      output: android/app/build/outputs/apk/release/*.apk

Platform entries

Each key under build.platforms is a named build stream. The key must be, or contain, ios or android. ios, android, ios-dev, and android-release all work. Pass the key to --platform; passing just ios or android picks the best-matching stream.
FieldRequiredDescription
app_idYesUUID of the Revyl app that stores this stream’s builds.
commandsOne of commands/commandOrdered build commands, run in sequence. Takes precedence over command.
commandOne of commands/commandSingle build command.
setupNoOptional command run before commands.
outputRecommendedPath or glob to the built artifact, relative to the project root. See artifact resolution.
schemeNoXcode scheme. When set, the CLI applies it to xcodebuild commands. iOS only.
imageNoToolchain image key to build on. Defaults to the platform’s current default image.
envNoEnvironment variables for the build. See environment variables.
cachesNoCache disks for this stream. See Caching.
Steps run in the project root. Each commands entry is a shell command, so cd android && ./gradlew … and A=B tool … both work.

Artifact resolution

After the last command exits 0, Revyl resolves the artifact:
  • iOS: output path or glob pointing at a simulator .app bundle. If unset, Revyl searches build/**/*.app. The bundle must be a simulator build (-sdk iphonesimulator).
  • Android: output path or glob pointing at an .apk. If unset, Revyl searches **/build/outputs/apk/**/*.apk. .aab artifacts are rejected.
Set output explicitly whenever more than one artifact could match, like a flavor matrix producing several APKs, or a cached DerivedData directory holding stale products.

Environment variables

Variables are exported into the shell for every build command, so use whatever your toolchain reads — EXPO_PUBLIC_* variables that Expo inlines into the bundle, ENVFILE for react-native-config, or auth tokens for private registries and Sentry uploads:
build:
  platforms:
    ios:
      env:
        EXPO_PUBLIC_API_URL: https://staging.example.com
        SENTRY_AUTH_TOKEN: sntrys_xxxxxxxx
Override or add variables per invocation:
revyl build --remote --platform ios --env EXPO_PUBLIC_API_URL=https://staging.example.com
--env values take precedence over the config file’s env map.
Private registries. Pass tokens through env and use your normal install commands to configure npm, CocoaPods, Gradle, or Git credentials. If your dependencies are only reachable on a private network, contact [email protected].

Repo-backed builds

For repositories too large to upload per build, configure a Git source so the runner fetches code directly:
build:
  source:
    type: git
    repo_url: [email protected]:company/mobile-monorepo.git
    ref: main            # branch, tag, or commit SHA
    subdir: apps/mobile  # optional monorepo project directory
    lfs: true            # fetch Git LFS objects
With a Git source configured, the CLI skips the archive upload. Local uncommitted edits to tracked files are still included: the CLI uploads them as a patch that the runner applies after checkout. Repository access credentials are provisioned per organization. Contact [email protected] to set up a deploy key or access token for private repositories.

CLI reference

revyl build --remote [flags]
FlagDescription
--platform <key>Platform or config key: ios, android, ios-dev, … Defaults to ios.
--app <id>App UUID override. Defaults to the stream’s app_id.
--image <key>Toolchain image override. Wins over the config image field.
--env KEY=VALUEEnvironment override, repeatable. Wins over the config env map.
--version <string>Version label for the registered build. Auto-generated when omitted.
--detachQueue the build and return the job ID without waiting.
--no-cacheRun this build without restoring or saving caches.
--no-set-currentDon’t make the new version the app’s current build.
--jsonMachine-readable result on stdout.
--debugStream full build logs while following.
Managing running builds:
revyl build status <build-job-id>
revyl build status <build-job-id> --follow
revyl build cancel <build-job-id>
revyl build list

Timeout

Remote builds are stopped by the server when they exceed their timeout — 60 minutes by default, up to a maximum of 4 hours. Optionally set it per platform with the timeout key, in seconds:
build:
  platforms:
    ios:
      timeout: 3600
Or per invocation with revyl build --remote --timeout 3600. Ctrl-C stops following the build; the build keeps running in the cloud. Cancel it with revyl build cancel <build-job-id>.