.md

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:

  • NavigationcreateRouter stacks restore, so you stay on the screen you were styling.
  • Marked statecreateHotState(initial, key?) is a drop-in createSignal that survives reloads (selected tab, form draft, scroll target).
  • The storecreateSkalStore data was never in the bundle to begin with.
A bundle that throws on reload doesn't brick the session — Skal re-mounts the last good bundle and prints the error, so you fix the typo and save again.

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

CommandWhat it does
skal dev <target>build + launch with reload-on-save; auto-boots an emulator if none is attached
bun run testhost widget tests (flutter test) — see Testing
bun run test:e2eMaestro flows against the real app — see Testing
bun run codegenregenerate 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.