Skip to content

Commit 266ee30

Browse files
committed
the readme showed no desktop and reached the file fourth
Three gaps, all above the fold. No image anywhere, for a project whose output is a desktop. Someone evaluating a distro looks for a screenshot before reading a word, and found none. The niri shot goes directly under the tagline; its alt text names the read-only overlay root fastfetch happens to be reporting, since immutability making its own point for free is worth keeping. The declaration appeared in section four, behind the principles, the status note, and two full screens of install. "Your system is one file" followed by instructions for installing a binary asks a reader to take the pitch on faith until they scroll. The file moves directly under the screenshot, and install now sits after the point where someone has decided whether they care. Nothing answered "why not Nix, why not Bluefin". Every informed visitor asks inside ten seconds, and those are the ones worth converting. The new section covers NixOS and Guix (same idea, and they had to build a package universe to get it), Universal Blue (same three layers, but the unit of configuration is which image you picked), and BlueBuild (builds an image and stops at the image). Deliberately not said: brew bundle cleanup has open reports of removing what it never installed, which is the Bazaar incident 73771ab fixed, class for class. One of those reports is macOS-specific and neither proves it for flatpaks on Linux. The section makes the structural claim instead, that cleanup decides what to remove from what is installed rather than from what it installed. That is documented behaviour, it is the actual distinction, and it keeps an unreproduced bug report out of a README. Two inline bolds became headings, since they now follow a section: "Four principles, in order:" and "Status.". Neither body changed. The screenshot lives in docs/screenshots/, not assets/. build.rs names assets/ in rerun-if-changed, so a screenshot there would make every image swap a rebuild. 135 tests. The two that read README.md still pass: the release asset URL is untouched, and the first toml block is the same declaration it was.
1 parent f4352a3 commit 266ee30

2 files changed

Lines changed: 83 additions & 51 deletions

File tree

‎README.md‎

Lines changed: 83 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,84 @@ You describe a machine in a small `kuma.toml`, and Kuma compiles it into a
99
bootable container image. Atomic updates and rollback come from bootc, and
1010
the packages come from Fedora.
1111

12-
Four principles, in order:
12+
![Kuma running the niri desktop: a scrollable tiling Wayland session with waybar, kitty, and fastfetch reporting a read-only overlay root](docs/screenshots/niri.jpg)
13+
14+
## Your declaration
15+
16+
```toml
17+
schema_version = 1
18+
19+
[system]
20+
desktop = "niri" # curated sets: "niri" or "cosmic"; omit for headless
21+
# base = "quay.io/fedora/fedora-bootc:44" # optional; see below
22+
23+
[user]
24+
name = "me"
25+
shell = "fish"
26+
# password_hash = '$6$...' # from `kuma passwd`; applies only at creation
27+
28+
[packages]
29+
rpm = ["fish", "distrobox", "tailscale"]
30+
flatpak = ["org.mozilla.firefox"] # from Flathub, converged on boot
31+
brew = ["ripgrep", "gh"] # CLI tools, no rebuild needed
32+
33+
[services]
34+
enable = ["tailscaled.service"]
35+
36+
[snapshots]
37+
enable = true # hourly read-only btrfs snapshots of /var/home
38+
```
39+
40+
A fuller, commented version lives in
41+
[`examples/`](examples/kuma.toml.example), and a test keeps every example
42+
valid against the current schema.
43+
44+
**There is no base to name by default.** With `system.base` unset, kuma
45+
composes its own from Fedora's package repos, starting from Fedora's
46+
minimal bootc manifest: bootc, systemd, the kernel, dnf, and the hardware
47+
enablement a real machine needs. Fedora stays the package source; kuma
48+
builds no packages and no kernels. Name a `base` and kuma builds on that
49+
image instead, as any bootc image can be.
50+
51+
`[system].firmware` trims the composed base to your hardware. Unset, it
52+
ships every vendor's, so a machine that declares nothing about its own
53+
still boots with working GPU, wifi, and audio. LVFS firmware updates
54+
refresh on a timer; applying them stays a deliberate `fwupdmgr update`.
55+
56+
Machine state stays out of the file by default. Timezone and hostname
57+
belong to the machine (`timedatectl`, `hostnamectl`) and survive image
58+
updates; pin them here only when you want every machine built from this
59+
file to match.
60+
61+
## How this differs
62+
63+
**NixOS and Guix** own the idea: one versioned file, convergence as the
64+
only way to change anything, rollback for free. Getting there cost them
65+
an entire package universe. Kuma keeps Fedora as the package source and
66+
builds no packages and no kernels, so the declarative property arrives
67+
without an ecosystem to rebuild. Nix's purity guarantees are what you
68+
give up for that.
69+
70+
**Universal Blue** (Bluefin, Bazzite) ships the same three layers:
71+
immutable base, flatpaks for apps, Homebrew for CLI tools. The unit of
72+
configuration is which image you chose. Brewfiles now declare flatpaks
73+
and formulae together, but `brew bundle` is a command you run rather
74+
than a loop that runs without you, and its cleanup decides what to
75+
remove from what is installed rather than from what it installed. Kuma
76+
converges at boot and on a daily timer, and records what it installed,
77+
so an app you added yourself stays yours and `kuma capture` offers to
78+
write it down.
79+
80+
**BlueBuild** builds an image from a recipe and stops at the image. The
81+
recipe never reaches the running machine. Kuma's keeps working after
82+
install: `sync` converges, `diff` reports drift across file, image, and
83+
machine, `kuma.lock` records what the last build resolved to, and
84+
`capture` turns a change you made by hand into a proposal against the
85+
declaration instead of an error to erase.
86+
87+
## Principles
88+
89+
In order:
1390

