Skip to main content

max / alloy

Swap the terminal from rio to shop Build shop from source at a pinned revision in the rust-build stage and copy it into the image; drop rio from the dnf set. Update STACK.md with the authored-vs-adopted reasoning, the accepted costs, and how yazi's graphics detection resolves now that shop answers DA1 and the kitty graphics query. The first attempt at this (0771ea5, reverted in 3c89165) changed the terminal everywhere it is named and nowhere it is wired. Also here: - schemas/shop.toml.schema, so the settings view's Applications tab has an entry for the terminal that is installed. Three fields, where the terminal it replaced had ninety: shop resolves its palette from a theme id and bundles its own font, so there is nothing to transcribe. - The Containerfile never copied schemas/ into the image at all, so that tab read "no schemas found" on every installed machine. Invisible from a checkout, where the search path's CARGO_MANIFEST_DIR fallback finds the repo's copies. - templates/etc/skel/.config/rio/ survived the swap, so every new user got a config for a terminal the image does not carry. - schemas/rio.toml.schema moves to crates/alloy/testdata/. It was both the shipped catalog entry and the only fixture exercising the whole DSL; deleting it would have left groups, presets and list-of-tables untested. - credits.toml drops Rio and gains shop. SHOP_REV is 07fb4e7, four commits ahead of the first attempt's pin, which lands scrollback with the wheel and the I-beam pointer.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-01 18:10 UTC
Signed with PGP, not checked
Commit: 08f59d075cc5e7edcf642385e1341175c4a0f7d2
Parent: 088b1ee
23 files changed, +262 insertions, -219 deletions
M Containerfile +69 -4
@@ -33,7 +33,53 @@
33 33 # greeter's console palette; skelgen emits that table now, along with the rest
34 34 # of the desktop skeleton, so there is one implementation of the ANSI mapping
35 35 # instead of three.
36 - RUN dnf install -y cargo rust && dnf clean all
36 + # git, and the two libraries shop links, on top of the toolchain. The console
37 + # needs none of them; shop is Wayland and GPU facing, so it links
38 + # libwayland-client and libxkbcommon at build time and will not compile
39 + # without their headers. `ldd` on the built binary is the check if this list
40 + # ever looks wrong.
41 + RUN dnf install -y cargo rust git wayland-devel libxkbcommon-devel pkgconf \
42 + && dnf clean all
43 +
44 + # =====================================================================
45 + # shop, Alloy's terminal.
46 + # =====================================================================
47 + # Built from source rather than installed from a repo, because there is no
48 + # repo: shop is first-party and packaged nowhere. Owning an RPM spec, a COPR
49 + # and a release cadence for a binary whose only consumer is this image buys
50 + # nothing, and Alloy publishes no other artifact (distribution is builders,
51 + # not images).
52 + #
53 + # Pinned by revision, not by branch. An unpinned build is a different image
54 + # every day for the same Containerfile, and the terminal is the one component
55 + # where "it worked yesterday" has no recovery path from inside the session.
56 + # Bump this deliberately.
57 + #
58 + # `cargo install` rather than a second COPY-and-build stage: shop is a separate
59 + # repo with its own workspace, so there is no local tree to copy and no
60 + # existing pin to imitate. `--locked` builds the dependency graph shop
61 + # committed rather than whatever resolves that day, matching the console's
62 + # `--locked` below.
63 + #
64 + # Above the console's source on purpose. This layer is keyed on the revision
65 + # alone, so console edits — the thing that changes most often — reuse it
66 + # instead of rebuilding a terminal that did not change. Moving it below the
67 + # `COPY crates/` would defeat the dependency-cache split that follows.
68 + ARG SHOP_REV=07fb4e70fb98f2965fd9e37e59fc221209ab837d
69 + RUN cargo install \
70 + --git https://makenot.work/git/max/shop.git \
71 + --rev "${SHOP_REV}" \
72 + --locked \
73 + --root /shop \
74 + shop
75 +
76 + # The binary exists and runs. Every other way this fails is silent at build
77 + # time and total at first login: sway binds $mod+Return to `shop` and the
78 + # launcher spawns `${TERMINAL:-shop}`, so a missing binary is a session with
79 + # no way to reach a shell and no way to edit the config that would fix it,
80 + # short of a VT. Same reasoning as the console's stub assertions below.
81 + RUN test -x /shop/bin/shop \
82 + || { echo "shop did not install; the session would have no terminal" >&2; exit 1; }
37 83
38 84 WORKDIR /src
39 85
@@ -352,8 +398,8 @@
352 398 libnotify \
353 399 satty \
354 400 swww \
355 - # Terminal, editor, shell, prompt
356 - rio \
401 + # Editor, shell, prompt. The terminal is not here: shop is built from
402 + # source in the rust-build stage and copied in below.
357 403 helix \
358 404 nushell \
359 405 starship \
@@ -790,7 +836,7 @@
790 836 gnome-session \
791 837 # foot, a second terminal nothing in Alloy invokes. It arrives as a
792 838 # weak dependency of sway-config-upstream, whose config binds it as
793 - # sway's default terminal; Alloy ships its own config and binds rio
839 + # sway's default terminal; Alloy ships its own config and binds shop
794 840 # (docs/STACK.md#terminal), so nothing here ever launches it. Left in,
795 841 # it puts three of the eleven entries in the new launcher (Foot, Foot
796 842 # Client, Foot Server), which is how an unused package stops being
@@ -1278,11 +1324,30 @@
1278 1324 # something the operator dropped in.
1279 1325 COPY --from=rust-build /src/target/release/alloy /usr/bin/alloy
1280 1326
1327 + # The terminal, from the same stage. /usr/bin for the same reason as the
1328 + # console: shipped software, and /usr/local is not part of a bootc image's
1329 + # immutable tree.
1330 + COPY --from=rust-build /shop/bin/shop /usr/bin/shop
1331 +
1281 1332 # The themes that binary refuses to run without. Kept next to it so the
1282 1333 # two move together: shipping the console without these is not a degraded
1283 1334 # console, it is one that exits on launch.
1284 1335 COPY --from=rust-build /staged-themes /usr/share/alloy/themes
1285 1336
1337 + # The schemas the settings view's Applications tab is built from. Straight
1338 + # from the build context: they are hand-authored TOML that nothing compiles,
1339 + # so there is no staged copy to take them from.
1340 + #
1341 + # Missing until 2026-08-01, which meant `alloy settings` opened its
1342 + # Applications tab on "no schemas found" for every installed machine. It was
1343 + # invisible from a source checkout because the search path ends in a
1344 + # CARGO_MANIFEST_DIR fallback, so a `cargo run` finds the repo's copies and an
1345 + # image finds nothing.
1346 + COPY schemas /usr/share/alloy/schemas
1347 +
1348 + RUN test -n "$(ls -A /usr/share/alloy/schemas)" \
1349 + || { echo "no config schemas shipped; the settings Applications tab would be empty" >&2; exit 1; }
1350 +
1286 1351 # The tool that applies the greeter's console palette. The table itself arrives
1287 1352 # with the rest of the rendered tree above, at /usr/share/alloy/vtrgb.
1288 1353 # alloy-vtrgb.service reads it; setvtrgb ships in kbd, which systemd's vconsole
M docs/CONSOLE.md +5 -3
@@ -147,14 +147,16 @@
147 147 Three options considered. Committing to option 2 with 3 as opportunistic input.
148 148
149 149 1. **Value inference.** Read the file, infer form from value types (bool to toggle, string to input, table to subsection). Cheap. Loses everything about validation, enums, docs, defaults, sections. **Rejected**, because it produces "editable but not useful" forms, which is worse than no form.
150 - 2. **Explicit schema files, one per adopted config.** Alloy ships `schemas/rio.toml.schema`, `schemas/yazi.toml.schema`, `schemas/mako.schema`, etc. **Picked.** Alloy's whole thesis is "curated stack with authored defaults", and schemas are the natural extension of that. Bounded catalog: ~10 schemas for the adopted v0 stack. (The sway config's i3-style syntax is neither TOML nor KDL, so it takes the text-edit fallback, not a schema form.)
150 + 2. **Explicit schema files, one per config.** Alloy ships `schemas/shop.toml.schema`, and `schemas/yazi.toml.schema`, `schemas/mako.schema` and the rest follow. **Picked.** Alloy's whole thesis is "curated stack with authored defaults", and schemas are the natural extension of that. Bounded catalog: ~10 schemas for the adopted v0 stack. (The sway config's i3-style syntax is neither TOML nor KDL, so it takes the text-edit fallback, not a schema form.)
151 151 3. **Upstream schemas (JSON Schema, KDL schema) where they exist.** Some tools ship JSON Schema; most don't. **Adopted opportunistically**: where an upstream schema exists and is maintained, Alloy imports/converts it rather than authoring its own. Falls back to option 2 for the rest.
152 152
153 153 ### The schema format
154 154
155 155 Alloy authors a small TOML dialect for describing TOML (and a parallel one for KDL). Not JSON Schema, which is powerful but verbose and awkward for humans. Not TOML's own type system, which is insufficient (no enums, no docs, no cross-field constraints).
156 156
157 - Schema-format v1, worked in full at [`schemas/rio.toml.schema`](../schemas/rio.toml.schema). The design pass against rio's real config surface shaked out five affordances beyond a naive field list: sections, groups, presets, format hints, and an unknown-key policy.
157 + Schema-format v1, worked in full at [`crates/alloy/testdata/rio.toml.schema`](../crates/alloy/testdata/rio.toml.schema). The design pass against rio's real config surface shook out five affordances beyond a naive field list: sections, groups, presets, format hints, and an unknown-key policy.
158 +
159 + That worked example is a test fixture now rather than a shipped schema, since shop replaced rio in the image (see [STACK.md](STACK.md#terminal)). It stays the format's reference because nothing shipped exercises the DSL as widely: `schemas/shop.toml.schema`, the only catalog entry today, is three plain fields, which is what a terminal needs when it resolves its palette from a theme id instead of from ninety transcribed keys.
158 160
159 161 **Header.** Every schema declares its target file, where that file lives, the tool it targets, a target-version semver range, the schema-DSL version, and an unknown-key policy. `target_path` carries `~` and `$XDG_CONFIG_HOME` unexpanded, so parsing a schema does not depend on the environment it is parsed in; whoever opens the file resolves them. It is optional, because `alloy config <path>` names the file itself, but a schema without one describes a shape and not a location and so cannot be listed as an app. Unknown keys default to `preserve` so that a rio release adding a new field never bricks the editor: the field survives the edit round-trip and surfaces as an info diagnostic.
160 162
@@ -239,7 +241,7 @@
239 241
240 242 ## Open questions
241 243
242 - - [x] **Schema format finalized: schema-format v1.** Worked example at [`schemas/rio.toml.schema`](../schemas/rio.toml.schema); DSL reference in the section above. The rio design pass surfaced five affordances the original sketch missed (sections, groups, presets, format hints, unknown-key policy).
244 + - [x] **Schema format finalized: schema-format v1.** Worked example at [`crates/alloy/testdata/rio.toml.schema`](../crates/alloy/testdata/rio.toml.schema); DSL reference in the section above. The rio design pass surfaced five affordances the original sketch missed (sections, groups, presets, format hints, unknown-key policy).
243 245 - [ ] KDL editing story: the `kdl` crate ecosystem in Rust is less mature than `toml_edit`. Verify roundtrip-safe editing is achievable before committing to the "one editor, both formats" pitch. If not, KDL configs get the text-edit fallback until it is.
244 246 - [x] **Command-log pane: always on.** The pedagogical claim ("teaches its own primitives") only lands if the log is visible. Users who dislike it can add a hide toggle later; the shipped default should teach.
245 247 - [x] **Naming: `alloy settings` is the entry point, `alloy config <path>` opens one file.** Still no `alloy edit` alias, and the reasoning that settled the second name holds: the "config = editor" mental model works for KDL too, since these are structured machine-editable formats. What changed in 2026-07 is that a path is the wrong thing to have to know first. Someone looking for the time or the hostname has no path in mind, and someone looking for rio's config wants rio, not `~/.config/rio/config.toml`. So the verb people use is `alloy settings` and `alloy config <path>` is kept rather than deprecated, as the direct-open form for scripts and sidecars. Same treatment `alloy update` got against `alloy pkg`.
@@ -17,7 +17,7 @@
17 17 Large, declarative iconography lived on GUI surfaces (egui lockscreen ornament, launcher app icons, settings headers, marquee-app heroes). Those surfaces were dropped in the pivot, so the hero tier lost most of its homes. It survives only where a graphical surface remains:
18 18
19 19 - **swaylock background**: the adopted lockscreen can display a background image; a hero plate belongs here.
20 - - **First-boot splash**: renderable via rio's kitty-graphics protocol, or shown before the session starts.
20 + - **First-boot splash**: renderable via shop's kitty-graphics protocol, or shown before the session starts.
21 21 - **Brand assets** outside the running system (repo social card, README).
22 22
23 23 Everything else that used to carry a hero illustration is now terminal chrome and uses the functional glyph tier instead. The hero tier is therefore **deferred**: the style below is preserved so the identity is not lost and so the surviving surfaces have a spec, but no hero illustrations are on the critical path for the TUI work.
M docs/SHELL.md +1 -1
@@ -12,7 +12,7 @@
12 12
13 13 The pick that keeps the ecosystem tax bounded:
14 14
15 - - **Login shell:** `nu`. What the user sees when they open rio, when they SSH in, when they open a scratch pane.
15 + - **Login shell:** `nu`. What the user sees when they open shop, when they SSH in, when they open a scratch pane.
16 16 - **`/bin/sh`:** bash, unchanged. Every `curl | sh` invokes this. Untouched.
17 17 - **`/bin/bash`:** bash, unchanged. Every `#!/bin/bash` script runs here. Untouched.
18 18 - **`/etc/shells`:** contains both nu and bash. `chsh -s /bin/bash` reverts a user to bash cleanly and reversibly.
M docs/STACK.md +22 -15
@@ -50,7 +50,7 @@
50 50
51 51 ## Launcher
52 52
53 - **`alloy-menu`: fzf over desktop entries, run in rio.** Bound `Mod+D`. A shell script in `usr/bin/`, about forty lines, that reads `.desktop` files from the system, user and Flatpak paths, pipes names through fzf, and hands the chosen `Exec` line to `swaymsg exec` so the app outlives the terminal that launched it.
53 + **`alloy-menu`: fzf over desktop entries, run in shop.** Bound `Mod+D`. A shell script in `usr/bin/`, about forty lines, that reads `.desktop` files from the system, user and Flatpak paths, pipes names through fzf, and hands the chosen `Exec` line to `swaymsg exec` so the app outlives the terminal that launched it.
54 54
55 55 The split with `Mod+Return` is the design. Typing a command is what a shell is for, and a shell is one keystroke away, so the launcher does not list every binary on `PATH`: doing that buries the browser under coreutils. It lists the graphical apps that have a name, an icon and a binary nobody remembers. Two keys, two jobs.
56 56
@@ -113,32 +113,39 @@
113 113
114 114 ## Terminal
115 115
116 - **rio.** Rust, WGPU-backed, TOML config, kitty and sixel and iTerm2 graphics protocols. Ships in Fedora repos.
116 + **shop.** Rust, WGPU-backed, Wayland-only, TOML config, kitty graphics protocol. Alloy's own, built from source into the image. Adopted 2026-07-31, replacing rio.
117 117
118 - The pick is driven by the yazi commitment above. Yazi is the TUI primary, "where keyboard-driven Alloy users will live by default." A terminal without graphics protocols neuters the primary tool, so the question isn't "are previews a nice-to-have" but "does the primary tool run at full capability." That reframes the axis and makes rio the honest answer.
118 + The pick is still driven by the yazi commitment above. Yazi is the TUI primary, "where keyboard-driven Alloy users will live by default." A terminal without graphics protocols neuters the primary tool, so the question isn't "are previews a nice-to-have" but "does the primary tool run at full capability." shop implements the kitty graphics protocol, which is the one yazi wants.
119 119
120 - Secondary alignments:
120 + rio satisfied that much too, and was the pick until shop met its daily-drive bar. What an adopted terminal could not satisfy is the rest:
121 +
122 + - **The terminal is a surface Alloy designs.** Every other surface in the image renders from one makeover theme through one intent table. An adopted terminal renders from sixteen hex values transcribed into its own config, and the two drift the moment either side moves. shop takes a theme by id and resolves the slots itself, from the same `makeover::ansi_intent` table the kernel cmdline and setvtrgb render from. There is nothing left to transcribe, which is why `templates/etc/skel/.config/shop/config.toml.in` carries no colour at all.
123 + - **First-party.** The console is authored. The terminal is the other surface a user is inside all day, and adopting it put the most-used window in the image on someone else's roadmap.
124 + - **Wayland-only.** The rest of the stack already assumes it. A terminal carrying an X11 path carries it for nobody here.
125 +
126 + Secondary alignments, unchanged by the swap:
121 127 - **TOML config.** No scripting language dependency, consistent with Alloy's rejection of Lua/yuck/similar config surfaces elsewhere in the stack.
122 - - **Design-forward posture.** Rio treats the terminal as a displayed surface, not just a fast text renderer. That matches Alloy's design-system stance.
123 128 - **No multiplexing.** Tabs, splits, panes are sway's job. A terminal that also tiles is duplicated budget. Alloy therefore ships no multiplexer either: tmux and zellij are not in the image, and a terminal's own docs should not send an Alloy user looking for them. A window is a window, and `Mod+H/J/K/L` moves between them.
124 129
125 - **yazi runs with kitty graphics under rio, not sixel.** Both work in rio; kitty is the modern protocol, sixel is the compat path. Yazi picks the graphics protocol at runtime by detecting terminal capability from `TERM` / `TERM_PROGRAM`, so the config work is small:
130 + **yazi should run with kitty graphics under shop, not sixel.** shop implements kitty graphics and no sixel, so there is no compat path to fall back to inside the terminal: it is inline previews or chafa half-blocks.
126 131
127 - - Rio sets `TERM=xterm-256color` and identifies itself via `TERM_PROGRAM=rio`. Yazi's runtime detection picks kitty graphics from that.
128 - - `yazi.toml` default: leave image previews on with `image_filter = "triangle"` and `image_quality = 75`. No explicit backend key needed.
129 - - Verify at v0 packaging time by opening an image directory in yazi under rio and confirming inline preview renders (not falling back to chafa/half-block).
132 + - `yazi.toml` default: leave image previews on with `image_filter = "triangle"` and `image_quality = 75`.
133 + - **Detection is by query, not by name.** rio identified itself with `TERM_PROGRAM=rio`; shop sets `TERM=xterm-256color` and no `TERM_PROGRAM`, and appears in no terminal list yazi carries. Yazi's fallback for an unrecognised name is to ask: it sends a kitty graphics query and waits on DA1. shop answers both as of `1c22eee`, so the name meaning nothing to yazi costs nothing. Before that commit it was a three second stall on every launch followed by chafa half-blocks. Still worth opening an image directory under shop once on real hardware and confirming inline previews render.
130 134
131 - (Reduce to a real `yazi.toml` file when the v0 stack packaging lands. Documented here so the pick's implication isn't lost.)
135 + Cost of authoring rather than adopting, stated plainly:
132 136
133 - Risk accepted: rio is ~2 years mature vs. alacritty's ~7. If rio proves flaky in real use, the fallback is alacritty, and the graphics gap becomes a knowing loss. Naming this trade-off here rather than pretending rio is drama-free.
137 + - **No repo to ship from.** shop is packaged nowhere, so the image builds it from source at a pinned revision (`SHOP_REV` in the Containerfile). An image build needs network to fetch it, and bumping the pin is a deliberate act rather than something `dnf update` does.
138 + - **It is new.** Written in 2026-07. The daily-drive bar it had to clear was selection and clipboard plus real key handling, both landed 2026-07-31, and scrollback with the wheel and Shift+Page landed the same day. Still absent at the pinned revision: scrollback search; reflow, so a resize clips scrollback to the new width rather than rewrapping it; sixel, which the kitty protocol covers the same ground as and which shop deliberately does not claim in its DA1 reply; OSC 8 hyperlinks.
139 + - **The complexity was the objection, and it was a fair one.** Terminals are among the most complex userland software: ANSI, terminfo, graphics protocols, IME, OSC, performance under load. This section previously rejected writing one on exactly that ground. The scope was taken on deliberately, with a stated bar and a fallback, rather than by deciding the objection was wrong.
140 +
141 + Risk accepted, and the fallback is unchanged: **alacritty**, if shop proves unworkable. The graphics gap becomes a knowing loss then, exactly as it would have if rio had failed.
134 142
135 143 Rejected:
136 - - **alacritty.** Upstream has firmly refused sixel/kitty graphics for years: a definitional stance, not a pending PR. Kills yazi previews permanently.
144 + - **rio.** The prior pick, and a good one for an adopted terminal: Rust, WGPU, TOML, all three graphics protocols, in Fedora repos. Replaced for the reasons above, none of which are faults of rio's.
145 + - **alacritty.** Upstream has firmly refused sixel/kitty graphics for years: a definitional stance, not a pending PR. Kills yazi previews permanently. Kept as the fallback anyway, with that loss named.
137 146 - **wezterm.** Lua config violates the "no scripting-language configs" line held elsewhere in the stack. Its central pitch (built-in multiplexing, tabs, SSH client) duplicates sway's tiling and is spent budget in this stack.
138 147 - **cosmic-term.** Uses `alacritty_terminal` as the backend (the same graphics gap as alacritty) and additionally couples Alloy's default terminal to libcosmic's visual identity, which the design-system stance rejects.
139 148
140 - No custom egui terminal: terminals are among the most complex userland software (ANSI, terminfo, sixel/kitty graphics, IME, OSC, performance under load). Wrong scope.
141 -
142 149 ## Browser
143 150
144 151 **Helium baked into the image as the default, unconfigured.** Helium is ungoogled-chromium with the behavior Alloy used to hand-build on top of Firefox already set upstream: ads, trackers, cookie banners and third-party cookies blocked by default, fingerprinting tampered with, no analytics, and no network request at all on first launch. Alloy ships no policy file, no preference seed, no chrome CSS and no extension pin for it. Shipping nothing is the reason it is the default, not an omission next to it. The packaging rules this follows are in the wiki note `alloy-packaging-policy`; the short form is that an app earns a recommendation by not needing configuration, which is the same test that picked helix over a configured vim.
@@ -445,7 +452,7 @@
445 452 Pango consumers are not a cell grid and keep the plain family, where the fuller icons are free.
446 453
447 454 Applied at:
448 - - Rio, all five `fonts.*.family` entries: `IosevkaTerm Nerd Font Mono`.
455 + - shop: nothing to apply. It bundles `IosevkaTerm Nerd Font Mono` into the binary and has no font setting, so the terminal cannot be pointed at a font the image does not carry. This is also why it renders nerd-font glyphs with no system font install.
449 456 - fontconfig `monospace` alias: `IosevkaTerm Nerd Font Mono`, for everything else that asks for mono.
450 457 - `templates/etc/skel/.config/mpv/mpv.conf.in`, `templates/etc/skel/.config/imv/config.in`, the sway bar and title font, mako, swaylock, satty: the plain `IosevkaTerm Nerd Font`, all pango.
451 458
@@ -40,6 +40,12 @@
40 40 url = "https://crates.io/crates/makeover"
41 41 note = "theme loading"
42 42
43 + [[section.project]]
44 + name = "shop"
45 + license = "MIT"
46 + url = "https://makenot.work/git/max/shop"
47 + note = "the terminal"
48 +
43 49 [[section]]
44 50 title = "the system underneath"
45 51
@@ -218,11 +224,6 @@
218 224 license = "MIT"
219 225 url = "https://nushell.sh"
220 226
221 - [[section.project]]
222 - name = "Rio"
223 - license = "MIT"
224 - url = "https://raphamorim.io/rio"
225 -
226 227 [[section.project]]
227 228 name = "Starship"
228 229 license = "ISC"
@@ -7,7 +7,7 @@
7 7 the previous one stays on disk to roll back to.
8 8 - **sway as the compositor.** i3-style manual tiling on Wayland. Workspaces,
9 9 splits, tabs, and stacks. No scrolling columns, no animation.
10 - - **A terminal-first stack.** rio for the terminal, nushell for the shell,
10 + - **A terminal-first stack.** shop for the terminal, nushell for the shell,
11 11 helix for the editor, yazi for files, bottom for processes, zathura for PDFs,
12 12 imv for images, mpv for video.
13 13 - **One authored program, the `alloy` console.** Network, audio, displays,
@@ -23,7 +23,7 @@
23 23
24 24 Mod+Return
25 25
26 - That is rio, running nushell. It is where you will spend most of your time.
26 + That is shop, running nushell. It is where you will spend most of your time.
27 27
28 28 If you would rather find a graphical app by name than type a binary:
29 29
@@ -43,7 +43,7 @@
43 43 the timezone did.
44 44
45 45 **Applications** holds config files, listed by the app they configure rather
46 - than by path. You pick `rio`, not `~/.config/rio/config.toml`. Editing here is
46 + than by path. You pick `shop`, not `~/.config/shop/config.toml`. Editing here is
47 47 schema-driven: fields carry types, ranges, allowed values, and their own help
48 48 text, and the file keeps its comments and key order when it is written back.
49 49
@@ -7,9 +7,9 @@
7 7
8 8 yazi
9 9
10 - A two-pane file manager in the terminal, with previews. Under rio it renders
10 + A two-pane file manager in the terminal, with previews. Under shop it renders
11 11 images inline using the kitty graphics protocol rather than falling back to
12 - coloured blocks, which is most of the reason rio is the terminal.
12 + coloured blocks, which is most of what the terminal is asked for here.
13 13
14 14 `?` lists its keys. `q` leaves.
15 15