The CLI uses a .revyl/ directory for project configuration:
your-app/
├── .revyl/
│ ├── config.yaml # Project configuration
│ ├── tests/ # Local test definitions
│ │ └── login-flow.yaml
│ └── .gitignore # Allowlist: only config.yaml and tests/ are committed
└── ...
project:
name: "my-app"
build:
system: Expo
command: "npx --yes eas-cli build --platform ios --profile development --local --output build/app.tar.gz"
output: "build/app.tar.gz"
platforms:
ios-dev:
command: "npx --yes eas-cli build --platform ios --profile development --local --output build/dev-ios.tar.gz"
output: "build/dev-ios.tar.gz"
app_id: "uuid-of-ios-dev-app"
ios-ci:
command: "npx --yes eas-cli build --platform ios --profile preview --local --output build/ci-ios.tar.gz"
output: "build/ci-ios.tar.gz"
app_id: "uuid-of-ios-ci-app"
android-dev:
command: "npx --yes eas-cli build --platform android --profile development --local --output build/dev-android.apk"
output: "build/dev-android.apk"
app_id: "uuid-of-android-dev-app"
hotreload:
default: expo
providers:
expo:
app_scheme: "my-app"
port: 8081
platform_keys:
ios: ios-dev
android: android-dev
defaults:
open_browser: true
timeout: 600
last_synced_at: "2026-02-10T14:30:00Z" # Auto-updated on sync operations| Section | Description |
|---|---|
project |
Project name |
build.system |
Build system type (Expo, Gradle, Xcode, Flutter, ReactNative) |
build.command |
Default build command |
build.output |
Default build artifact path |
build.platforms |
Named platform configurations with per-platform build commands, artifact paths, and app IDs |
hotreload |
Hot reload provider configuration for revyl dev |
defaults |
Default settings for CLI behavior |
last_synced_at |
Timestamp of last sync operation (auto-managed) |
hotreload:
default: expo
providers:
expo:
port: 8081
app_scheme: myapp
platform_keys:
ios: ios-dev
android: android-dev
# use_exp_prefix: true # If deep links fail with base schemehotreload:
default: react-native
providers:
react-native:
port: 8081
platform_keys:
ios: ios-dev
android: android-devBare 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. All developers' 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.
| Key | Type | Default | Description |
|---|---|---|---|
open_browser |
bool |
true |
Auto-open browser for test open, device start --open, etc. |
timeout |
int |
600 |
Default timeout in seconds for device sessions and test runs |
revyl config path # Show config file location
revyl config show # Display current configuration
revyl config set open-browser false # Disable auto-opening browser
revyl config set timeout 900 # Set default timeoutThese environment variables override CLI defaults and config values:
| Variable | Description |
|---|---|
REVYL_API_KEY |
API key for authentication (overrides stored credentials) |
REVYL_BACKEND_URL |
Override the backend API URL (e.g. http://127.0.0.1:8000) |
REVYL_APP_URL |
Override the frontend app URL |
REVYL_BACKEND_PORT |
Override the auto-detected backend port in --dev mode |
REVYL_PROJECT_DIR |
Override the project directory for MCP server |
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 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.