# ๐ต chai-tea
> a minimal Elm-style architecture for [egui](https://github.com/emilk/egui) / [eframe](https://github.com/emilk/egui/tree/main/crates/eframe) apps
**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):
```rust
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`
## ๐งฉ example: async counters
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.
## โจ features
- ๐ Pure Elm-style loop โ deterministic, functional, and testable
- ๐งต Async commands via `brew_async`, `SyncState`, and `ChaiSender`
- spawn background threads or async tasks
- send messages back safely
- UI automatically repaints on message arrival
- ๐ Native + (soon) WASM support
- ๐ชถ Tiny, dependency-light core
- โ Ergonomic aliases โ `brew` = `run`, `brew_async` = `run_async`
## ๐ซ possible roadmap
- [x] async / background command support
- [ ] fixed-timestep threaded simulation variant
- [ ] wasm runner (chai_tea::run_web)
- [ ] macro sugar: #[chai_app]
- [ ] theme system (chai-latte someday?)
- [ ] time travel debugger?