2026-06-29 Home Manager News Feature Triage

What I set out to do

Paging through home-manager news after the latest flake-input bump surfaced several new modules. Goal: figure out which, if any, are worth adopting in the dotfiles config — programs.codex.{contextOverride,plugins,marketplaces}, programs.devenv, programs.zsh.fastSyntaxHighlighting, launchd.agents.<name>.domain, and declarative programs.uv (python versions + tools).

What I actually did

Audited each feature against the current config rather than adopting blind.

  • fastSyntaxHighlighting — adopted. Swapped syntaxHighlighting.enable for fastSyntaxHighlighting.enable in shell.nix. Verified the generated .zshrc now sources fast-syntax-highlighting 1.56 and no longer references the stock highlighter. HM asserts the two are mutually exclusive, so it’s a clean one-line drop-in.
  • programs.uv python/tools — rejected. The new tool.packages passes each entry verbatim with escapeShellArg, so it supports pins/extras but NOT the --with injected deps or per-tool --python that the existing uvxTools activation relies on (comfy-cli, ipython, jupyterlab). Both uvPython/uvTool also run network upgrades on every activation, defeating the deliberate hash-gate. Kept the custom system.
  • launchd.agents.domain = "user" — attempted, then reverted. Tried opting litellm + the obsidian-remote-mcp agents into the per-user domain for SSH manageability. It broke them: the agents booted out of gui but failed to bootstrap into user.
  • devenv / codex options — skipped as not relevant (no devenv usage; codex already drives context+skills).

What was striking

The launchd domain feature is effectively broken on macOS 26 (Darwin 25.6.0). Isolated it with the same plist: launchctl bootstrap gui/501 <plist> → exit 0 and runs, but launchctl bootstrap user/501 <plist>Bootstrap failed: 5: Input/output error. The user domain itself was healthy (78 services), the agent wasn’t stale-loaded or disabled. macOS 26 just refuses to bootstrap ~/Library/LaunchAgents plists into the per-user domain. The news wording (“user domain by default”) doesn’t even match the module, which defaults to gui. Second landmine: the custom restart workaround scripts in litellm and the obsidian MCP module hardcode gui/$UID, so they’d fight any domain change every switch anyway.

Reverted all four domain edits; the reverts restored the originals byte-for-byte. All agents back up in gui (litellm responding on :4000, bridge + caffeinate running; tunnel correctly absent since runTunnel = false).