Frameworks
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) (alpha)
- Expo
- React Native (bare)
- Flutter
- iOS Native (Swift)
- Android Native
- Kotlin Multiplatform
- Bazel
The dev loop below covers iOS and Android. Web apps run from a bundle or a deployed preview instead; see the Web guide. Web is in alpha. To add it to your organization, email 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 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 | Fully supported | [r] for native changes | expo |
| React Native (bare) | Fully supported | [r] for native changes | react-native |
| Flutter | — | [r] rebuild + reinstall | — |
| Swift/iOS | — | [r] rebuild + reinstall | swift |
| Android Native | — | [r] rebuild + reinstall | android |
| Kotlin Multiplatform | — | [r] rebuild + reinstall | — |
| 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 |