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

# Frameworks

> Pick your framework for build and dev-loop setup, and see which frameworks hot reload.

Pick your framework to see the exact commands for building and uploading your app.

- [Web (Next.js and static Vite)](/frameworks/web) (alpha)
- [Expo](/frameworks/expo)
- [React Native (bare)](/frameworks/react-native)
- [Flutter](/frameworks/flutter)
- [iOS Native (Swift)](/frameworks/ios)
- [Android Native](/frameworks/android)
- [Kotlin Multiplatform](/frameworks/kmp)
- [Bazel](/frameworks/bazel)

The dev loop below covers iOS and Android. Web apps run from a bundle or a deployed preview
instead; see the [Web guide](/frameworks/web). Web is in alpha. To add it to your organization, email [support@revyl.ai](mailto:support@revyl.ai).

## Hot Reload vs Rebuild

| Framework | Dev Loop Model | When to Rebuild |
|-----------|---------------|-----------------|
| Expo | Hot reload (JS/TS changes are live) | Only when native dependencies change |
| React Native (bare) | Hot reload (JS/TS changes are live) | Only when native dependencies change |
| Flutter | Rebuild on every change | Every code change (Dart compiles into the binary) |
| Swift/iOS | Rebuild on every change | Every code change (binary is the app) |
| Android Native | Rebuild on every change | Every code change (binary is the app) |

For Expo and React Native, the uploaded build is a "dev client shell" -- your JS/TS code is served live from your local Metro server via a Revyl relay. For Flutter, Swift, and Android, the binary **is** the app.

## Platform Build Requirements

Every framework's default debug build satisfies Revyl's artifact requirements out of the box. If you're shipping a custom configuration — narrowed `abiFilters`, release builds, `.ipa` archives — see **[Build Artifact Requirements](/builds/artifact-requirements)** for the full rules and trade-offs.

## 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/ios) | — | `[r]` rebuild + reinstall | `swift` |
| [Android Native](/frameworks/android) | — | `[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 |
