Rust GUI frameworks
2023 Framework 2026: Niche, small user base
24

Floem: from the Lapce editor

A reactive native toolkit pulled out of a code editor.

Floem came out of Lapce, a Rust code editor, and aims to be fast and ergonomic at once. Its model is fine-grained reactivity, the same idea as Leptos: state lives in signals, and only the closures that read a signal re-run when it changes. This is the counter from its README.

floem-counter/src/bin/one.rs ✔ compiled · floem 0.2 · rustc 1.95.0
use floem::prelude::*;

fn main() {
    floem::launch(counter_view);
}

fn counter_view() -> impl IntoView {
    let mut counter = RwSignal::new(0);

    h_stack((
        button("Increment").action(move || counter += 1),
        label(move || format!("Value: {counter}")),
        button("Decrement").action(move || counter -= 1),
    ))
    .style(|s| s.size_full().items_center().justify_center().gap(10))
}

The view tree is built exactly once. After that, label text and styles are closures that re-evaluate on their own, so a state change never rebuilds the tree. That is the performance argument, and it is why the README credits Xilem, Leptos and rui as inspirations.

floem-counter/src/bin/two.rs ✔ compiled · floem 0.2 · rustc 1.95.0
use floem::prelude::*;

fn main() {
    floem::launch(view);
}

// The view tree is built once. Only the closures re-run, and only when a
// signal they read changes, so updates never rebuild the tree.
fn view() -> impl IntoView {
    let count = RwSignal::new(0);
    let doubled = move || count.get() * 2;

    v_stack((
        label(move || format!("count = {}", count.get())),
        label(move || format!("doubled = {}", doubled())),
        button("+1").action(move || count.update(|n| *n += 1)),
    ))
    .style(|s| s.padding(20).gap(8))
}

The README says rendering uses wgpu, with a CPU fallback built on tiny-skia "in case a GPU is unavailable". The lockfile agrees and adds specifics: Floem ships its own winit fork (floem-winit), uses Taffy 0.4.4 for layout and cosmic-text 0.12.1 for text, and resolves wgpu 22.1.0, which is eight major versions behind wgpu 30. It has no AccessKit support, consistent with the 2026 ecosystem report. It is at 0.2.0 with 11 dependents.

crates.io first publish.