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.
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
| Platform | State |
|---|---|
| macOS desktop | Works end to end, including Korean IME input |
| Windows, Linux desktop | The Rust side is portable; the renderer build is not scripted yet |
| iOS, Android | Designed, not implemented |
| Web | Boundary 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
Getting started
Install the toolchain, build the renderer, run the demo.
Writing UI
Widgets, modifiers, events, and the text field rules that keep IME composition intact.
Design systems
Material 3, Apple HIG and Fluent, unified or following the host platform.
Architecture
The Host and Renderer split, the protocol, and the frame model.