| Crates.io | molten_cauldron |
| lib.rs | molten_cauldron |
| version | 0.1.0 |
| created_at | 2025-12-14 18:45:12.826717+00 |
| updated_at | 2025-12-14 18:45:12.826717+00 |
| description | A powerful TUI framework based on The Elm Architecture ๐ฎ |
| homepage | https://molten.dev |
| repository | https://github.com/moltenlabs/molten-cauldron |
| max_upload_size | |
| id | 1984922 |
| size | 58,088 |
A powerful TUI framework based on The Elm Architecture.
Features โข Installation โข Quick Start โข Architecture โข Ecosystem
Cauldron is the Rust equivalent of bubbletea from Charmbracelet. It provides a simple, functional approach to building terminal user interfaces using The Elm Architecture.
use cauldron::{App, Model, Command, Event, Key};
struct Counter { count: i32 }
enum Msg { Increment, Decrement, Quit }
impl Model for Counter {
type Message = Msg;
fn update(&mut self, msg: Msg) -> Command<Msg> {
match msg {
Msg::Increment => self.count += 1,
Msg::Decrement => self.count -= 1,
Msg::Quit => return Command::quit(),
}
Command::none()
}
fn view(&self) -> String {
format!(
"๐ฎ Count: {}\n\n Press +/- to change\n Press q to quit",
self.count
)
}
fn handle_event(&self, event: Event) -> Option<Msg> {
match event {
Event::Key(Key::Char('+')) => Some(Msg::Increment),
Event::Key(Key::Char('-')) => Some(Msg::Decrement),
Event::Key(Key::Char('q')) => Some(Msg::Quit),
Event::Key(Key::Esc) => Some(Msg::Quit),
_ => None,
}
}
}
fn main() {
App::new(Counter { count: 0 }).run().unwrap();
}
๐๏ธ Elm Architecture
|
โก Simple API
|
๐ฑ๏ธ Input Handling
|
๐จ Styling Integration
|
cargo add cauldron
Or add to your Cargo.toml:
[dependencies]
cauldron = "0.1"
struct TodoList {
items: Vec<String>,
selected: usize,
}
enum Msg {
MoveUp,
MoveDown,
Delete,
Quit,
}
use cauldron::{Model, Command, Event, Key};
impl Model for TodoList {
type Message = Msg;
fn update(&mut self, msg: Msg) -> Command<Msg> {
match msg {
Msg::MoveUp => {
if self.selected > 0 {
self.selected -= 1;
}
}
Msg::MoveDown => {
if self.selected < self.items.len().saturating_sub(1) {
self.selected += 1;
}
}
Msg::Delete => {
if !self.items.is_empty() {
self.items.remove(self.selected);
if self.selected >= self.items.len() {
self.selected = self.items.len().saturating_sub(1);
}
}
}
Msg::Quit => return Command::quit(),
}
Command::none()
}
fn view(&self) -> String {
let mut s = String::from("๐ Todo List\n\n");
for (i, item) in self.items.iter().enumerate() {
if i == self.selected {
s.push_str(&format!(" > {}\n", item));
} else {
s.push_str(&format!(" {}\n", item));
}
}
s.push_str("\nโ/โ: navigate d: delete q: quit");
s
}
fn handle_event(&self, event: Event) -> Option<Msg> {
match event {
Event::Key(Key::Up) => Some(Msg::MoveUp),
Event::Key(Key::Down) => Some(Msg::MoveDown),
Event::Key(Key::Char('d')) => Some(Msg::Delete),
Event::Key(Key::Char('q')) | Event::Key(Key::Esc) => Some(Msg::Quit),
_ => None,
}
}
}
fn main() {
let app = TodoList {
items: vec![
"Build cauldron".into(),
"Write documentation".into(),
"Ship it!".into(),
],
selected: 0,
};
cauldron::run(app).unwrap();
}
Cauldron follows The Elm Architecture (TEA), a pattern for building interactive programs:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ Event โโโโโถโ Update โโโโโถโ Model โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโฌโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโ โ
โ โ View โ โ
โ โโโโโโฌโโโโโ โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโ โ
โ โ Terminalโ โ
โ โโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Commands let you perform side effects:
// Do nothing
Command::none()
// Quit the application
Command::quit()
// Send a message
Command::message(Msg::DataLoaded(data))
// Batch multiple commands
Command::batch(vec![cmd1, cmd2, cmd3])
// Async task (coming soon)
Command::perform(|| async {
let data = fetch_data().await;
Msg::DataLoaded(data)
})
Use the App builder for more control:
use cauldron::App;
App::new(my_model)
.with_mouse() // Enable mouse support
.inline() // Don't use alternate screen
.show_cursor() // Keep cursor visible
.with_bracketed_paste() // Enable bracketed paste
.run()
.unwrap();
Cauldron is part of the Molten Labs open source ecosystem:
| Crate | Description | Status |
|---|---|---|
| molten_brand | Design tokens & colors | โ Published |
| glyphs | ANSI escape sequences | โ Published |
| lacquer | Terminal styling | โ Published |
| cauldron | TUI framework (you are here) | โ Published |
| sparks | TUI components | ๐ง Coming Soon |
| rune | Shell glamour | ๐ง Coming Soon |
In the forge, a cauldron is where raw materials are melted and transformed into something new. Cauldron transforms your application state through pure functions, bubbling up beautiful terminal interfaces. ๐ฎ
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
git clone https://github.com/moltenlabs/cauldron
cd cauldron
cargo test
Licensed under either of:
at your option.
Built with ๐ฎ by Molten Labs
"Let them cook."