yolo's .claude/settings.json was a full fork of the common file, not the
narrow override its comment claimed: sandbox, defaultMode, voiceEnabled,
$schema and feedbackSurveyState were absent, and five more keys had
diverged. It now holds only yolo's overrides and merges over common via
recursiveUpdate. sandbox.enabled stays pinned false — inheriting it would
newly sandbox every Bash call on a box built for unattended agents.
mutableFiles maps a source back to a repo path for the "bring changes
upstream" hint, which only works inside the flake tree. Generated sources
would print a /nix/store path to copy onto, so add upstreamPath.
rev and rev-deploy set Restart=always with RestartSec=2, which burns
systemd's default 5-starts-per-10s budget and parks the unit in `failed`
until a manual reset-failed. StartLimitIntervalSec=0 lifts the cap.
programs.nh.flake and home.mutableFilesRepoPath become mkDefault so yolo
overrides them plainly instead of with mkForce in three places.
Also clears the outstanding nixfmt and statix findings. The yolo system
derivation hash is unchanged.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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>
Unauthenticated flake input fetches from github.com were hitting 429.
Token lives in /etc/nix/github-token.conf (root:root 600, out-of-band —
never in git or /nix/store) and nix.conf !includes it.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
pve hardcodes egl-headless with no rendernode, and the nvidia egl vendor
outranks mesa, so virgl lands on llvmpipe.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
vga: virtio-gl, serial0 and ovmf are load-bearing and live only on the
hypervisor, so a rebuilt vm would regress silently.
Co-Authored-By: Claude Opus 5 <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>
It leaks a /dev/dri/renderD fd per encoder probe, hits the 1024 default,
and mesa can then no longer dlopen the GBM driver — capture degrades to a
black picture with no error surfaced.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
wlgrab is the name the backend logs under, not a valid config value.
Sunshine rejects it, then starts anyway with no encoder — moonlight sees
a 503.
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>
Needed before switching to vga: virtio-gl, which leaves no QEMU console
surface for noVNC or screendump.
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>
The yogurt flake input was pinned via git+ssh://, which the Gitea CI
runner can't fetch (no GitHub SSH key), failing the eval job. Switch to
git+https:// — repo is anonymously cloneable, same rev/narHash.
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>