Proactive Reliability for Mobile Apps
Revyl is an AI-powered testing platform for mobile apps. Define tests in natural language, run them on cloud devices, and catch bugs before your users do. It works with iOS and Android, supports Expo / React Native / Flutter / native builds, and integrates with your CI pipeline and AI coding tools.
curl -fsSL https://revyl.com/install.sh | shirm https://raw.githubusercontent.com/RevylAI/revyl-cli/main/scripts/install.ps1 | iexbrew install RevylAI/tap/revylpipx install revyluv tool install revylThe PyPI package is CLI-only and contains the native binary for your platform,
so uv, pipx, and pip do not download executable code at first run.
Create a free account at app.revyl.com, then log in via the CLI:
revyl auth login # Approve in a browser, then credentials are stored locallyThe CLI prints an approval URL and a short code and waits. Open the URL wherever you are signed in — it does not have to be this machine, so the same command works over SSH, in a container, and in a cloud agent.
For an unattended machine, use an API key from your dashboard instead:
revyl auth login --api-key # Prompts for the key and stores it
export REVYL_API_KEY=your-api-key # Or pass it through the environmentcd your-app
revyl doctor # Check CLI, auth, connectivity
revyl auth login # Approve in a browser (if not already authed)
revyl init # Detect and write the local project config
revyl skill install --force # Install recommended agent skills
revyl build --profile development --platform ios # Build and upload one recipe
revyl dev --profile development --platform ios # Launch TUI: live-device development looprevyl init always writes a stable project.id in .revyl/config.yaml. When
detection succeeds, it also writes build.framework and named profiles for the
detected iOS and/or Android platforms before any optional interactive onboarding.
Supplying a project ID writes it locally but does not validate, attach, or publish
it; use -y to stop after local config creation. Authenticated interactive setup
can continue into the same GitHub PR-automation flow as revyl github setup, but
only after the project config has been written. When the Revyl GitHub App can
access the repository, committing that valid config to the default branch
automatically creates or resolves the matching server project. revyl config push
remains the explicit manual publication and recovery path. For an existing legacy
file, preview or perform the local conversion explicitly:
revyl config migrate --check # Summarize the migration; do not write
revyl config migrate # Confirm, back up, and replace atomically
revyl config migrate --write # Back up and replace without confirmationA successfully prepared legacy migration uses one concise human-readable
summary of whether fields will be dropped or defaulted; a write creates an
exact-byte backup. JSON --check output contains the complete migration
proposal and migration ledger. Migration
externalizes legacy top-level test aliases to conflict-checked
.revyl/tests/<alias>.yaml files, preserves an existing matching mapping
byte-for-byte, and stops on destination conflicts because those are unsafe to
write. The retired top-level workflow alias cache is reported and removed.
When authenticated, migration may make read-only verified lookups to reuse or
interactively select a project from the verified repository, resolve enabled
legacy PR-build app names to exact platform app IDs, and resolve legacy PR
workflow names to exact organization workflow IDs.
Missing, duplicate, or inaccessible workflow names are omitted and reported,
including the implicit smoke workflow from the legacy smoke_every_pr
preset. An enabled PR build is never silently omitted: app or framework meaning
that still cannot be resolved is reported as lossy and omitted from the best-effort
proposal. Inspect JSON --check before writing; afterward, compare the reported
backup or ask a coding agent to reconcile omissions. Migration
never creates or attaches a server project, pulls or publishes configuration,
or otherwise mutates server state. Edit the project YAML directly when you
need to change project settings, then run revyl config validate.
You can also create and edit manual-authority projects from the GitHub integration in
the Revyl web app. After creating a project there, run revyl config pull from that
project root (or a directory beneath it). If no local config exists, the CLI verifies
the connected GitHub repository and writes the nearest matching project's configuration to
its exact .revyl/config.yaml path; it never imports legacy or invalid remote state.
When an existing config differs, pull creates an exact-byte backup, atomically
replaces the file, and reports the backup path without prompting. If the local
project was deleted and exactly one active replacement owns that same root, pull
performs the same backup and replacement without trusting the stale ID.
Project roots are immutable. Correct a mistaken root by deleting the manual project
in the web app, creating its replacement at the intended root, then running
revyl -C <replacement-root> config pull. A Git-managed project must first return to manual
authority by removing its designated config file from the default branch; that file
removal alone preserves the project and its automation. Project deletion remains a
web operation—there is no CLI project-delete command—and preserves the repository
connection, GitHub installation, report destination, historical results, and work
that already started.
Build profiles are customer-named recipes, not active modes. A profile can
contain an iOS recipe, an Android recipe, or both. Select the profile and
platform per invocation; add --remote to execute the same inherited commands,
environment, secret references, and output contract on a Revyl cloud runner,
with that recipe's remote image and caches:
revyl build --profile development --platform ios
revyl build --profile development --platform ios --remoteWhen omitted values have exactly one eligible choice, the CLI resolves them. Otherwise it prompts interactively or fails non-interactively with the valid choices. No profile is stored as active or default.
When you're ready to run outside the dev loop:
revyl test run login-flow --build # Build, upload, and run in one step
revyl test run login-flow --no-open # Suppress default report opening for a blocking terminal run
revyl workflow create smoke-tests --tests login-flow,checkout
revyl workflow run smoke-tests # Run the full workflow
revyl explore run --platform ios # Explore the app and build its Atlas mapBlocking human-terminal test and workflow runs open their completed report by
default. Use --no-open to suppress it. No-wait, JSON, GitHub Actions, CI,
SSH, and other headless executions never open a browser.
YAML-first creation requires the selected project to already have a
.revyl/config.yaml. Pull an existing registered project, initialize a new
local project, or migrate a legacy file before creating the test:
revyl config pull # Existing project already registered with Revyl
# or: revyl init -y # New local project
# legacy only: revyl config migrate --check && revyl config migrate
revyl test create login-flow --from-file ./login-flow.yaml
revyl test create --from-session <session-id> login-flow --app <app-id>test create --from-file validates and copies the YAML into the selected
project; it never creates or migrates project configuration.
See the Revyl Docs for the full authoring workflow, YAML examples, module imports, and troubleshooting.
revyl devstarts a live-device development loop and installs a build from one named profile/platform recipe. Pass--profileand--platformexplicitly, or let Revyl resolve a unique development-like or sole eligible choice. Ambiguous interactive runs prompt; non-interactive runs fail with the valid choices. No profile or platform is stored as active or default.
Interactive revyl init asks which AI coding tool you use and installs the
recommended Revyl skills for that tool automatically. Use the bundled install
for the recommended workflow bundle, or install a single skill when the agent
should focus on one intent:
revyl skill list
revyl skill install --force # Install recommended skills
revyl skill install --name revyl-cli-dev-loop --force # Dev loop + device exploration
revyl skill install --name revyl-cli-atlas --force # Visual Atlas understanding
revyl skill install --name revyl-cli-atlas-review --force # Requested Atlas feedback changes
revyl skill install --name revyl-cli-create --force # Stable YAML test authoring
revyl skill install --name revyl-cli-auth-bypass --force # Auth bypass setup
revyl skill install --cursor --force # Force Cursor if auto-detect is ambiguous
revyl skill install --codex --force # Force Codex if auto-detect is ambiguous
revyl skill install --claude --force # Force Claude Code if auto-detect is ambiguous
revyl skill install --global --force # Install for all projects
revyl skill show --name revyl-cli-dev-loop
revyl skill export --name revyl-cli-create -o SKILL.mdUse revyl-cli-dev-loop when you want the agent to start or attach to a generic
Revyl dev loop, interact with the device, and verify with screenshots or
reports. Use revyl-cli-atlas when the agent should explore an app bottom-up as
a graph, opening relevant screenshots at each node and tracing misunderstood
connections backward through edge clips and their originating reports. Use
revyl-cli-atlas-review when the user explicitly asks the agent to create or
manage grounded Atlas annotations. Use
revyl-cli-create when you want the agent to author or refine a
stable Revyl YAML test, validate it, push it, run it, and iterate from reports.
Use revyl-cli-auth-bypass when the agent should set up test-only auth bypass
after inspecting the app. Implement the handler in the detected stack; do not
install a separate platform skill.
Example prompts:
Use the revyl-cli-dev-loop skill. Detect the app stack, start or attach to the Revyl dev loop, keep it running after Dev loop ready, and verify with revyl device screenshot before changing strategy.
Use the revyl-cli-atlas skill. Start from the app's graph anchors, visually inspect each relevant screen, traverse observed edges in both directions, and investigate misunderstood evidence through its clips and originating reports before answering.
Use the revyl-cli-create skill. Create a checkout smoke test from this flow, validate it, push it, and run it once.
Use the revyl-cli-auth-bypass skill. Set up test-only auth bypass for this app and verify valid and rejected links on a Revyl device.
For full documentation of the CLI see the Revyl Docs.
Xcode / Command Line Tools errors during brew upgrade revyl
softwareupdate --all --install --force
sudo xcode-select -s /Library/Developer/CommandLineTools
brew upgrade revylIf softwareupdate does not install Command Line Tools, reinstall them:
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select --installIf you use full Xcode builds, install the latest Xcode version from the App Store and then run:
sudo xcode-select -s /Applications/Xcode.app/Contents/DeveloperHomebrew directory ownership errors
sudo chown -R "$(whoami)" /opt/homebrew /Users/"$(whoami)"/Library/Caches/Homebrew /Users/"$(whoami)"/Library/Logs/Homebrew
chmod -R u+w /opt/homebrew /Users/"$(whoami)"/Library/Caches/Homebrew /Users/"$(whoami)"/Library/Logs/HomebrewMIT
