Three separate faults, each producing a black Moonlight stream:
- sunshine's wlr backend takes wlr-screencopy's dmabuf path, which on this
virtio-gpu returns empty buffers. Reproduced locally over 127.0.0.1, so it
is not the network or the client. Switch to kms capture.
- hypridle locked the session and cut dpms, blanking the captured output with
no console to unlock from. Disable it on this host.
- qemu picked the nvidia render node by readdir order, so virgl fell back to
llvmpipe. Pin renderD128 via the VM's args.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
156-line .tmux.conf plus tpm plugins existed only on the ubuntu box.
Plugins are declared instead of git-cloned at runtime by tpm.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
All pre-existing, all mechanical:
- pointerCursor no longer implies generation from the block alone; set enable.
- top-level elixir_1_18 alias is deprecated for the beamPackages set. Same
derivation, 1.18.4 either way.
- pkgs.system -> pkgs.stdenv.hostPlatform.system.
- fzf and atuin both bind Ctrl-R. Atuin is sourced last so it already owned the
key; historyWidget.zsh.command = "" states that explicitly and satisfies
home-manager's conflict check. Behaviour is unchanged and fzf keeps Ctrl-T
and Alt-C.
Keyboard control of the mouse pointer. SUPER+G labels detected targets and
clicks one; SUPER+SHIFT+G falls back to tile -> bisect for anything detection
misses.
Stock wl-kbptr 0.4.1 is unusable on this setup, for two unrelated reasons:
- Target detection is hardcoded for ~1080p. filter_rects() discards any
candidate with height >= 50 or width >= 500, so on a 4K screen at scale = 1
nearly every real control is dropped for being "too big" and only emoji and
avatars survive — a full Slack window produced ~8 labels, all on images.
- On the rotated monitor the pointer landed in the wrong place. move_pointer()
takes output->width/height from xdg_output.logical_size, which is already
rotated, then applies the transform again. Asking for global (4000,1000) on
DP-2 landed at (4286,3726); the double rotation predicts (4301,3736).
Neither is exposed as a config option, hence the overrideAttrs. Sizes in the
config file are likewise doubled: wl-kbptr paints raw cairo onto a layer
surface and never sees a scale factor, so upstream's defaults render half-size.
Both binds are pidof-guarded: wl-kbptr only exits on a keypress, so an overlay
that loses focus first sits there holding an exclusive keyboard grab.
Ports what was apt-installed on the ubuntu box. rtk matters most: the
claude hooks rewrite commands through it, and it silently no-ops without.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
settings.json carries skipDangerousModePermissionPrompt and the rev hook
wiring, so yolo gets its own; other hosts keep the shared one. Machine
profile picks which agent-skills machines/<name>.md is imported.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Drops the stale skills/commands/CLAUDE.md from home/common/programs/claude
in favour of the agent-skills flake, which is the maintained copy. The
module keeps what agent-skills does not own: packages, statusline and
settings.json.
aoe's config.toml moves to home/yolo — it sets yolo_mode_default, which
starts sessions with permission checks skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
zram wedged shutdown faulting stored pages back in, and the VM already
has a real swap partition. aoe-with-web is the same binary plus `serve`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
cliPackage only points the desktop app at codex; it never put the cli on
PATH, so `codex` was missing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
systemd does not create the parent of StandardOutput=append:, failing
every instance with 209/STDOUT on a fresh machine.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
nodejs.nix shipped only the language server, so a fresh machine has no
node runtime — rev's clone cannot install its dependencies.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Repos moved from ~/tea/<org>/<repo> to ~/tea/<repo>, so the rev and
agent-skills unit paths no longer resolved. Also captures aoe schema keys
added on first run.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Also overrides the home-manager nh.flake, which sets NH_FLAKE and was
still pointing at the ~/projects default, so bare `nh home switch` never
resolved on this host.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Vendors config.toml and moves the package into common/programs/aoe, so
any host that wants aoe imports one thing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
home-manager starts every unit it manages, and starting a template with
no instance errors out, failing activation.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
New NixOS VM on proxmox, replacing the Ubuntu box. Reuses the existing
Hyprland config; remote access is Sunshine/Moonlight rather than xrdp,
since xrdp cannot drive a wayland compositor.
Two fixes here are not yolo-specific and affect any fresh install:
git at system level (nix needs it for the type = "git" hyprland input,
but git only came from home-manager, so neither rebuild could run), and
dropping the yogurt input, whose private repo made home-manager
un-evaluatable without GitHub auth.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Add two Electron AI desktop apps built from their official upstream
binaries and wire them into the home config (x86_64 only):
- claude-desktop: Anthropic's official Linux .deb, unpacked via dpkg +
autoPatchelfHook. Wrapper disables the SUID sandbox (nix store can't
set it up) and adds the NixOS GL driver path so it hardware-accelerates
instead of falling back to software rendering.
- t3-code: pingdotgg/t3code AppImage via appimageTools.wrapType2, with
desktop entry + hicolor icons.
Both share a new custom.aiApps.deviceScaleFactor option feeding
--force-device-scale-factor; konishi's 4K@1x monitors set it to "1.5",
arrakis stays native.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the hosts/common/features/gaming/ layout on the home side: turn the
single gaming.nix into a gaming/ directory. Moonlight (the client
counterpart to the Sunshine host) becomes moonlight.nix, gated by its own
custom.gaming.moonlight option so a host can install just the streaming
client without the full launcher/Proton toolkit (custom.gaming.enable).
- gaming.nix -> gaming/default.nix (imports moonlight.nix)
- gaming/moonlight.nix: custom.gaming.moonlight -> moonlight-qt
- arrakis: import gaming module, set custom.gaming.moonlight = true
(replaces the one-off home.packages line)
- konishi: update import path to the directory
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
twilight re-publishes under the same 1.22t tag, so the pinned hash goes
stale and `nh home switch` fails with a fixed-output hash mismatch. Move
to the stable `default` package (branded zen-beta, 1.21.5b), which uses
proper versioned releases.
- zen-browser.nix: twilight-official -> default
- xdg.nix: zen-twilight.desktop -> zen-beta.desktop mimeapp defaults
- flake.lock: bump zen-browser input
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
SDDM auto-logs naps62 in and Hyprland locks immediately via hyprlock
(exec-once), so a cold boot lands on the themeable lock screen instead of
the SDDM greeter. Safe here (no FDE makes SDDM-vs-autologin marginal) and it
lets Moonlight reach the box after a cold boot, not just from suspend, since
Sunshine only runs once a session exists. konishi-only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
noctalia's built-in lock screen is hard to theme and opaque to logind
(LockedHint never flips). Swap to hyprlock: clean dark theme, drive it from
hypridle (idle + before-sleep via loginctl lock-session) so logind tracks
lock state, and add a $mod CTRL+L manual lock bind. Applies to both hosts
that share this module (konishi + arrakis).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Big Picture shares the plain `steam` WM_CLASS, so it opened on whatever
monitor the cursor was on rather than the streamed one; match its title
instead and pin to ws3 (DP-1's persistent workspace, what the stream
captures). Move the steam_app_ game rule from ws6 to ws3 too so games and
Big Picture share one streamed workspace and launching a game doesn't flip
DP-1 to a different workspace.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Steam/Proton titles run under XWayland with WM_CLASS steam_app_<appid>.
Without a rule they open tiled on whatever monitor Steam is on (the
primary, bottom-left HDMI-A-1). Match steam_app_.* and send them
fullscreen to workspace 6 (DP-1, top-left). Native games use their own
class and can be added individually.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bring the live ~/.claude/settings.json changes upstream so the
mutable-file guard stops aborting home activation.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add LocalForward entries for 47100/47101 to the yolo host, and set
LogLevel=ERROR to silence the INFO-level "channel open failed: connection
refused" noise when a forwarded port has nothing listening yet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Enable the home-manager programs.nh module (installs nh, sets NH_FLAKE so
`nh home switch` finds this repo). Re-pin zen-browser to the 2026-06-28
revision to clear a stale twilight fixed-output-derivation hash mismatch.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>