1491
1. **Simple.** The schema stays small and boring. Every field is a promise
1592
kept forever, so new ones have to earn their place.
@@ -22,9 +99,11 @@ Four principles, in order:
2299
legal next commands, never a dead end. The image carries the declaration
23100
it was built from, so a machine can always speak for itself.
24101

25-
**Status.** Kuma is early. It builds, boots, and updates real hardware, and
26-
it has not been run widely. Schema version 1 is meant to be permanent, so
27-
the fields below are promises; everything around them can still move. `kuma switch`
102+
## Status
103+
104+
Kuma is early. It builds, boots, and updates real hardware, and it has not
105+
been run widely. Schema version 1 is meant to be permanent, so the fields
106+
above are promises; everything around them can still move. `kuma switch`
28107
reboots you into a system image, and `bootc` will roll a bad one back, but
29108
try a declaration in `kuma vm` before a machine you depend on.
30109

@@ -82,53 +161,6 @@ $ kuma switch --yes # bootc switch; takes effect on next boot
82161

83162
Without `--yes`, `switch` only prints what it would do.
84163

85-
## Your declaration
86-
87-
```toml
88-
schema_version = 1
89-
90-
[system]
91-
desktop = "niri" # curated sets: "niri" or "cosmic"; omit for headless
92-
# base = "quay.io/fedora/fedora-bootc:44" # optional; see below
93-
94-
[user]
95-
name = "me"
96-
shell = "fish"
97-
# password_hash = '$6$...' # from `kuma passwd`; applies only at creation
98-
99-
[packages]
100-
rpm = ["fish", "distrobox", "tailscale"]
101-
flatpak = ["org.mozilla.firefox"] # from Flathub, converged on boot
102-
brew = ["ripgrep", "gh"] # CLI tools, no rebuild needed
103-
104-
[services]
105-
enable = ["tailscaled.service"]
106-
107-
[snapshots]
108-
enable = true # hourly read-only btrfs snapshots of /var/home
109-
```
110-
111-
A fuller, commented version lives in
112-
[`examples/`](examples/kuma.toml.example), and a test keeps every example
113-
valid against the current schema.
114-
115-
**There is no base to name by default.** With `system.base` unset, kuma
116-
composes its own from Fedora's package repos, starting from Fedora's
117-
minimal bootc manifest: bootc, systemd, the kernel, dnf, and the hardware
118-
enablement a real machine needs. Fedora stays the package source; kuma
119-
builds no packages and no kernels. Name a `base` and kuma builds on that
120-
image instead, as any bootc image can be.
121-
122-
`[system].firmware` trims the composed base to your hardware. Unset, it
123-
ships every vendor's, so a machine that declares nothing about its own
124-
still boots with working GPU, wifi, and audio. LVFS firmware updates
125-
refresh on a timer; applying them stays a deliberate `fwupdmgr update`.
126-
127-
Machine state stays out of the file by default. Timezone and hostname
128-
belong to the machine (`timedatectl`, `hostnamectl`) and survive image
129-
updates; pin them here only when you want every machine built from this
130-
file to match.
131-
132164
## Day 2
133165

134166
The file stays the interface. These read it or edit it for you:

‎docs/screenshots/niri.jpg‎

324 KB
Loading

0 commit comments

Comments
 (0)