Skip to main content
revyl dev runs your local app on a cloud iOS simulator or Android emulator. You keep editing code in your own workspace. Revyl provisions the device, installs your development build, starts hot reload, and opens a live viewer. For Expo and React Native, most JavaScript and TypeScript changes hot reload through Metro. For other stacks, Revyl rebuilds and reinstalls when a change needs a new binary.

Before you start

  • The Revyl CLI, signed in with revyl auth login.
  • A development build uploaded to a Revyl app. For iOS that’s a simulator .app or a zipped .app, not an .ipa. For Android it’s a debuggable APK whose native libraries include x86_64 or arm64-v8a. See Artifact requirements.
  • A terminal in your app’s directory, the one that holds the mobile project.
1

Set up the project

This writes .revyl/config.yaml with a stable project.id. When detection works, it also writes build.framework and named iOS and Android profiles. If it picked a nested native project, run revyl init --detect from the app directory, adjust the profile, and run revyl config validate.
2

Start the loop

Revyl starts your dev server, installs the branch’s development build, and opens the live viewer in your browser. Add --profile <name> if your project has more than one development profile, or --build-version-id <id> to install a specific build.
3

Make a change

Save a file. Expo and React Native changes reload through Metro. For native changes, trigger a rebuild and wait for it:
4

Check the result

Drive the device from a second terminal while the loop runs:
Work in small steps: look at the screen, take one action, confirm it did what you expected.
Stop the loop with revyl dev stop.

Run the loop in the background

Coding agents and scripts should start the loop detached and read its state as JSON:
--detach returns once the device session is ready and prints the handshake with --json. The build keeps running behind it.

Build native iOS changes remotely

--remote builds native iOS changes on a Revyl build runner instead of your machine. Add --seed-latest to install your branch’s latest build right away, then swap in the fresh build when it lands.

Attach to a session someone already started

If a teammate or agent already has the right device state open from the dashboard, attach your local loop to it instead of starting over:

Sign in early

If your app needs an account, decide how the loop reaches a signed-in state before you start debugging: a test account with seeded data, a staging-only demo mode, or a test-only auth bypass deep link. If the app logs out mid-session while the boot token is still valid, revyl dev auth refresh fires the deep link again.

Troubleshooting

For framework-specific errors, see Dev loop framework troubleshooting.

Good to know

  • Dev contexts are per worktree, so separate worktrees each get their own loop without --context.
  • The device stops after 300 seconds idle. Change that with --timeout.
  • revyl dev never stores an active profile or platform. Explicit flags win; otherwise it uses the only development-like profile it finds.
  • Every flag is listed in the revyl dev reference.