Ralph Levien, author of druid and xilem made some good posts about it. I'll link one here.
https://raphlinus.github.io/rust/gui/2022/07/15/next-dozen-g...
For desktop app development, if I don’t care about native controls (and what does that mean in Linux or even post-Win32, anyway?) and don’t want to deal with Electron, why not use something a bit more established like Avalonia or Flutter?
Also shoutout to ratatui because even though it's technically a TUI not GUI, it's superb.
EGUI bonus: Good integration with WGPU, so you can show 3D things as part of your UI.
Complaining time: Historically, syncing winit, EGUI, WGPU, the binder between GPU and EGUI, and EGUI libs like for file dialogs has been a pain. It gives me anxiety thinking about upgrading versions. That said... the teams are sometimes shockingly fast about syncing their UIs. It is when winnit or WGPU etc make big breaking changes (Often from accumulation over time) where things get hairy!
The downside is that the dependency stack you need to do gui programming with rust is massive and the compile times are brutal. You can’t beat the application performance, though. It’s crazy how nice it feels compared to bloated electron apps.
The question of “are we gui yet” is definitely yes, at least on the desktop. The problem is that developers are too lazy to build apps with anything other than web frameworks.
For the small percent that's left where speed is critical, I've just been using wgpu and wgsl-bindgen directly.
I can't think of what I'd want a native UI solution for. And then having to deal with porting it to iOS, Android, Windows, Mac etc, dealing with app stores (3+?) submissions, developer fees, rejections... vs just using HTML which works on all platforms. I don't think I'd use a native UI even if there was one. Not that HTML is great by any stretch...
(I made Sunwet, this is what my stuff looks like: https://github.com/andrewbaxter/sunwet )
I still think the ideal solution for Desktop GUIs would be the Qt company developing first class Qt bindings for Node.js (or some other runtime), and allow people to build UIs using web tech with Qt components.
https://github.com/microsoft/windows-rs/tree/master/crates/s...
It's a react-style API for WinUI3 apps, meaning it's not trying to mimic the Windows LAF. It's merely a binding.
having SSR built in means that the UX is amazing - really complex pages load basically instantly, and it degrades just as easily for folks that haven't loaded the WASM. server functions were also fantastic to work with and easy to reason about. and, the hot reloading they built means that most UX changes are reloaded within a ~few seconds, meaning iterating is fast and (mostly) painless.
the native component library dioxus has (dioxus-primitives) is... sparse so i did have to build out a hundred or so basic components, but i've done that across various stacks 5-6 times now over my career so it's a fun little journey at this point. for the components they do provide, the quality bar is very good.
That’s crazy. It’s still better than the UX’s that game engine designers think work. Sure bro, show me your File Open/Save Dialog and tree view. Show me your text editor (nicely done, zed)
Rust was designed to build core mechanisms of UI, like internals of a browser.
But as a language-behind-ui it is quite suboptimal so I think the most successful UI framework for Rust most likely will use some form of DSL.
But if DSL then inevitably we are getting question: why not HTML/CSS/JS then?
Visual styles, layout, structure, UI logic like "on click here, hide stuff there and expand section over there" is what HTML/CSS/JS was designed for.
"Render therefore unto Cesar the things which are Cesar's;"
I wish there were more memory safe compiled languages that focused on ergonomics for cases like this.
Strengths:
- Message passing model with separate Model and View paths
- Async / Sync landscape (sync on the GUI thread, tasks / subscriptions for async stuff with messages returned to the GUI thread)
- Writing custom Widgets is quite easy! In 0.14 stateful widgets got a revamp and they are quite nice
- Performance is great
- Despite being very capable, the framework is not that large. Learning it is not a daunting task
- Documentation might be sparse, but due to how it's written, I was able to just read the code and understand how it works without issue
Downsides include: - Lots of changes between releases (still pre 1.0)
- Theming. Despite being (somewhat) recently reworked, it's still overcomplicated imo
- The layouting engine is tricky to use and I fight with it much more than I should. Quite often widgets do not show up at all or take too much space because I didn't use the right combination of `Length` variants for `width` and `height` of the widget (and/or its children)
- Some interfaces seem a bit weird (I am specifically thinking about overlays)
- There is some confusion regarding what should go in the application state and what should be held in Widget's state. The interfaces are clearly defined here, but what can be / should be done is often found out in practice (perhaps I lack experience here)egui is the clear winner for making desktop applications. I've built a complex application recently (think of it like an AI powered image editor, doing plenty of editor logic and communicating with several python backends for the AI part) and it's been smooth sailing. It would be nice to have a family of components that look native on every platform but nowadays the desktop experience is anyway wildly inconsistent (and web-centric).
Using qt bindings is a good option too, but depending on non rust code means you are more likely to catch some weird crash. My experience with Qt in Rust is years old, so I can't comment on stability.
For frontend development, leptos is really nice and it feels familiar coming from react - but the whole chain is too heavy, your target directory quickly balloons to GBs and that's unacceptable, especially if you have several frontend projects.
I vibe coded a proof of concept leptos (including islands) with a minimal runtime and no dependencies and the size was much more contained. There is margin for improvements but today I would stick with solid.js for frontend development.
The other big hurdle for Rust on the web is the need to compile to wasm. That means that any Rust application will be heavier than a similar app in another JS framework. If we could target js instead of wasm, maybe we could have apps with small bundles.
How about some screenshots?
Its very difficult to compare X to Y anywhere on this site. Its just an aggregator, not really an exemplary resource.
I'm dreading the "upgrade" from wgpu 24 to wgpu 29. I stayed with wgpu 24 for a year so I could get work done. Now I have to fix three programs and all their tests and examples.
GPUI getting the public release greenlight will no doubt be a turning point for desktop GUI development. All it took is a small team of gifted developers to dogfood their own GUI toolkit and get some much-needed VC backing. The future looks very bright.
Winit has had so much churn over time, I hope they settle down at some point.
I can pretty much guarantee that if I try to build a project from 3+ years ago, the old version of winit will not compile on my Mac, and the new version of winit will have a completely different API surface.
The component library by long bridge is also well done and reasonably well documented.
I think there was a community fork recently that tried to tend to these concerns.
It's not a bad thing per se, but its worth mentioning.
Check out: https://github.com/longbridge/gpui-component
Qt QML is already annoying in C++ since you have to juggle 2 lifetime systems, c++ manual lifetime management and QMLs QML engine (aka gargabe collection).
egui is, however, one of the most reliable paths in Rust today for building and shipping a desktop app.
All that is to say that I'm glad there's another way to get Rust on mobile aside from stuff like flutter_rust_bridge.
[0] https://github.com/woboq/qmetaobject-rs
[1] https://www.rubdos.be/2026/04/17/my-sailfish-os-journey-apps...
Not sure why you want to build desktop GUIs using web tech though.
I disagree. It's the easiest to get started with, but it looks pretty terrible (poor font rendering especially), and immediate mode has serious downsides.
My current favourite is https://github.com/longbridge/gpui-component
It looks like it just grabbed the intro to each project's self-description, but blurbs like "Zero-cost ultra-high-performance declarative DOM library using FRP signals" would be worth very little even with screenshots.
The best primer on the current(ish) state of GUI programming in Rust, IMO, is this article from 2025 which is linked on that page: https://www.boringcactus.com/2025/04/13/2025-survey-of-rust-...
But for desktop applications it is bloated, a big attack surface.
HTML/CSS is made for online documents, and using it for applications is a bit hack that happen to work, but hides a huge ton of complexity behind frameworks and frameworks of frameworks with leaky abstractions and each their own caveat.
While imperative retain mode frameworks are technically possible in Rust, my understanding is that there’s a level of unavoidable ceremony and syntax ugliness (unless safety is discarded, which defeats the point of using Rust).
Cosmic DE is built using iced which is a rust gui library. As far as native, single-platform guis go, I'd say rust is plenty mature.
There's also Bevy, a rust game engine, which, if I'm not mistaken is built on egui(?), and I think supports multiple compile targets.
Between a desktop environment and a game engine, I'd say rust is in a pretty decent place when it comes to gui.
Wdym? At least web apps are sandboxed by default in contrast to native.
My only question is - say if one uses Rust, is flutter_rust_bridge the way to go?
Saying “almost” or “yes” privileges the activity and hype around Rust GUI over actual results. Bevy is the ironic example: a game engine that produces more discussion and code than, so far, one notable & good game.
Not entirely correct, they have bevy_ui as the in-house example but many people use the third party bevy_egui crate
Not everybody works in big tech.
> Idiotic.
Yes, seeing how simple it seems to redirect to a page playing the sound, instead. ;)
As a low level language, Rust is perfectly suitable for making user interfaces the old fashioned way, with native APIs. However, competing in today's world typically means supporting many platforms, and that makes using native APIs an unattractive option for many.
Rust's expressiveness and high level abstractions make it ideal for building intricate and complex user interfaces. Unfortunately, there is little consensus on what the best abstractions are.
There are a number of bindings available today to existing frameworks, but those looking for a mature, easy to use, and completely Rust-based solution will most likely find themselves out of luck.
Current approaches to building GUIs in Rust include interfacing with Electron and building GUIs with HTML (or a framework on top of it), while others have taken to using graphics APIs and various wrappers to emulate classical widgets. The cross platform parallel rendering engine Webrender, built for Servo and usable in Firefox Nightly, takes this latter approach and is multi-platform, but is more of a base for a GUI framework than one in itself.
Below are recent community links submitted to the site. If you're working on or writing about GUIs in Rust, please contribute! Each news entry can be a link back to your blog, Reddit thread, etc. See the README for details.
Azul GUI is a free, functional, reactive GUI framework for rapid development of desktop applications written in Rust and C, using the Mozilla WebRender rendering engine.
Blinc application framework with clean layout and rendering API.
Rust bindings for AppKit (macOS/Airyx/GNUStep, beta) and UIKit (iOS/tvOS, alpha).
Bindings to Core Foundation for macOS.
Cross-platform app development in Rust.
A wgpu-powered graphical user interface (GUI) library with a reactive data model.
CXX-Qt is a library that automatically generates code to transfer data between Rust and C++ through common interfaces such as QObjects that can be exposed directly into QML. It uses the cxx crate for safe interaction between Rust and C++.
Elegant React-like library for building user interfaces for desktop, web, mobile, SSR, liveview, and more.
Zero-cost ultra-high-performance declarative DOM library using FRP signals.
An easy-to-use immediate mode GUI that runs on both web and native.
UI library aiming to be extremely performant while providing world-class developer ergonomics. From the team that made the Lapce code editor.
The FLTK crate is a crossplatform lightweight gui library which can be linked to statically to produce small, self-contained and fast binaries.
Flutter/Dart <-> Rust binding generator, feature-rich, but seamless and simple.
Cross-platform and non-web GUI Library powered by Skia.
MVVM-oriented (properties, observable collections, bindings), ui! macro, multiplatform, renderer-agnostic, with styles.
A hybrid immediate and retained mode, GPU accelerated, UI framework, designed to support a wide variety of applications.
UNMAINTAINED Rust bindings for the GTK+ 3 library (use gtk4 instead).
A renderer-agnostic GUI library for Rust focused on simplicity and type-safety. Inspired by Elm.
High-level Rust bindings to dear imgui.
A modern approach to stateful GUI: Rust-native, accessible, scalable.
Automated GUI testing using AccessKit.
Leptos is a full-stack, isomorphic Rust web framework leveraging fine-grained reactivity to build declarative user interfaces.
LVGL bindings for Rust. A powerful and easy-to-use embedded GUI with many widgets, advanced visual effects (opacity, antialiasing, animations) and low memory requirements (16K RAM, 64K Flash).
Makepad is a new VR, web and native-rendering UI framework.
Traits and types of the Masonry toolkit.
A user friendly data defined imediate mode Ui system. Define your menus in ron.
User interface language and 2D layout engine for cross-platform apps.
An app engine built on macroquad with immediate-mode API and simple commands for cross-platform support. It has accessibility, shaders, storage, flexbox-like layout, a debug view and more.
A framework empowering everyone to create Qt/QML applications with Rust. It does so by building QMetaObjects at compile time, registering QML types (optionally via exposing QQmlExtensionPlugins) and providing idiomatic wrappers.
Asynchronous, GTK+-based, GUI library, inspired by Elm, written in Rust.
An idiomatic GUI library inspired by Elm and based on gtk4-rs.
Ribir is a Rust GUI framework that helps you build beautiful and native multi-platform applications from a single codebase.
Rust for native business logic, Flutter for flexible and beautiful GUI.
Rosin is a GUI library that aims to be extremely easy to use.
Bindings to SDL3, a cross-platform library to abstract the platform-specific details for building applications.
Slint is a toolkit to efficiently develop fluid graphical user interfaces for any display: embedded devices and desktop applications. It comes with a fast OpenGL renderer, a designer-friendly markup language and is written in Rust. Triple-licensed: GPLv3, Royalty-free, and Commercial.
Tauri is a framework for building tiny, blazing fast binaries for all major desktop platforms.
A cross-platform declarative & functional UI library for rust, focused on performance and extensibility.
High-level Rust binding for the tinyfiledialogs C library.
Undo/Redo in Rust using deltas, snapshots or commands with convenience implementations for many standard and third-party types.
A GPU accelerated 2D renderer for web content.
Windows API and GUI in safe, idiomatic Rust.
Safe Rust bindings for wxWidgets via the wxDragon C wrapper.
An experimental Rust architecture for reactive UI.
A framework for creating reliable and efficient web applications.