Commits
The disko tank/radicle dataset must exist before switching on a live host; if
it is absent the zfsutil mount fails local-fs.target and drops to emergency
mode (no network). nofail degrades that to a skipped mount instead. Create the
dataset with: zfs create -o mountpoint=/var/lib/radicle -o quota=80G tank/radicle
Extend 2configs/radicle.nix into a public seed: allow-all seeding (scope=all),
listen 0.0.0.0:8776 + externalAddresses radicle.lassul.us:8776, radicle-httpd
behind an nginx vhost (radicle.lassul.us, ACME). Drop the tor proxy + onion
preferred seeds. Move the config off xerxes onto neoprism, and put the node
state on tank at /var/lib/radicle with an 80G ZFS quota (radicle has no built-in
byte quota; the dataset bounds it).
Reference pinentry-rofi (or pinentry_mac on darwin) directly in the
wrapper and write it to rbw config before unlocking, instead of relying
on a persisted store path that gets garbage-collected and breaks
'rbw unlock' with 'error spawning pinentry: No such file'.
Browser links now point at https://covibe.lassul.us/c (our client, our
relay) instead of my.omp.sh. Nothing collab-related loads off-site.
- ompPackage: llm.omp + omp-collab-autostart.patch (env-driven headless
collab autostart; covibe owns the room id/key).
- relayHost = covibe.lassul.us; browser links use omp's hosted collab-web,
terminal guests use 'omp join'. Sessions enumerable + killable by id.
nixpkgs now ships the pkg_resources->importlib.resources patch and builds
tulir-telethon standalone (python3.14 works), so the overlay override
broke the build via --replace-fail on an already-patched line.
Replace the greetd gamescope-session (which required STROM_NO_GAMESCOPE and
rendered games directly in the session compositor) with greetd launching sway.
A game's nested gamescope prefers its wayland backend, which needs wlroots
protocols that cage (and, differently, an outer gamescope session) do not give
it. Under those it fell back to gamescope's SDL backend, whose Vulkan swapchain
remake loops and aborts on this RADV RENOIR iGPU (rendervulkan.cpp
vulkan_remake_swapchain) - crashing e.g. Baba Is You a couple seconds in. sway
exposes those protocols, so gamescope inits its wayland backend and never hits
the crashing SDL path. Every game keeps its own gamescope (render resolution,
in-game exit chord, bare-tty portability); no per-game workaround needed.
Also resolve STROM_FLAKE to the /home/strom/strom checkout when present (github
fallback) so changes can be tested on the box before pushing upstream.
Xbox pads pair via JustWorks; on reconnect a pad whose bond went stale
re-initiates pairing, which needs a registered agent to auto-confirm. bluetuith
only has an agent while actively pairing in it, so an autonomous re-pair hit
"No agent available for request type 2" and the link dropped right after
connecting. Run bt-agent -c NoInputNoOutput as a persistent default agent so
pairing/re-pairing always completes.
Also set TemporaryTimeout=30 so the LAN party's hundreds of stray BLE devices
are evicted from the cache instead of piling up and saturating the adapter.
The bespoke pairing script was fighting Xbox BT quirks (stale bonds,
pairing-mode timing) more than it helped. Remove it; bluetuith (already
installed via 2configs/pipewire.nix) is a cleaner TUI for pairing/managing
controllers.
A pad paired to another device in the meantime still shows Bonded here, so the
old script skipped it and it never reconnected (kept shutting down / rejoining
the other host). Target pads by what actually shows up in the scan (present and
advertising in pairing mode) rather than the bonded-device list, and clear any
stale bond before re-pairing. Pads already connected and working are left
alone.
Replace the cage kiosk with a gamescope session on DRM (greetd autologin).
gamescope presents straight to the display, so there is no nested Wayland
swapchain for RADV to storm on this Vega iGPU - which crashed games like Baba
Is You when gamescope was nested under cage. Set STROM_NO_GAMESCOPE=1 so the
launcher runs <slug>.no-gamescope and each game renders directly in the session
compositor instead of nesting its own gamescope.
Runs the patched launcher from the /home/strom/strom checkout until the
STROM_NO_GAMESCOPE support lands upstream (github launcher lacks it).
Add strom-pair (in-session NoInputNoOutput agent + polling, bond check) to
pair Xbox Wireless Controllers one at a time, plus the bluez/kernel bits they
need: hardware.xpadneo, disable_ertm=1 (else AuthenticationFailed), and
FastConnectable=true so bonded pads reconnect. Point the launcher session at
evdev via SDL_JOYSTICK_HIDAPI_XBOX=0, poll hotplug with
SDL_JOYSTICK_DISABLE_UDEV=1, and allow input without focus via
SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS=1.
Autostart the strom couch launcher fullscreen via services.cage on boot
(after LUKS unlock), always pulling the newest launcher with nix run.
Dedicated strom kiosk user; force backlight to max on boot and let the
video group adjust brightness via brightnessctl udev rules.
mpvpaper renders a random video/image from ~/wallpaper on the background
layer, rotated daily; noctalia's own wallpaper is disabled to let it show
through. lockscreen picks from the same folder. Seeds a moewalls pixel-art
sunset starter. Drops the unused feh fetchWallpaper on ignavia.
Keep the default wpa_supplicant backend (iwd pegged 100% CPU in dense
~100-AP RF and wedged the link), disable NIC power-save + PCIe ASPM to
cut mt7925 scan-deauth frequency, and drop the gateway-ping watchdog
(bornhack drops ICMP to the gateway, so it false-fired and bounced a
working connection every 90s).
Mark wlan links unmanaged by systemd-networkd so NetworkManager is
the sole wifi DHCP client. With networking.useNetworkd enabled, the
auto-generated 40-<iface>.network ran a second DHCP client on the
wifi; the two fought over the lease and routes and dropped the link
every few minutes. Match by Type=wlan so it holds across interface
renames.
nixvim's docs build patches nixos-render-docs with nixpkgs PR#538502,
already merged in our nixpkgs, so the patch fails and breaks the build.
We follow a single nixpkgs, so drop the manpage instead.
nixpkgs default python3 moved to 3.14, but tulir_telethon declares no
3.14 support, breaking evaluation.
The disko tank/radicle dataset must exist before switching on a live host; if
it is absent the zfsutil mount fails local-fs.target and drops to emergency
mode (no network). nofail degrades that to a skipped mount instead. Create the
dataset with: zfs create -o mountpoint=/var/lib/radicle -o quota=80G tank/radicle
Extend 2configs/radicle.nix into a public seed: allow-all seeding (scope=all),
listen 0.0.0.0:8776 + externalAddresses radicle.lassul.us:8776, radicle-httpd
behind an nginx vhost (radicle.lassul.us, ACME). Drop the tor proxy + onion
preferred seeds. Move the config off xerxes onto neoprism, and put the node
state on tank at /var/lib/radicle with an 80G ZFS quota (radicle has no built-in
byte quota; the dataset bounds it).
Replace the greetd gamescope-session (which required STROM_NO_GAMESCOPE and
rendered games directly in the session compositor) with greetd launching sway.
A game's nested gamescope prefers its wayland backend, which needs wlroots
protocols that cage (and, differently, an outer gamescope session) do not give
it. Under those it fell back to gamescope's SDL backend, whose Vulkan swapchain
remake loops and aborts on this RADV RENOIR iGPU (rendervulkan.cpp
vulkan_remake_swapchain) - crashing e.g. Baba Is You a couple seconds in. sway
exposes those protocols, so gamescope inits its wayland backend and never hits
the crashing SDL path. Every game keeps its own gamescope (render resolution,
in-game exit chord, bare-tty portability); no per-game workaround needed.
Also resolve STROM_FLAKE to the /home/strom/strom checkout when present (github
fallback) so changes can be tested on the box before pushing upstream.
Xbox pads pair via JustWorks; on reconnect a pad whose bond went stale
re-initiates pairing, which needs a registered agent to auto-confirm. bluetuith
only has an agent while actively pairing in it, so an autonomous re-pair hit
"No agent available for request type 2" and the link dropped right after
connecting. Run bt-agent -c NoInputNoOutput as a persistent default agent so
pairing/re-pairing always completes.
Also set TemporaryTimeout=30 so the LAN party's hundreds of stray BLE devices
are evicted from the cache instead of piling up and saturating the adapter.
A pad paired to another device in the meantime still shows Bonded here, so the
old script skipped it and it never reconnected (kept shutting down / rejoining
the other host). Target pads by what actually shows up in the scan (present and
advertising in pairing mode) rather than the bonded-device list, and clear any
stale bond before re-pairing. Pads already connected and working are left
alone.
Replace the cage kiosk with a gamescope session on DRM (greetd autologin).
gamescope presents straight to the display, so there is no nested Wayland
swapchain for RADV to storm on this Vega iGPU - which crashed games like Baba
Is You when gamescope was nested under cage. Set STROM_NO_GAMESCOPE=1 so the
launcher runs <slug>.no-gamescope and each game renders directly in the session
compositor instead of nesting its own gamescope.
Runs the patched launcher from the /home/strom/strom checkout until the
STROM_NO_GAMESCOPE support lands upstream (github launcher lacks it).
Add strom-pair (in-session NoInputNoOutput agent + polling, bond check) to
pair Xbox Wireless Controllers one at a time, plus the bluez/kernel bits they
need: hardware.xpadneo, disable_ertm=1 (else AuthenticationFailed), and
FastConnectable=true so bonded pads reconnect. Point the launcher session at
evdev via SDL_JOYSTICK_HIDAPI_XBOX=0, poll hotplug with
SDL_JOYSTICK_DISABLE_UDEV=1, and allow input without focus via
SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS=1.
Keep the default wpa_supplicant backend (iwd pegged 100% CPU in dense
~100-AP RF and wedged the link), disable NIC power-save + PCIe ASPM to
cut mt7925 scan-deauth frequency, and drop the gateway-ping watchdog
(bornhack drops ICMP to the gateway, so it false-fired and bounced a
working connection every 90s).
Mark wlan links unmanaged by systemd-networkd so NetworkManager is
the sole wifi DHCP client. With networking.useNetworkd enabled, the
auto-generated 40-<iface>.network ran a second DHCP client on the
wifi; the two fought over the lease and routes and dropped the link
every few minutes. Match by Type=wlan so it holds across interface
renames.