Skip to main content

max / alloy

image: install what a graphical session needs fedora-bootc is a server base, so pieces the shipped configuration already assumes exists are simply absent. Four of them were: Audio. No pipewire, no wireplumber, and so no pactl, which crates/alloy/src/audio.rs shells out to for every reading and every write. `alloy audio` is documented as shipped and had nothing to front; the Fn-key volume binds, mpv, and playerctl had the same hole under them. pulseaudio-utils is what carries /usr/bin/pactl, so both it and pipewire-pulseaudio are needed. No preset lines: Fedora's own 90-default-user.preset socket-activates pipewire, and preset-all picks it up. wl-clipboard. The sway config exec's `wl-paste --watch cliphist store` twice at session start, and wl-copy is how anything gets back out. cliphist was installed without it, so both watchers failed at every login. git. Not in the base, while aliases.nu ships six git aliases, helix's diff gutters need it, and the audience is developers. xdg-user-dirs. Without it a new account gets no ~/Documents, ~/Downloads or ~/Pictures, which is what the file-chooser portal and yazi open into. Its unit is WantedBy=graphical-session-pre.target and greetd exec's sway directly, so the sway config runs xdg-user-dirs-update itself, the same reason swayosd-server is exec'd there. Whether user units should be activated at all under this session stays an open question. These sit in their own Containerfile group under a header saying they are prerequisites, not curated picks, so the next addition lands in the right place: the curated groups still require a STACK.md entry behind them. Also fixes the active-window screenshot bind, which was a second copy of the region-select line. It was deferred on the belief that jq had to be installed; jq is in the base already (jq-1.8.1-3.fc43), so the deferral cost nothing but the bind. Established by probing quay.io/fedora/fedora-bootc:43 directly, not observed on hardware. The QEMU punch list is where that gets confirmed.
Co-Authored-By
Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-22 00:20 UTC
Signed with PGP, not checked
Commit: e074d792dd994c7609033d8df807bb97f4e523e9
Parent: db58bf5
2 files changed, +68 insertions, -4 deletions
@@ -152,6 +152,16 @@
152 152 # =====================================================================
153 153 # Package additions — full Alloy stack per docs/STACK.md
154 154 #
155 + # Two kinds of line live here and they are not the same kind of
156 + # decision. The curated picks are STACK.md's, each one a position the
157 + # docs defend. The "session prerequisites" group below is not curated
158 + # at all: fedora-bootc is a *server* base, so pieces a graphical
159 + # session simply cannot work without are absent and have to be named
160 + # explicitly. Treating that group as if it were a matter of taste is
161 + # how the image shipped with no audio stack at all — see the group's
162 + # own comment. Add to it when something is required; add to the
163 + # curated groups only with a STACK.md entry behind it.
164 + #
155 165 # Sources noted per group. Anything absent from both Fedora main and
156 166 # Terra is downloaded directly (Nerd Fonts, in the layer above). The
157 167 # `flatpak` client is installed as the `sandboxed` level of the isolation
@@ -228,6 +238,48 @@
228 238 # and is also the install path for ungoogled-chromium.
229 239 podman \
230 240 flatpak \
241 + # -----------------------------------------------------------------
242 + # Session prerequisites — not curated picks. See the header above.
243 + # fedora-bootc is a server base; everything in this group is
244 + # something the shipped configuration already assumes exists.
245 + # -----------------------------------------------------------------
246 + # Audio. The base has no sound stack whatsoever: no pipewire, no
247 + # wireplumber, and so no `pactl`, which crates/alloy/src/audio.rs
248 + # shells out to for every reading and every write. `alloy audio`
249 + # is documented as shipped (docs/CONSOLE.md) but had nothing to
250 + # front. Established by probing quay.io/fedora/fedora-bootc:43
251 + # directly (rpm -q, and `pactl` absent from PATH), not observed on
252 + # hardware — the QEMU punch list is where that gets confirmed. The
253 + # Fn-key volume binds, mpv, and anything playerctl controls have
254 + # the same hole under them.
255 + #
256 + # pulseaudio-utils is what actually carries /usr/bin/pactl (the
257 + # pipewire-pulseaudio package is the daemon-side compat shim, not
258 + # the CLI). Both are needed. No preset lines accompany these:
259 + # Fedora's own 90-default-user.preset already socket-activates
260 + # pipewire and pipewire-pulse, and `systemctl preset-all` below
261 + # picks that up.
262 + pipewire \
263 + wireplumber \
264 + pipewire-pulseaudio \
265 + pulseaudio-utils \
266 + # wl-clipboard. The sway config exec's `wl-paste --watch cliphist
267 + # store` twice at session start (docs/STACK.md#clipboard-history),
268 + # and wl-copy is how anything gets back out of the history. cliphist
269 + # was installed without it, so both watchers failed at every login
270 + # and the clipboard history could never be populated or pasted from.
271 + wl-clipboard \
272 + # git. Not in the base. aliases.nu ships six git aliases, helix's
273 + # diff gutters need it, docs/STACK.md sells EDITOR=hx on git commit
274 + # messages, and the stated audience is developers. The full package
275 + # rather than git-core: the extra weight is documentation and the
276 + # perl helpers, which is the difference between a git that works
277 + # and a git that works when you ask it a question.
278 + git \
279 + # xdg-user-dirs. Without it a new account gets a bare home and no
280 + # ~/Documents, ~/Downloads or ~/Pictures, which is what the GTK
281 + # file-chooser portal and yazi both open into.
282 + xdg-user-dirs \
231 283 && dnf clean all
232 284
233 285 # distrobox is pinned. v2 is a Go rewrite, at rc.3 as of 2026-06-29, and
@@ -81,6 +81,15 @@
81 81 # -------------------------------------------------------------------
82 82 # Startup
83 83 # -------------------------------------------------------------------
84 + # XDG user directories (~/Documents, ~/Downloads, ~/Pictures ...). The
85 + # package ships xdg-user-dirs.service and Fedora's own user preset
86 + # enables it, but the unit is WantedBy=graphical-session-pre.target and
87 + # greetd exec's sway directly, so nothing in this session ever activates
88 + # that target. Run it here, which is the same reason swayosd-server is
89 + # exec'd below rather than left to its user unit. Whether user units
90 + # should be activated at all under this session is an open question, not
91 + # something this line settles.
92 + exec xdg-user-dirs-update
84 93 exec mkdir -p ~/Pictures/Screenshots
85 94 # Clipboard history: two watchers per docs/STACK.md#clipboard-history.
86 95 exec wl-paste --type text --watch cliphist store
@@ -166,12 +175,15 @@
166 175 # Binds — screenshots (grim; sway has no built-in capture)
167 176 # -------------------------------------------------------------------
168 177 set $shot ~/Pictures/Screenshots/screenshot-$(date +%Y%m%d-%H%M%S).png
178 + # Whole output.
169 179 bindsym Print exec grim $shot
180 + # Region select.
170 181 bindsym Shift+Print exec grim -g "$(slurp)" $shot
171 - # Active-window grab needs jq to parse the tree; region-select covers it
172 - # for now. To enable, install jq and use:
173 - # grim -g "$(swaymsg -t get_tree | jq -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"')" $shot
174 - bindsym Ctrl+Print exec grim -g "$(slurp)" $shot
182 + # Active window. This was deferred on the belief that jq had to be
183 + # installed for it; jq is in the fedora-bootc base already, so the
184 + # deferral cost nothing but the bind. Ctrl+Print was a second copy of
185 + # the region-select line until now.
186 + bindsym Ctrl+Print exec grim -g "$(swaymsg -t get_tree | jq -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"')" $shot
175 187 # Annotate the most recent screenshot with satty.
176 188 bindsym $mod+Print exec sh -c 'satty --filename "$(ls -t ~/Pictures/Screenshots/*.png | head -1)"'
177 189