Xilem and Masonry provide an experimental high-level architecture for writing GUI apps in Rust.
Masonry is a foundational crate for building natively compiled GUIs in Rust.
It provides a retained widget tree and runs event handling and update passes on it.
Xilem a high-level reactive framework inspired by React, SwiftUI and Elm.
It lets users create a lightweight view tree, and changes the rendered app based on changes to the tree.
It has a web backend and a Masonry backend.
Throughout Xilem you will find usage of + use<> in return types, which is the Rust syntax for Precise Capturing.
This is new syntax in the 2024 edition, and so it might be unfamiliar.
Here’s a snippet from the Xilem examples:
The precise capturing syntax in this case indicates that the returned view does not make use of the lifetime of data.
This is required because the view types in Xilem must be 'static, but as of the 2024 edition, when impl Trait is used
for return types, Rust assumes that the return value will use the parameter’s lifetimes.
That is a simplifying assumption for most Rust code, but this is mismatched with how Xilem works.
Prerequisites
Linux and BSD
You need to have installed pkg-config, clang, and the development packages of wayland, libxkbcommon, libxcb, and vulkan-loader.
Most distributions have pkg-config installed by default.
There’s a Nix flake in docs/ which may be used for developing on NixOS:
[!INFO]
This flake is provided as a starting point, and we do not routinely validate its correctness.
We do not require contributors to ensure that this accurately reflects the build requirements, as we expect most contributors (and indeed many maintainers) will not be using NixOS.
If it is out of date, please let us know by opening an issue or PR.
# For all crates within this repo
nix develop ./docs
# For a specific crate
nix develop ./docs#xilem
nix develop ./docs#masonry
nix develop ./docs#xilem_web
Recommended Cargo Config
The Xilem repository includes a lot of projects and examples, most of them pulling a lot of dependencies.
If you contribute to Xilem on Linux or macOS, we recommend using split-debuginfo in your .cargo/config.toml file to reduce the size of the target/ folder:
[profile.dev]
# One debuginfo file per dependency, to reduce file size of tests/examples.
# Note that this value is not supported on Windows.
# See https://doc.rust-lang.org/cargo/reference/profiles.html#split-debuginfo
split-debuginfo="unpacked"
Minimum supported Rust Version (MSRV)
This version of Xilem has been verified to compile with Rust 1.88 and later.
Future versions of Xilem might increase the Rust version requirement.
It will not be treated as a breaking change and as such can even happen with small patch releases.
Community
Discussion of Xilem development happens in the Linebender Zulip, specifically the #xilem channel.
All public content can be read without logging in.
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 licensed as noted in the License section, without any additional terms or conditions.
Some files used for examples are under different licenses:
The font file (RobotoFlex-Subset.ttf) in xilem/resources/fonts/roboto_flex/ is licensed solely as documented in that folder (and is not licensed under the Apache License, Version 2.0).
The data file (status.csv) in xilem/resources/data/http_cats_status/ is licensed solely as documented in that folder (and is not licensed under the Apache License, Version 2.0).
The data file (emoji.csv) in xilem/resources/data/emoji_names/ is licensed solely as documented in that folder (and is not licensed under the Apache License, Version 2.0).
Xilem
An experimental Rust architecture for reactive UI
Xilem and Masonry provide an experimental high-level architecture for writing GUI apps in Rust.
Masonry is a foundational crate for building natively compiled GUIs in Rust. It provides a retained widget tree and runs event handling and update passes on it.
Xilem a high-level reactive framework inspired by React, SwiftUI and Elm. It lets users create a lightweight view tree, and changes the rendered app based on changes to the tree. It has a web backend and a Masonry backend.
Project structure
Xilem and Masonry are built on top of:
Precise Capturing
Throughout Xilem you will find usage of
+ use<>in return types, which is the Rust syntax for Precise Capturing. This is new syntax in the 2024 edition, and so it might be unfamiliar. Here’s a snippet from the Xilem examples:The precise capturing syntax in this case indicates that the returned view does not make use of the lifetime of
data. This is required because the view types in Xilem must be'static, but as of the 2024 edition, whenimpl Traitis used for return types, Rust assumes that the return value will use the parameter’s lifetimes. That is a simplifying assumption for most Rust code, but this is mismatched with how Xilem works.Prerequisites
Linux and BSD
You need to have installed
pkg-config,clang, and the development packages ofwayland,libxkbcommon,libxcb, andvulkan-loader. Most distributions havepkg-configinstalled by default.To install the remaining packages on Fedora, run:
To install the remaining packages on Debian or Ubuntu, run:
There’s a Nix flake in
docs/which may be used for developing on NixOS:Recommended Cargo Config
The Xilem repository includes a lot of projects and examples, most of them pulling a lot of dependencies.
If you contribute to Xilem on Linux or macOS, we recommend using
split-debuginfoin your.cargo/config.tomlfile to reduce the size of thetarget/folder:Minimum supported Rust Version (MSRV)
This version of Xilem has been verified to compile with Rust 1.88 and later.
Future versions of Xilem might increase the Rust version requirement. It will not be treated as a breaking change and as such can even happen with small patch releases.
Community
Discussion of Xilem development happens in the Linebender Zulip, specifically the #xilem channel. All public content can be read without logging in.
Contributions are welcome by pull request. The Rust code of conduct applies.
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 licensed as noted in the License section, without any additional terms or conditions.
License
Licensed under the Apache License, Version 2.0 (LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
Some files used for examples are under different licenses:
RobotoFlex-Subset.ttf) inxilem/resources/fonts/roboto_flex/is licensed solely as documented in that folder (and is not licensed under the Apache License, Version 2.0).status.csv) inxilem/resources/data/http_cats_status/is licensed solely as documented in that folder (and is not licensed under the Apache License, Version 2.0).emoji.csv) inxilem/resources/data/emoji_names/is licensed solely as documented in that folder (and is not licensed under the Apache License, Version 2.0).