> ## 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` produces a dev client build in the cloud.
* **Select** — `revyl dev --profile development --platform ios` resolves one named recipe for the context.
* **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 | validation]` drives the device, following an observe → act → verify pattern.
* **Create tests** — `revyl test create <name> --from-session <id>` 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.

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.

Explicit `--profile` and `--platform` values win. When they are omitted,
`revyl dev` prefers one unique development-like profile and otherwise resolves
only a sole eligible choice. Interactive ambiguity prompts; non-interactive
ambiguity fails with the valid choices. The resolved recipe remains fixed for
the context and every rebuild; no profile or platform is stored as active or
default.

## 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 | — |

Bazel and Kotlin Multiplatform are detected as build-tool or layout signals,
not as supported `build.framework` values. Configure a mixed native workspace
as separate platform-oriented Revyl projects rather than one ambiguous build.

## Dev Loop Framework Troubleshooting

| Symptom | Cause | Fix |
| - | - | - |
| "Detected Swift/iOS instead of Expo" | Detection ran outside the Expo app root or `expo` is absent from its local `package.json` | Run `revyl init --detect` from the app directory; if needed, edit `build.framework` and the generated profile, then validate |
| "Detected Android instead of Expo" | Detection ran outside the Expo app root or the native directory won an ambiguous match | Run `revyl init --detect` from the app directory; if needed, edit `build.framework` and the generated profile, then validate |
| "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" | The Expo app config does not resolve a custom scheme | Configure `expo.scheme` in the app, rebuild the dev client, and use the new build |
| "No runnable development recipe" | The project config has no usable profile/platform recipe | Edit the generated named profile and run `revyl config validate` |
| "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" | The installed dev client does not register the scheme recorded with the build | Correct the Expo app's scheme/generated-scheme settings, rebuild, and use the new build |
| No URL scheme in the app | App only uses universal links | Add `"scheme": "myapp-dev"` to app.json, rebuild dev client |
| No eligible iOS or Android recipe | The selected named profile lacks that platform recipe | Edit the profile in `.revyl/config.yaml`, then run `revyl config validate` |
| 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 |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.