Clone this repository
For self-hosted knots, clone URLs may differ based on your setup.
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.