Rust GUI frameworks
2015 ✔ 1.0 · Stable milestone Language 2026: The foundation
02

Rust 1.0

Nothing in this book exists before Rust promises not to break.

Rust 1.0 is a promise: code that compiles today will keep compiling on every later 1.x compiler. Everything in this book rests on it. But notice what the promise does not cover: your dependencies. Cargo reads version numbers below 1.0 differently, and for a 0.x crate a minor bump is a breaking change. The next snippet asks Cargo's own version-matching library what winit = "0.30" accepts.

semver-rust1/src/bin/one.rs ✔ compiled · semver 1 · rustc 1.95.0
use book_error::Result;
use semver::{Version, VersionReq};

fn main() -> Result<()> {
    // What `winit = "0.30"` in Cargo.toml actually means:
    let req = VersionReq::parse("0.30")?;
    for v in ["0.30.13", "0.31.0-beta.3", "1.0.0"] {
        let ok = req.matches(&Version::parse(v)?);
        println!("{v:>14} satisfies ^0.30? {ok}");
    }
    Ok(())
}
output
0.30.13 satisfies ^0.30? true
 0.31.0-beta.3 satisfies ^0.30? false
         1.0.0 satisfies ^0.30? false

Nothing newer than the 0.30 series matches, not even the 0.31 beta that has been in the works for months. That rule matters here because nearly every crate in this book is still 0.x: winit 0.30, egui 0.36, iced 0.14, Taffy 0.14, AccessKit 0.25. wgpu is past 1.0 on paper, but it is at major version 30 because it ships a new breaking release every few months (29 in March 2026, 30 in July).

semver-rust1/src/bin/two.rs ✔ compiled · semver 1 · rustc 1.95.0
use book_error::Result;
use semver::{Version, VersionReq};

fn main() -> Result<()> {
    let v = Version::parse("0.30.13")?;
    for req in ["0.30", "~0.30.1", "=0.30.13", ">=0.30, <0.32"] {
        let ok = VersionReq::parse(req)?.matches(&v);
        println!("{req:>14} accepts 0.30.13? {ok}");
    }
    // Bumping to 0.31 is a *breaking* change under cargo's rules for 0.x crates.
    let next = Version::parse("0.31.0")?;
    println!("^0.30 accepts 0.31.0? {}", VersionReq::parse("0.30")?.matches(&next));
    Ok(())
}
output
0.30 accepts 0.30.13? true
       ~0.30.1 accepts 0.30.13? true
      =0.30.13 accepts 0.30.13? true
 >=0.30, <0.32 accepts 0.30.13? true
^0.30 accepts 0.31.0? false

So "stable" in this book means something specific: a framework that has declared 1.0 and promised not to break you. Of the frameworks checked, only Tauri, Slint and Makepad have. Look for the green badge on their pages. For everything else, pin your versions and read the changelog before you upgrade.

Rust project announcement, 15 May 2015. Date from memory; verify.