| Crates.io | buoyant |
| lib.rs | buoyant |
| version | 0.6.0-alpha.0 |
| created_at | 2024-06-05 01:25:51.420888+00 |
| updated_at | 2025-08-19 00:02:59.201017+00 |
| description | SwiftUI-like UIs in Rust for embedded devices |
| homepage | |
| repository | https://github.com/riley-williams/buoyant |
| max_upload_size | |
| id | 1262268 |
| size | 6,025,993 |

Buoyant is a library for writing and rendering SwiftUI-like views in Rust,
primarily intended for use on no_std memory-constrained embedded systems.
Get started with the Book.
While this crate is primarily intended for use with embedded-graphics DrawTargets, it
can also be used to layout and render views to the terminal.
DrawTarget: embedded-graphics displays.TextBuffer: A basic fixed-size char buffer. Does not respect graphemes.
This is primarily useful for testing and debugging.CrossTerm: Renders colored character-pixels to a terminal using
the crossterm crate.Here's an animated toggle component, implemented with Buoyant:

fn toggle_button(is_on: bool) -> impl View<Rgb565, bool> {
let alignment = if is_on { Alignment::Trailing } else { Alignment::Leading };
let color = if is_on { Rgb565::GREEN } else { Rgb565::RED };
Button::new(
|is_on: &mut bool| *is_on = !*is_on,
|_| {
Capsule.foreground_color(color)
.overlay(
alignment,
Circle
.foreground_color(Rgb565::WHITE)
.padding(Edges::All, 2)
)
.frame_sized(50, 25)
.animated(Animation::ease_in_out(Duration::from_millis(500)), is_on)
.geometry_group()
}
)
}
Static layout and animation between layouts are relatively feature-complete, aside from transitions. You should be able to construct most desired layouts and animations.
Interactivity is under active development, and is not yet feature-complete.
This project could be used in production by the brave, but is probably better suited for hobby projects at this point. It's significantly better than dealing with raw embedded-graphics. If you're familiar with SwiftUI, you should feel especially at home.
Licensed under either of
at your option.
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.