Skip to main content
The CLI uses a .revyl/ directory for project configuration:

config.yaml

Section Reference

Build Configuration

The build contract is intentionally small:
  1. Run commands in order, or run command for single-command streams, unless the artifact already exists.
  2. Resolve an output artifact.
  3. Upload that artifact into the configured Revyl app stream.
build.platforms is the main surface for real projects. Platform keys are names you choose; they do not need to be only ios or android. Use separate keys when the same codebase produces multiple useful streams, such as ios-dev, ios-release, android-debug, or ios-checkout.
Use commands when a build stream needs multiple ordered shell steps. Keep using command for a single build command. If both are present, commands takes precedence. Then run:

Artifact-First CI

If GitLab, GitHub Actions, Bazel, or another build system already produced the artifact, skip the config-driven build step and upload the artifact directly:
This is the recommended shape for large monorepos, generated CI DAGs, and pipelines with their own cache heuristics. Revyl does not need to own the build graph; it needs the final mobile artifact and the Revyl app stream it belongs to.

Bazel

Bazel works through the same command/output contract. Configure the concrete target and the artifact path Bazel writes:
If your Bazel setup uses remote cache or remote execution, keep those settings in your Bazel config, wrapper script, or CI environment. The current .revyl/config.yaml schema does not have first-class target, remote_cache, remote_executor, cache-volume, or pipeline-DAG fields.

Hot Reload Configuration

Expo

Bare React Native (no Expo)

Bare React Native does not require app_scheme. The device loads the JS bundle directly over the Revyl relay to Metro. revyl dev resolves builds within the selected app stream (platform_keys / build.platforms), and prefers builds whose metadata branch matches your current git branch. Team usage: The platform_keys (e.g. ios: ios-dev) map to build.platforms.<key>.app_id, which is a shared app container for your team. Developers’ revyl build and revyl build upload commands push to this container, tagged with their git branch. revyl dev automatically picks the right build for your branch. For JS projects (Expo/React Native), the binary changes infrequently so sharing works well. For native projects (Swift/Kotlin), each code change needs a fresh build — branch-specific uploads become essential.

Defaults

Project Settings

Environment Variable Overrides

These environment variables configure CLI defaults, credentials, and integration behavior:

.gitignore Defaults

The .revyl/.gitignore generated by revyl init uses an allowlist approach: everything inside .revyl/ is ignored by default except for the shared project files listed below. Committed (shared with your team):
  • .revyl/config.yaml — project configuration
  • .revyl/tests/** — local test definitions
  • .revyl/.gitignore — the ignore rules themselves
Everything else under .revyl/ (device sessions, MCP artifacts, PID files, etc.) is local runtime state and stays out of version control automatically.

Test Aliases

Test aliases are managed as files in .revyl/tests/. Each file maps to a remote test via _meta.remote_id. Legacy tests: entries in config.yaml are automatically migrated to stub files on first use.