The single-window tool
One window that does one thing. No router, no async layer, no crate you added because you might need it.
Three crates: the types, the store, and the app. Settings, an About card that does not claim a local build is a release, and self-update that installs in place are already wired — they are the chrome every desktop app owes its users and none of it is your problem.
The template's AGENTS.md says what to add when this stops fitting. Each thing it names is one of the other two templates.
What you are carrying
modelThe domain types. Pure serde, no gpui.
storeAtomic JSON under `~/.<app>/`, plus the keychain.
appgpui and guise: theme, menu bar, window, overlays.
Start it
scripts/new.sh Acme ~/Dev/acme --template minimal
What it looks like
use atlas::prelude::*;
fn main() {
Application::new().run(|cx: &mut App| {
// Read the store before the window opens, so the theme follows the
// saved preference on the first frame instead of flashing the default.
let store = store::Store::new();
let settings = store.settings();
Scheme::new().build(scheme_for(&settings)).init(cx);
Chrome::new("Acme").docs("https://github.com/wess/acme").install(cx);
MainWindow::versioned("Acme", env!("CARGO_PKG_VERSION"))
.size(900.0, 640.0)
.open(cx, move |cx| root::Root::new(store, cx));
});
}