Start an exploration
.revyl/config.yaml. Choose a
platform when the project maps more than one app. Without a branch, it uses the
app default branch and its default build. Use --branch staging to select
a branch, --build-selection latest for its newest build even when the branch
is pinned, --all-branches for the newest build across all of the app’s
branches, or --build-id for an exact build. See
Build branches.
Shape the run
balanced, surface-sweep, journey-focus, and hard-edges.
Explorers beyond available device concurrency wait in the queue. Use
--device-model, --os-version and --idle-timeout for runtime targeting.
Queue time can require a longer local wait than the exploration duration.
CLI authentication and the app’s own login are separate. Configure a seeded test
account or auth bypass, then
reference stored launch variables:
--launch-var.
Keep values out of prompts, flags, logs and committed workflow files.
Keep main or staging current
Feature-branch and PR builds don’t contain the merged code, and merging a PR doesn’t move their builds or evidence. Build the intended source, upload it to an explicit Revyl branch, then explore the exact returned build. Uploading alone doesn’t populate Atlas.Prove one run first
- Choose the source repository/branch, Revyl app ID, and destination (
mainorstaging). Start with one platform. Userevyl app list --jsonto find the app and build a compatible artifact from a clean checkout of that source. - Install a CLI release with branch support and
jq. StoreREVYL_API_KEYin your CI secret store; configure build secrets and app login separately. Set the variables below to your artifact, app and destination. - Upload and explore exactly that build. Add your stored login references to the Explore command if needed:
- Open
.report_urlfromexplore.jsonand select the destination in Atlas. Confirm the build ID, login and useful mapped screens. Keep the source SHA, build ID and report URL with the run. When the branch follows Latest build, runs that use it now use this build, because it is the newest; a pinned branch keeps its pin unless you upload with--pin. Making that branch the app’s default branch is optional.
Turn it into CI
Copy the maintenance helper and workflow into your repository. Its README lists the variables, login setup, and artifact or remote-build choices. Run it withworkflow_dispatch and inspect one complete
result before enabling the push or schedule trigger.
Build from the selected checkout, whether the helper builds remotely or uploads
an existing artifact.
Keep one writer per app and destination, from source checkout through completed
Explore. The examples share a stable concurrency group with
cancel-in-progress: false and check out the current source branch after obtaining
the slot. Reusing an earlier CI artifact requires checking its source SHA and
skipping it if superseded. Latest means upload order, not Git ancestry. GitHub
concurrency groups
coordinate within one repository; pending work can be replaced, so this maintains
the current branch rather than promising every intermediate commit is explored.
For scheduled GitHub runs, keep the workflow on the repository default branch
and explicitly check out the source you want to build. Schedules can be delayed;
the example uses an off-hour minute rather than promising an exact refresh time.
The helper saves known job/run IDs, uses bounded polling, waits for Atlas
processing, and attempts cancellation plus terminal-state checks on failure.
If the runner is lost or a launch/cancellation result is unknown, stop other
writers and reconcile the recorded operation before restarting. A CI lock or
shell cleanup handler cannot guarantee remote cleanup after runner loss.
Ask Cursor to set it up
Use this prompt after filling in the placeholders:In repositoryCursor automations can schedule an agent with a chosen repository and branch. Use the agent to dispatch the same CI workflow for recurring refreshes unless its host provides verified single-writer execution. A prompt saying “do not overlap” does not provide that guarantee.<owner/repo>, configure the Revyl branch-maintenance example for source branch<main-or-staging>, app<app-id>, and Revyl destination<main-or-staging>. Use<existing CI artifact or current-checkout build profile>and stored login reference<key-or-id>. Store API/build credentials as CI secrets. Keep one shared concurrency group for this app/destination and build the current source head after acquiring it. Run the workflow manually once; upload explicitly to the destination and explore only the returned build ID. Check login and mapped screens, then return the source SHA, build ID and report URL. Set up<push-after-merge or weekly>execution after the manual result is verified. Do not use an incidental feature checkout as the source.
JSON handoffs
Require a successful command exit for every handoff. File uploads, URL uploads, remote builds and status commands have different JSON envelopes:build --remote --detach --json returns .build_job_id, not an uploaded build.
Save it and monitor that job. Always pass the eventual exact build ID downstream;
do not look up Latest again between upload and Explore/tests.
Monitor, cancel and interpret results
By default Explore waits and reports per-explorer progress.--no-wait returns
after launch; save .run_id and poll explore status <run-id> --json.
explore status is a single read, not a follow stream. A queued/running execution
or unfinished Atlas processing is not a completed map.
--timeout limits the local wait and does not cancel remote work. Press Ctrl-C
once while waiting to cancel the Explore run and again to stop waiting. For
unattended cleanup, cancel the known run and check that it settles. Remote-build
Ctrl-C detaches; use build cancel <job-id> to cancel explicitly.
With --json, progress stays on stderr and stdout contains one result object.
Explore results include .run_id, .build_id, .report_url, .outcome and
.success. A usable partial map or setup blocker can still succeed. Failed,
cancelled, locally timed-out and no-map outcomes exit nonzero. Inspect the report:
Explore proves execution and map generation; tests prove behavioral assertions.