ROSACE

Fast by nature. Beautiful by design.

The UI framework Rust deserved from day one — declarative, reactive, and built without compromise, from the layout engine to the render pipeline.

Active development — Phase 28 of 32
01 Scaffold
~/projects
$ rsc new myawesomeapp
Creating ROSACE app 'myawesomeapp' for: macos, web Created 'myawesomeapp' Structure: src/app.rs root component (routing + theme) src/screens/ home + counter screens rsc.toml app manifest Run it: rsc run --mac # macOS rsc run --target web # browser
src/screens/counter.rs
use rosace::prelude::*; pub fn counter_screen(count: &Atom<i32>) -> impl Widget { let c = count.clone(); Column::new() .spacing(16.0) .padding(EdgeInsets::all(24.0)) .child(Text::display(count.get().to_string())) .child(Text::new("Tap to change the count")) .child( Row::new() .spacing(12.0) .child(Button::new("−").variant(ButtonVariant::Ghost) .on_press({ let c = c.clone(); move || c.set(c.get() - 1) })) .child(Button::new("Increment").width(140.0) .on_press({ let c = c.clone(); move || c.set(c.get() + 1) })), )}
counter
0

Tap to change the count

buttons
Primary Secondary Ghost Danger Success
inputs
Switch
Checkbox
OneTwoThree
gallery
Chip Badge Avatar Card

Progress · Skeleton · Divider

Fast by nature · Beautiful by design

One command, a real app. Native entry, web entry, theme, routing and two screens — no bundler, no config file to learn.

Where the project stands

Built in the open, one phase at a time. Honest status, no vaporware.

28 / 32
Development phase
4
Target platforms
120fps
Render baseline
40+
Built-in widgets

Rosace is under active development. APIs are unstable and large parts are still being built — not ready for production use, but what's here already runs fast. Desktop (macOS, Windows, Linux) and Web are live; iOS and Android have real native hosts working, with mobile UI polish in progress.

Built by someone who already knew the mistakes

Not a port. Not a wrapper. A clean-room implementation, top to bottom.

Never sacrifices performance

Dirty-region compositing targets 120fps by default — not as an aspiration, as the baseline.

Never hides cost

Every allocation, every draw call, every state update is explicit and traceable through the built-in event bus.

Never lies about safety

The component system guarantees lifecycle correctness at compile time. If it compiles, it runs.

Composes all the way down

From the layout engine to state atoms to the render layer — every abstraction is composable, never opaque.

Write your UI once in Rust. Target desktop, web (WASM), iOS, and Android — with one reactive core, one render pipeline, and no runtime surprises.

Dig into the docs

Guides, architecture notes, and API references live on the GitHub wiki.

An Examples gallery is coming soon.