Quickstart
QuickstartScaffold a new project, edit one file, and watch it run on web, iOS, and Android with hot-reload.
Scaffold a project`idealyst new` creates a fresh Rust crate seeded with the welcome example — a complete reactive app the CLI knows how to build for every supported target. You get a single, platform-agnostic Rust crate; there are no iOS or Android project files in your directory.
idealyst new my-app
cd my-app
Project layoutYour crate is platform-agnostic Rust. There's no web.rs / ios.rs / android.rs split, and there are no Xcode or Gradle wrapper projects committed alongside your code. When you run `idealyst dev` or `idealyst run <platform>`, the CLI generates the per-target wrapper under `target/idealyst/<platform>/`, builds it, and launches it — the wrapper is ephemeral and you don't edit it.
my-app/
  Cargo.toml          # crate-type: cdylib + rlib
  index.html          # web entry, loads /pkg/my_app.js
  fonts/              # bundled typeface assets
  src/
    lib.rs            # app() + register_extensions()
    app.rs            # the root component
    components/       # one file per ui! element
Exporting the per-target wrapper as an editable Xcode / Gradle project (for App Store releases, custom native code, etc.) is a planned follow-up. Today the CLI is the build pipeline; tomorrow you'll be able to eject.
Run on web`idealyst dev` is the hot-reload dev server. It builds the wasm bundle, starts a static file server, and opens your browser — all in one step. Edit a source file and the running app reflects the change without losing state.
idealyst dev          # hot-reload at http://localhost:8080
Run on iOS / AndroidiOS and Android use the same source tree. The CLI produces the platform binary, generates the Xcode / Gradle wrapper as needed, and launches the app on a simulator (or a connected device).
idealyst run ios       # boot in iOS simulator
idealyst run android   # install on emulator or USB device
Same hot-reload behavior — edits to `src/` show up live on the device while the app keeps running.
Make a changeOpen `src/app.rs` and replace it with the canonical counter. Save and the running app updates in place — on web, in the iOS simulator, and on the Android device, all at the same time.
use runtime_core::{bind, component, signal, text_fmt, ui, Element};

#[component]
pub fn app() -> Element {
    let count = signal!(0);
    ui! {
        text { text_fmt!("Count: {}", bind!(count)) }
        button(
            label = "Increment",
            on_click = move || count.update(|n| *n += 1),
        )
    }
}
Next: understand the modelIf you want to know why the app crate compiles for every platform unchanged, what `Element` actually is, and how the reactive layer works, the Core concepts page is the next step.Read Core concepts →
On this page
Scaffold a project
Project layout
Run on web
Run on iOS / Android
Make a change
Next: understand the model
IdealystOne codebase, native everywhere.
© Idealyst 2026