Hot reload & the dev loop
Save-to-screen in under a second — without losing your place in the app. How live reload works, what survives it, and the rest of the daily loop.
Hot reload
skal dev <target> watches src/. On save, the new bundle is pushed to the running app and re-evaluated inside the live JS VM — no process restart, no native rebuild:
↻ App.jsx changed — reloaded in 380 ms navigation + hot state preserved
The outgoing generation tears down cleanly (its Solid roots dispose, the host resets the widget tree by id), then the new bundle mounts in place. What carries across:
- Navigation —
createRouterstacks restore, so you stay on the screen you were styling. - Marked state —
createHotState(initial, key?)is a drop-increateSignalthat survives reloads (selected tab, form draft, scroll target). - The store —
createSkalStoredata was never in the bundle to begin with.
Prefer manual control? Run the bundle watcher (bun run dev) in a second terminal and reload with r in the flutter run one. In release builds, all reload machinery is compiled out — zero overhead ships.
The rest of the loop
| Command | What it does |
|---|---|
skal dev <target> | build + launch with reload-on-save; auto-boots an emulator if none is attached |
bun run test | host widget tests (flutter test) — see Testing |
bun run test:e2e | Maestro flows against the real app — see Testing |
bun run codegen | regenerate pub.dev widget adapters — see Wrapping packages |
skal build <target> | shippable release artifact with the bytecode cache baked in |
Benchmarks
The kitchen-sink demo is how you sanity-check your own hardware: boot timing prints on every launch ([skal] init=… boot=…), the JS tab's bench buttons drive prop-write throughput and the 10,000-item feed, and the in-app meter shows per-frame drain cost live. Methodology and budget invariants: docs/BENCHMARKS.md. Run it on your own hardware:
$ git clone https://github.com/skal-multiplatform/skal && cd skal $ SKAL_PREBUILT=1 bun run setup # prebuilt libskal — no toolchain needed $ bun run dev:android # kitchen-sink; watch the boot line + perf meter
The published comparison figures are a different harness: benchmark_v2, on a Samsung Galaxy A14 5G against React Native 0.86 / Expo 57, release builds on both sides with runs interleaved. Method, raw data and the arms React Native wins are in BENCHMARKS.md. If your hardware disagrees with us, open an issue — that's a bug in the claim or a bug in the code, and either way we want it.