Skip to main content

max / alloy_tui

pivot: swap niri scrolling-tiler for sway; slim the image Drop the GUI-heavy stack this personal/TUI-lean turn no longer wants: gram (Zed fork) + vulkan, ironbar + anyrun + the whole GTK toolchain. Swap niri for sway (i3-style tiling): greetd launches sway, new etc/skel/.config/sway/config translated from the niri binds, the old environment{} block moved to environment.d. rust-build now compiles only wl-screenrec; add grim since sway has no built-in screenshot. Remove the dead niri/ironbar/anyrun config dirs; refresh stale comments. Scaffold checkpoint — bar, launcher, and palette still to shape.
Co-Authored-By
Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-18 02:02 UTC
Signed with PGP, not checked
Commit: bdce9c45f5e063b5524691a1c9ffffc962be0ba7
Parent: 0afc474
14 files changed, +224 insertions, -509 deletions
M Containerfile +11 -48
@@ -12,52 +12,24 @@
12 12 # Keeps the Rust toolchain out of the runtime image.
13 13
14 14 # =====================================================================
15 - # rust-build: ironbar, anyrun, wl-screenrec
15 + # rust-build: wl-screenrec
16 16 # =====================================================================
17 - # All three are small crates. Grouped in one stage so cargo's registry
18 - # cache is amortized across them.
17 + # Small crate not packaged in Fedora. Its own stage keeps the Rust
18 + # toolchain out of the runtime image. clang-devel is for wl-screenrec's
19 + # ffmpeg-sys bindgen.
19 20 FROM registry.fedoraproject.org/fedora:42 AS rust-build
20 21 RUN dnf install -y \
21 22 rust cargo git \
22 23 gcc make pkgconf-pkg-config \
23 24 clang-devel \
24 - gtk3-devel gtk-layer-shell-devel \
25 - gtk4-devel gtk4-layer-shell-devel \
26 25 wayland-devel libdrm-devel \
27 - libevdev-devel libinput-devel \
28 - luajit-devel \
29 26 ffmpeg-free-devel \
30 27 openssl-devel \
31 28 && dnf clean all
32 29 ENV CARGO_HOME=/build/cargo \
33 30 CARGO_TARGET_DIR=/build/target
34 - # ironbar and wl-screenrec are on crates.io; anyrun is git-only.
35 - RUN cargo install --locked --root /build/out ironbar && \
36 - cargo install --locked --root /build/out wl-screenrec && \
37 - cargo install --locked --root /build/out \
38 - --git https://github.com/anyrun-org/anyrun anyrun
39 -
40 - # =====================================================================
41 - # gram-build: Zed fork (graphical editor)
42 - # =====================================================================
43 - # Heavier than the trio above (LLVM, wasm, vulkan headers), so its
44 - # own stage keeps rust-build fast when only the small crates change.
45 - # Source: codeberg.org/GramEditor/gram (GPLv3).
46 - FROM registry.fedoraproject.org/fedora:42 AS gram-build
47 - RUN dnf install -y \
48 - rust cargo git \
49 - gcc make cmake clang mold \
50 - pkgconf-pkg-config \
51 - wayland-devel libxkbcommon-devel \
52 - openssl-devel fontconfig-devel freetype-devel \
53 - alsa-lib-devel \
54 - vulkan-loader-devel vulkan-headers \
55 - && dnf clean all
56 - ENV CARGO_HOME=/build/cargo \
57 - CARGO_TARGET_DIR=/build/target
58 - RUN git clone --depth 1 https://codeberg.org/GramEditor/gram /build/gram
59 - WORKDIR /build/gram
60 - RUN cargo build --release --locked --bin gram
31 + # wl-screenrec is on crates.io.
32 + RUN cargo install --locked --root /build/out wl-screenrec
61 33
62 34 # =====================================================================
63 35 # Runtime image — the bootable container itself.
@@ -108,9 +80,9 @@
108 80 # =====================================================================
109 81 RUN dnf install -y \
110 82 # Compositor and Wayland session (Fedora main)
111 - niri \
83 + sway \
112 84 xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-gnome \
113 - # Bar, notifications, screenshot, wallpaper
85 + # Notifications, screenshot annotate, wallpaper (bar = sway's built-in swaybar)
114 86 mako \
115 87 satty \
116 88 swww \
@@ -145,21 +117,15 @@
145 117 # Cursor, GTK theme
146 118 bibata-cursor-theme \
147 119 adw-gtk3-theme \
148 - # Screenshot region-select helper
149 - slurp \
120 + # Screenshot capture + region-select (sway has no built-in grab)
121 + grim slurp \
150 122 # Flatpak client (Flathub + Floorp/Rnote install at first boot)
151 123 flatpak \
152 124 # Font tools
153 125 unzip fontconfig \
154 - # Runtime libs for the cargo-built binaries copied in below:
155 - # ironbar → gtk4 + gtk4-layer-shell
156 - # anyrun → gtk3 + gtk-layer-shell
126 + # Runtime libs for the cargo-built binary copied in below:
157 127 # wl-screenrec → ffmpeg-free + libdrm
158 - # gram → vulkan-loader + mesa-vulkan-drivers + fontconfig
159 - gtk3 gtk-layer-shell \
160 - gtk4 gtk4-layer-shell \
161 128 ffmpeg-free libdrm \
162 - vulkan-loader mesa-vulkan-drivers \
163 129 && dnf clean all
164 130
165 131 # =====================================================================
@@ -186,10 +152,7 @@
186 152 # view of /usr/bin, which is what the atomic tooling expects for
187 153 # hand-installed binaries.
188 154 # =====================================================================
189 - COPY --from=rust-build /build/out/bin/ironbar /usr/local/bin/ironbar
190 - COPY --from=rust-build /build/out/bin/anyrun /usr/local/bin/anyrun
191 155 COPY --from=rust-build /build/out/bin/wl-screenrec /usr/local/bin/wl-screenrec
192 - COPY --from=gram-build /build/target/release/gram /usr/local/bin/gram
193 156
194 157 # =====================================================================
195 158 # Package removals — stock desktop pieces Alloy replaces
@@ -1,7 +1,7 @@
1 1 # Alloy greetd configuration
2 2 #
3 3 # Boots into tuigreet on VT1. tuigreet prompts for user and password,
4 - # then execs niri-session. Alloy palette applied via tuigreet's --theme.
4 + # then execs sway. Alloy palette applied via tuigreet's --theme.
5 5 #
6 6 # Command must stay on a single line: greetd's TOML parser rejects the
7 7 # multi-line basic-string / backslash-continuation form ("expected
@@ -12,5 +12,5 @@
12 12 switch = true
13 13
14 14 [default_session]
15 - command = "tuigreet --time --remember --asterisks --cmd niri-session --theme 'container=white;border=dark_gray;text=black;time=dark_gray;prompt=yellow;input=black;action=dark_gray;button=yellow'"
15 + command = "tuigreet --time --remember --asterisks --cmd sway --theme 'container=white;border=dark_gray;text=black;time=dark_gray;prompt=yellow;input=black;action=dark_gray;button=yellow'"
16 16 user = "greeter"
@@ -16,7 +16,7 @@
16 16 # -------------------------------------------------------------------
17 17 osc=no # no on-screen controller
18 18 osd-bar=no # no on-screen bar on volume/seek
19 - no-border # Niri owns window decoration
19 + no-border # Sway owns window decoration
20 20 keep-open=yes # do not quit at end of file — user closes
21 21 save-position-on-quit=yes
22 22
@@ -2,17 +2,17 @@
2 2 #
3 3 # Terminal per docs/STACK.md#terminal. Kitty graphics protocol so yazi
4 4 # previews render inline (image_filter=triangle in yazi.toml). No
5 - # multiplexing — Niri owns tiling.
5 + # multiplexing — Sway owns tiling.
6 6 #
7 7 # Rio sets TERM=xterm-256color and TERM_PROGRAM=rio itself; yazi picks
8 8 # kitty graphics from that pair with no explicit backend key needed.
9 9
10 10 [navigation]
11 - mode = "Plain" # no tabs/splits — Niri handles it
11 + mode = "Plain" # no tabs/splits — Sway handles it
12 12
13 13 [window]
14 14 background-opacity = 1.0
15 - decorations = "Disabled" # niri owns the frame; prefer-no-csd
15 + decorations = "Disabled" # sway owns the frame; prefer-no-csd
16 16
17 17 [renderer]
18 18 performance = "High"
@@ -1,10 +1,10 @@
1 1 # Alloy satty configuration
2 2 #
3 - # Screenshot annotator per docs/STACK.md#screenshot-stack. Niri's
3 + # Screenshot annotator per docs/STACK.md#screenshot-stack. Sway's
4 4 # built-in captures the frame; satty picks up when the user wants
5 5 # to annotate before sharing.
6 6 #
7 - # Bound in niri.kdl as Mod+Print — annotates the most recent
7 + # Bound in the sway config as Mod+Print — annotates the most recent
8 8 # screenshot under ~/Pictures/Screenshots/.
9 9
10 10 [general]
@@ -4,7 +4,7 @@
4 4 # is the first marquee design-system app (v1 target); this config is
5 5 # what ships until then. Palette per docs/TOKENS.md.
6 6 #
7 - # Bound in niri.kdl as Mod+Ctrl+L. No image — surface color from the
7 + # Bound in the sway config as Mod+Ctrl+L. No image — surface color from the
8 8 # palette so the transition into lock reads as chrome, not media.
9 9
10 10 daemonize
@@ -36,7 +36,7 @@
36 36 * Window chrome removal
37 37 * ------------------------------------------------------------------- */
38 38
39 - /* Title bar and menu bar entirely off — Niri owns window decoration. */
39 + /* Title bar and menu bar entirely off — Sway owns window decoration. */
40 40 #titlebar-buttonbox-container { display: none !important; }
41 41 #toolbar-menubar { display: none !important; height: 0 !important; }
42 42