| Crates.io | chai-tea |
| lib.rs | chai-tea |
| version | 0.2.0 |
| created_at | 2025-10-11 22:06:37.646135+00 |
| updated_at | 2025-10-13 20:28:57.063416+00 |
| description | A minimal Elm-style architecture for egui/eframe apps. |
| homepage | |
| repository | https://github.com/ryry0/chai-tea-rs |
| max_upload_size | |
| id | 1878609 |
| size | 134,294 |
Status: early-stage but functional โ now with async / background task support. API may change rapidly as development continues.
chai-tea lets you write GUI apps in the same clean loop youโd use in The Elm Architecture (TEA):
use eframe::egui;
#[derive(Default)]
struct Model { counter: i32 }
enum Msg { Inc, Dec }
fn init() -> Model { Model { counter: 0 } }
fn update(m: Model, msg: Msg) -> Model {
match msg {
Msg::Inc => Model { counter: m.counter + 1, ..m },
Msg::Dec => Model { counter: m.counter - 1, ..m },
}
}
fn view(ctx: &egui::Context, m: &Model, tx: &mut Vec<Msg>) {
egui::CentralPanel::default().show(ctx, |ui| {
if ui.button("+").clicked() { tx.push(Msg::Inc); }
if ui.button("โ").clicked() { tx.push(Msg::Dec); }
ui.label(m.counter.to_string());
});
}
fn main() -> eframe::Result<()> {
chai_tea::brew(init, update, view)
}
add eframe to your dependencies, run it and youโve got a fully working counter app.
cargo run --example counter
A minimal demonstration of concurrent background workers, shared atomic state, and repaint-on-message behavior is included under
cargo run --example multicounter
Each counter runs in its own thread and reports back through ChaiSender, automatically triggering redraws.
brew_async, SyncState, and ChaiSender
brew = run, brew_async = run_async