> ## Documentation Index
> Fetch the complete documentation index at: https://docs.revyl.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Dev Loop

> Set up revyl dev for fast local verification with hot reload on cloud devices

The Revyl Dev Loop is a cycle that allows you to change code locally, see it on the device instantly, and convert successful flows into regression tests. This is done through the CLI command `revyl dev` that connects a live cloud device connected to your local dev server.

## The Dev Loop

* **Configure** — `revyl init` sets up hot reload with framework detection.
* **Build** — `revyl build` uploads a dev client build matching your branch.
* **Start** — `revyl dev` boots your local dev server (Metro/Expo), opens a Revyl relay tunnel, installs the build on a cloud device, and opens the session in browser. Edits go live instantly for JS-based frameworks.
* **Interact** — `revyl device [screenshot | tap | type | swipe]` drives the device, following an observe → act → verify pattern.
* **Test in dev mode** — `revyl dev test run <name>` runs existing tests against your live local code.
* **Create tests** — `revyl dev test create <name> `turns a manually-verified flow into a regression test.
* **Promote** — `revyl test push <name>` + `revyl test run <name>` moves it into the permanent regression suite outside dev mode.

See the [Expo Dev Loop Guide](/develop/dev-loop-expo-guide) and [Run your app on a cloud device](/guides/run-your-app-from-anywhere) guide to get started.

## Hot reload and rebuild configuration

Revyl best-guesses the hot reload and rebuild-loop configuration when running `revyl init`. If you need more advanced configuration, see the guides below specific to each framework    :

| Framework                                        | Hot Reload      | Rebuild Dev Loop          | Provider Name  |
| ------------------------------------------------ | --------------- | ------------------------- | -------------- |
| [Expo](./frameworks/expo)                        | Fully supported | `[r]` for native changes  | `expo`         |
| [React Native (bare)](./frameworks/react-native) | Fully supported | `[r]` for native changes  | `react-native` |
| [Flutter](./frameworks/flutter)                  | —               | `[r]` rebuild + reinstall | —              |
| [Swift/iOS](./frameworks/xcode)                  | —               | `[r]` rebuild + reinstall | `swift`        |
| [Android Native](./frameworks/gradle)            | —               | `[r]` rebuild + reinstall | `android`      |
| [Kotlin Multiplatform](./frameworks/kmp)         | —               | `[r]` rebuild + reinstall | —              |
| [Bazel](./frameworks/bazel)                      | —               | `[r]` rebuild + reinstall | —              |

## Dev Loop Framework Troubleshooting

| Symptom                                                            | Cause                                                                        | Fix                                                                                                   |
| ------------------------------------------------------------------ | ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| "Detected Swift/iOS instead of Expo"                               | Monorepo: `ios/` triggers Swift provider; `expo` not in local `package.json` | `revyl init --provider expo`                                                                          |
| "Detected Android instead of Expo"                                 | Monorepo: `android/` triggers Android provider                               | `revyl init --provider expo`                                                                          |
| "No providers detected"                                            | Missing `package.json`, wrong directory, or no framework indicators          | `cd` to the app directory; verify `package.json` has `expo` or `react-native`                         |
| "App scheme empty"                                                 | Using `app.config.js` instead of `app.json`                                  | `--hotreload-app-scheme myapp` or edit config                                                         |
| "Hot reload is not configured"                                     | `hotreload:` section missing from config                                     | Re-run `revyl init --provider expo` or add manually                                                   |
| "Port 8081 is already in use"                                      | Another Metro instance running                                               | `lsof -ti:8081 \| xargs kill` or `--port 8082`                                                        |
| "No application is registered to handle this URL scheme"           | Dev client doesn't have the scheme registered                                | Toggle `use_exp_prefix: true/false` in config; if neither works, add `scheme` to app.json and rebuild |
| No URL scheme in the app                                           | App only uses universal links                                                | Add `"scheme": "myapp-dev"` to app.json, rebuild dev client                                           |
| "Build platform 'ios' not found"                                   | `build.platforms.ios` missing from config                                    | Run `revyl init --force` to re-detect, or add manually                                                |
| Deep link fails with `LSApplicationWorkspaceErrorDomain error 115` | The URL scheme in the deep link doesn't match any installed app              | Same as "No application is registered" above                                                          |
| App closes briefly after tapping "Open" in the dialog              | Normal: dev client is reloading to connect to Metro via tunnel               | Wait for it to reopen; if it doesn't, check Metro output for JS errors                                |
| "Open in \[App Name]?" confirmation dialog                         | iOS system prompt for URL scheme handoffs                                    | Tap "Open" to proceed; this is expected behavior                                                      |
