dioxus-compose

Declarative UI in Rust,rendered by Compose.

You write components with rsx!, hooks and signals. An AOT-compiled Compose Multiplatform renderer draws them, with Compose's text layout, its widgets and the platform IME.

Native desktop UI in Rust with no webview and no bundled JVM.

  • No webview
  • No JVM in the shipped binary
  • Platform IME, including Korean
  • Zero-copy boundary
rsx! {
    Column {
        fill_max_width: true,
        Text { text: "Messages" }
        TextField {
            placeholder: "Say something",
            // Enter submits, Shift+Enter breaks the line
            on_key_down: move |e| {
                if e.key() == Key::Enter && !e.shift_key() {
                    submit();
                    e.consume();
                }
            },
        }
    }
}

One language for the UI, one engine for the pixels

The Rust side owns your components and your state. The Kotlin side owns the pixels, the text stack and the input method. Between them sits a narrow C ABI: synchronous, same-thread, and zero-copy, so a keystroke gets its answer inside the same frame.

Nothing is serialised. There is no async bridge, no webview, and no JVM in the shipped binary.

61.6 MBMemory for an open window, measured on an M1
12.5 µsClick to diff to encoded batch, p99
0Allocations per frame at the boundary
No JVMThe desktop build runs on a machine without Java

Measured on a Mac mini (M1, 16 GiB, macOS 26.5.1), release build. See Architecture for how these are obtained.

Where it stands today

PlatformState
macOS desktopWorks end to end, including Korean IME input
Windows, Linux desktopThe Rust side is portable; the renderer build is not scripted yet
iOS, AndroidDesigned, not implemented
WebBoundary settled by measurement; not implemented

This is an early project and it says so plainly. The specification records what is agreed, what is drafted and what is still unproven.

Start here