An idiomatic GUI library inspired by Elm and based on gtk4-rs. Relm4 is a new version of relm that's built from scratch and is compatible with GTK4 and libadwaita.
Why Relm4
We believe that GUI development should be easy, productive and delightful. The gtk4-rs crate already provides everything you need to write modern, beautiful and cross-platform applications. Built on top of this foundation, Relm4 makes developing more idiomatic, simpler and faster and enables you to become productive in just a few hours.
Our goals
- ⏱️ Productivity
- ✨ Simplicity
- 📎 Outstanding documentation
- 🔧 Maintainability
Documentation
Dependencies
Relm4 depends on GTK4: How to install GTK4 and Rust
Ecosystem
- relm4-macros - several macros for declarative UI definitions.
- relm4-components - a collections of reusable components.
- relm4-icons - icons for your application.
- relm4-template - a starter template for creating Relm4 applications in the Flatpak package format.
- relm4-snippets - code snippets to speed up your development.
Use this in to your Cargo.toml:
# Core library relm4 = "0.10" # Optional: reusable components relm4-components = "0.10" # Optional: icons (more info at https://github.com/Relm4/icons) relm4-icons = "0.10"
Features
The relm4 crate has four feature flags:
| Flag | Purpose | Default |
|---|---|---|
macros |
Enable macros by re-exporting relm4-macros |
✅ |
libadwaita |
Improved support for libadwaita | - |
libpanel |
Improved support for libpanel | - |
gnome_50 |
Enable all version feature flags of all dependencies to match the GNOME 50 SDK | - |
gnome_49 |
Enable all version feature flags of all dependencies to match the GNOME 49 SDK | - |
gnome_48 |
Enable all version feature flags of all dependencies to match the GNOME 48 SDK | - |
gnome_47 |
Enable all version feature flags of all dependencies to match the GNOME 47 SDK | - |
gnome_46 |
Enable all version feature flags of all dependencies to match the GNOME 46 SDK | - |
gnome_45 |
Enable all version feature flags of all dependencies to match the GNOME 45 SDK | - |
gnome_44 |
Enable all version feature flags of all dependencies to match the GNOME 44 SDK | - |
gnome_43 |
Enable all version feature flags of all dependencies to match the GNOME 43 SDK | - |
gnome_42 |
Enable all version feature flags of all dependencies to match the GNOME 42 SDK | ✅ |
The macros feature is a default feature.
Examples
Several example applications are available at examples/.
📸 Screenshots from the example apps
A simple counter app
use gtk::prelude::*; use relm4::prelude::*; struct App { counter: u8, } #[derive(Debug)] enum Msg { Increment, Decrement, } #[relm4::component] impl SimpleComponent for App { type Init = u8; type Input = Msg; type Output = (); view! { gtk::Window { set_title: Some("Simple app"), set_default_size: (300, 100), gtk::Box { set_orientation: gtk::Orientation::Vertical, set_spacing: 5, set_margin_all: 5, gtk::Button { set_label: "Increment", connect_clicked => Msg::Increment, }, gtk::Button { set_label: "Decrement", connect_clicked => Msg::Decrement, }, gtk::Label { #[watch] set_label: &format!("Counter: {}", model.counter), set_margin_all: 5, } } } } // Initialize the component. fn init( counter: Self::Init, root: Self::Root, sender: ComponentSender<Self>, ) -> ComponentParts<Self> { let model = App { counter }; // Insert the code generation of the view! macro here let widgets = view_output!(); ComponentParts { model, widgets } } fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) { match msg { Msg::Increment => { self.counter = self.counter.wrapping_add(1); } Msg::Decrement => { self.counter = self.counter.wrapping_sub(1); } } } } fn main() { let app = RelmApp::new("relm4.example.simple"); app.run::<App>(0); }
Projects using Relm4
- fm — A small, general-purpose file manager.
- Done - A simple and versatile to do app.
- Reovim - GUI frontend for neovim.
- NixOS Configuration Editor - A graphical configuration editor for NixOS.
- Rhino Setup - Setup wizard for Rolling Rhino
- Lemoa - Desktop client for Lemmy
- Score Tracker - App for tracking player scores in card and board games
- Spidey - A seamless and distraction-free work and play environment on the web
- Toolbox Tuner - An application to manage Toolbx containers
- BitRitter - A bitwarden/vaultwarden client with mobile devices in mind
- Space Acres - An opinionated GUI application for farming on Autonomys Network
- Exercise Timer - An interval training app for the GNOME desktop
- Words! - on Flathub - A word game similar to Wordle
- LACT - A GPU configuration and info utility
- xdg-mimer - A GUI tool for managing MIME associations using XDG standards
- CoDLinux - A CoD & CoD:UO client helper for GNU/Linux
- waypomo - endless pomodoro timer for wlroots compositors (uses gtk4-layer-shell)
- Vinyl - A simple adwaita audio player
- ratic - A fully-featured music player.
- wayle - A compositor agnostic shell with extensive customization
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Feedback and contributions are highly appreciated!

