# §61 — 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

- `model` — The domain types. Pure serde, no gpui.
- `store` — Atomic JSON under `~/.<app>/`, plus the keychain.
- `app` — gpui and guise: theme, menu bar, window, overlays.

## Start it

```bash
scripts/new.sh Acme ~/Dev/acme --template minimal
```

## What it looks like

`crates/app/src/main.rs`

```rust
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));
    });
}
```

## Where now

- Sign it and ship it — turn to §101 (Appendix B)
- Hand it to an agent — turn to §102 (Appendix C)
- Walk it again from the start — turn to §1
