amethystate is a state manager for Rust applications: state is declared as an ordinary struct, its fields are
reactive, and they outlive the program.
- Struct-defined state — one attribute turns a struct's fields into persisted reactive ones, with defaults, subscriptions, and interceptors that can refuse a write
- Runtime-defined keys — a map entry or a
Kvpath gets the same subscriptions, interceptors and durability as a declared field - Read and write every frame — writes are buffered and batched, reads answer from memory
- Durable when it matters —
durable()on a field, a map or aKvpath returns only once the value is on disk, for the writes that must not sit in a buffer - Behaviour you choose — which engine holds the state, when a write reaches the disk, what a field does with a value that will not read, what a new version does to an old file
- Migrations — explicit versions, run at startup; drift is logged
- Engines —
redb,sqlite, and text asjson/toml/ronon disk; text files reload on external edits - In a browser —
localStorage, no Tauri needed; a page hears the writes another tab makes - Integrations — Tauri (+TS bindings), Leptos, Dioxus, Yew, GPUI, egui/iced/ratatui
- Tracing — structured events, each write tagged with its source struct
Warning
The framework adapters and about half of the engines are not used in any real application. They run in CI and were smoke-tested, and they were built as a proof of concept for the architecture of the store: that one store can sit behind very different engines and GUI models. Nobody depends on them day to day, so expect rough edges there, and report what you hit.
use amethystate::{StoreBuilder, amethystate};
#[amethystate(prefix = "network")]
pub struct NetworkState {
#[amestate(default = "127.0.0.1".to_string())]
pub host: String,
#[amestate(default = 8080u16)]
pub port: u16,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let store = StoreBuilder::new("./app").build()?;
let state = NetworkState::new_with(&store)?;
let _sub = state.port().subscribe(|port| println!("port → {port}"));
state.port().set(9090)?;
Ok(())
}See the book for full documentation — concepts, migrations, and per-framework integration guides.
The minimum supported Rust version (MSRV) for amethystate is 1.90.
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.