compose-rust

Compose-shaped UI in Rust,drawn by Compose.

A Rust API in the shape of Compose, a narrow C ABI with a generated schema, and an ahead-of-time compiled Compose renderer that draws with Compose's own text layout, widgets and platform IME.

Native UI with no webview and no bundled JVM, aiming at one executable per desktop app.

  • No webview
  • No bundled JVM
  • Platform IME, including Korean
  • Records read in place
// Planned shape for 1.0.0. Does not compile against 0.0.x.
#[composable]
fn counter() {
    let count = remember(|| mutable_state_of(0));
    Column(Modifier::new().fill_max_width(), || {
        Text(format!("{}", count.get()));
        Button(|| count.set(count.get() + 1), || Text("+1"));
    });
}

One language for the UI, one engine for the pixels

Rust owns your code and your state. Kotlin owns the pixels, the text stack and the input method. Between them sits a narrow C ABI: synchronous, on one thread, with records read where they were written, so a keystroke gets its answer inside the same call.

The authoring API shown here arrives with 1.0.0 on 2026-10-20. The boundary, the schema and the renderers under it ship today in 0.0.1.

28.76 MBOne executable, notepad sample, macOS arm64
35.1 MBPhysical footprint of that executable with its window open
~12 nsOne call from renderer to Host in the browser
6.95 MBRenderer and Skia in the browser, gzipped

The first two numbers are for the Kotlin/Native renderer linked into the executable, which becomes the default after 0.0.1. 0.0.1 ships a GraalVM native image on the desktop. See What runs where.

Where it stands today

PartState
Boundary, protocol, schema, renderer downloadWorks in 0.0.1
Authoring API: #[composable], remember, launchPlanned for 1.0.0 on 2026-10-20
macOS, Android, WebWorks end to end
Linux, Windows, iOSBuilds and starts

This is an early project and it says so plainly. The status and platforms sections say what each line means.

Start here