maestro's daemon serves the browser UI on daemon.bind_addr; the option is now
a mkRemovedOptionModule, so every flake bump failed to build. config.toml moves
the daemon to 0.0.0.0:7070 and Traefik's maestro router now points there.
Sessions survive a maestro daemon restart, so there is no reason to stop at
bumping the lock.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Same shape as rev: a push to main bumps the input, commits the lock and
switches. The units it ships (pr-daemon, hourlog, week-review) restart without
disturbing anything interactive.
systemd's Environment= strips the quotes out of inline JSON, so the listener
died on startup parsing it. A store file has no such problem.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
rev came from a working checkout: the unit ran `node server/index.ts` in
~/tea/rev, so any edit there was live, and rev-deploy rebuilt a prod directory
that no longer exists. It is a flake input now, same as maestro, and
`services.rev` owns the unit.
Adds nix-autodeploy: one endpoint both repos post to. It verifies the webhook
HMAC, bumps that flake input, commits and pushes flake.lock, then switches. The
switch runs in a transient unit, since it restarts the listener itself. maestro
is bump-and-notify only — switching would restart the daemon that owns every
interactive shell here.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The aoe config was the last tracked file, and it drifts the same way
settings.json did. With no consumers left, the module, its repo-path option
and the tracked aoe-config.toml go too.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude Code rewrites ~/.claude/settings.json itself, so the nix copy drifted
within every session and `nh home switch` aborted on the diff. Drops the
mutableFiles entries and the two tracked JSON sources.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both mutable-managed files had drifted from what the running apps
actually wrote; bringing the live content upstream unblocked the
home-manager switch that picks up the new maestro build.
GDM_BACKEND was a typo for GBM_BACKEND; nothing read it, since SDDM is
the display manager here.
Firefox/Zen decode in a separate RDD process whose sandbox denies
/dev/nvidia*, so nvidia-vaapi-driver never initialised there and all
playback fell back to software. Confirmed on the running session: the
GPU process held 26 nvidia fds, both RDD processes held zero.
Co-Authored-By: Claude <noreply@anthropic.com>
compinit security-checked and rebuilt the dump on every shell start, the
largest fixed cost before fzf-tab, atuin, zoxide, direnv and starship
load. Verified both branches yield the same 1980 completions.
Co-Authored-By: Claude <noreply@anthropic.com>
Off by default: it is only useful on an NVIDIA host, and no binary cache
serves it (cuda-maintainers was measured to change nothing), so enabling
it rebuilds Blender, OpenUSD, OpenSubdiv and OpenImageDenoise.
Co-Authored-By: Claude <noreply@anthropic.com>
mpv shipped as a bare package with no config, so every host decoded video
in software. hwdec is the only vendor-specific part, so it is an option:
auto-safe everywhere, overridden on NVIDIA hosts.
Co-Authored-By: Claude <noreply@anthropic.com>
Picks up sandboxed PR review sessions. The two dokploy entries were
already gone from the live settings file, so the mutable-file check
aborted every switch until nix matched it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds the maestro flake as an input and imports its Home Manager module.
yolo enables both user services; web binds 0.0.0.0:8081 because aoe-web
already holds 8080 on this host.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Shells set TMUX_TMPDIR to the runtime dir; the unit did not, so the
daemon ran a second tmux server under /tmp. Every boot resumed duplicate
agents there, the dashboard diverged from the TUI, and polling the
invisible sessions fired an error push per session. Same fix pr-daemon
got.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fork carries two patches on v1.14.1+: worktree_info on plain add
(grouping) and reaping agent processes that survive tmux teardown.
Also brings upstream the settings drift the mutable-file guard caught:
fable model, secret-guard hook chain, verbose, confirm_delete.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Global config keeps bash at "ask", which stalls every unattended opencode
session on git and grep. yolo runs the PR daemon's reviewers, so the prompt
is a deadlock there rather than a gate.
Merges like claude-settings.json: home/yolo/opencode.json holds only the
override, so agents, commands and skills still come from common. Reviewers
run on branches under review, so this drops that prompt too.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
pr-daemon, hourlog and week-review are defined by the agent-skills
home-manager module now, next to the scripts they run; this host just
enables them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Agent tmux sessions the daemon starts live in its cgroup; a restart was
killing every session it had created.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The XF86 binds survived the noctalia -> eww switch, but the popup they
drew did not, so volume and brightness changed with no feedback. swayosd
replaces it: swayosd-client both applies the change and draws the OSD.
Also fixes two binds that pointed at binaries no host installs any more:
XF86AudioMicMute called volumectl (avizo, removed) and the brightness
keys called brightnessctl, which only arrakis has.
Commands are referenced by store path because Hyprland execs binds with
the PATH the session was started with.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Watches GitHub and Gitea PRs and routes them to aoe sessions. Lives here
rather than in agent-skills' nix module for the same reason the timers
do: it belongs to one box.
Config and tokens are outside the store, so the unit refuses to start
without them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
opencode has no @file imports, so the shared home-manager module
concatenates the claude-md fragments into .config/opencode/AGENTS.md
(the screenshots line moved there as a fragment) and links commands/
into place. Keeps only the opencode-specific agents, commands and
skills here.
Two dokploy MCP tools declare ttl with the draft-04 "exclusiveMinimum":
true. Synthetic validates tool schemas against draft-2020 and rejects the
whole request, so every session died on a bodiless 500. Deny those two.
Haiku moves to GLM Flash: Qwen3.6-27B rejects Claude Code multi-block
system prompt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Binds the opus/sonnet/haiku aliases to Kimi K3, GLM-5.2 and Qwen3.6 so
they can be swapped mid-session, and registers the wrapper as an aoe agent.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Packages the prebuilt pi release binary and puts it on PATH alongside
Claude Code, Codex and opencode.
pi has no `@file` imports in context files, so the shared agent-skills
fragments are concatenated into ~/.pi/agent/AGENTS.md. Skills need no
wiring: pi already reads ~/.agents/skills.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gpg-agent is the ssh agent here, and signing blocks forever on a pinentry
prompt with no TTY, so git push hung right after "Server accepts key".
The key file has no passphrase, so read it directly instead.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
yolo's desktop is only ever seen through a Moonlight window, so its cursor
needs to be tellable apart from the client's at a glance. Bibata-Modern-Amber
differs in both colour and silhouette from Nordzy.
Threads the theme through an option rather than setting it in one place: it
was hardcoded in cursor.nix, in hl.env, in the setcursor autostart, and twice
more in darkman's mode scripts, which re-set it on every light/dark switch and
would have reverted the override.
Also drops a stale hl.env pointing HYPRCURSOR_THEME at rose-pine-hyprcursor,
which no host installs.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
virtio-gpu exposes no NVENC/VAAPI, so sunshine software-encodes. Measured
x264 (superfast+zerolatency) on the 8 vCPUs: 73fps at 2160p against 135fps
at 1440p, so a 60fps client keeps roughly 20% margin.
Also brings the drifted agent-of-empires config upstream, which the
mutableFiles guard required before switching.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Text paste went through `kitty @ send-text`, which has no bracketed
paste, so multi-line clipboard text ran line by line in a shell. Route
text through `kitty @ action paste_from_clipboard` instead and keep
send-text for the image path only.
Over SSH the typed path pointed at the local /tmp and the remote process
could not read it. Read the focused window's foreground processes from
`kitty @ ls`, and when one of them is an ssh client, scp the image to
that host and type the remote path. Nothing is typed into the focused
app but a path, so this still works when the target is a TUI rather than
a shell. The real ssh process is preferred over the `kitten ssh`
wrapper, whose long options the argument parser does not understand.
Also: mktemp instead of a timestamp that collides within a second,
a prune of clip files older than a day, image/png preferred over
whatever format the source advertises first, and the clipboard tools
pinned so the script does not depend on kitty's inherited PATH.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>