Start Zen headless for 3s at login to prime the page cache and shared
libraries on the slow MacBook Air hardware.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ghostty exits cleanly when the last window closes, so on-failure
never triggers a restart. Switch to Restart=always with a 1s delay
so the headless instance respawns and stays warm.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Start Ghostty headless and pre-warm Nemo at login so both launch
faster on the aging Haswell MacBook Air.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
snixembed conflicts with waybar's tray, causing all SNI items
(Vesktop, nm-applet) to disappear. Battle.net's tray icon doesn't
use X11 embed protocol anyway, so snixembed doesn't help.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Stylix on the media server tries to manage files (GTK config,
fontconfig, etc.) that already exist, causing HM activation to fail.
Setting backupFileExtension lets HM move conflicts to .hm-bak.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a stylix-stable input pinned to release-25.11 so the media server
gets Stylix theming without pulling in unstable nixpkgs. btop is now
managed by Home Manager on all hosts with Stylix auto-theming.
Desktop-only config (Zen/Vesktop CSS, GTK icons) is guarded behind
an isDesktop check in stylix.nix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- WLR_DRM_DEVICES: wlroots env var ignored by Aquamarine, AQ_DRM_DEVICES already set
- pamixer: not referenced anywhere, volume handled by swayosd-client
- #network.disconnected CSS: no network module in waybar config
- #custom-tray-toggle CSS: renamed to #custom-tray-handle to match actual module
- removeOldHyprlandConf activation: one-time migration already completed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hyprland 0.55.0 now links GCC 15.2.0 natively, so the symlinkJoin
wrapper that injected LD_PRELOAD for the GLIBCXX_3.4.34 symbol is
obsolete.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
systemctl stop/start in quick succession hits the start-rate limiter,
leaving the daemon in a failed state. Reset the failure counter before
restarting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix config for upstream anyrun HM module (no margin option, use
package refs for plugins). The upstream module provides a systemd
user service for the daemon with Restart=on-failure, so remove
manual daemon management from Hyprland startup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace nixpkgs anyrun with the upstream anyrun-org/anyrun flake,
which provides its own HM module and plugin packages. The nixpkgs
build had a broken daemon (GTK activate crash). Re-enable daemon
startup and close/open toggle.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
anyrun 25.12.0's daemon mode crashes with a GLib-GIO activate error.
Revert to the reliable standalone killall toggle until upstream fixes
the daemon.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
terminal field still expects Option<T> wrapper (Some("ghostty")).
Restore close-or-open toggle for Super+R — with the daemon running,
`anyrun close` correctly fails when no window is open.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The power menu runs anyrun in standalone stdin mode, which kills the
daemon. Explicitly quit the daemon before, then restart it after the
standalone invocation so the launcher stays fast.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Just call `anyrun` directly — the daemon handles window display.
The previous `anyrun close || anyrun` toggle failed because close
returns success even with no window open.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Start `anyrun daemon` at Hyprland launch for instant open times.
Replace `killall anyrun` with `anyrun close` to dismiss without
killing the daemon. Fix applications.ron config — newer anyrun
expects plain values, not Option<T> wrappers (Some(8) → 8).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- protonvpn-gui → proton-vpn
- xfce.thunar → thunar
- set gtk.gtk4.theme = null to adopt new HM 26.05 default
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch Stylix from release-25.11 to master, which fixes hyprpaper's
wallpaper config generation for 0.8.4 (structured attributes instead
of raw string concatenation).
Move the Stylix module import from common.nix to flake.nix extraModules
so the Mediaserver (on nixpkgs-stable) doesn't pull in options that
only exist in unstable nixpkgs (services.displayManager.generic).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The mkForce wallpaper override (explicit monitor names) and the IPC
startup script (sleep 2 + hyprctl) were stacked workarounds for a
misdiagnosed hyprpaper 0.8.4 bug. Stylix's hyprpaper target (still
auto-enabled) correctly sets preload and wallpaper with the standard
wildcard syntax.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The previous inline shell command had quoting/PATH issues. Replace with
a proper pkgs.writeShellScript that:
- Uses the full hyprctl store path (no PATH dependency)
- Reads the wallpaper from hyprpaper.conf at runtime ($HOME/.config)
- Avoids the Nix string-context conflict from embedding a store path
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hyprpaper 0.8.4 silently ignores wallpaper= directives in the config
on startup — preload= works but the monitor assignment does not.
Add a hyprland.start hook that waits 2s (for hyprpaper to preload the
image) then sets the wallpaper via hyprctl IPC. The image path is read
at runtime from hyprpaper.conf to avoid a Nix string-context conflict
between the stylix image store path and the powerMenu derivation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
VSCodium (with its nix-ld/LD_LIBRARY_PATH wrapper for native extension
addons) has been removed from home-manager. nix-ld is no longer needed
on Gaming or Macbook without it.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hyprpaper 0.8.4 doesn't honour the Stylix-generated "wallpaper=,<path>"
empty-monitor wildcard — DP-2 was found but had no target. Override with
explicit monitor names (DP-2 on Gaming, eDP-1 on Macbook) using
config.stylix.image to avoid a circular reference through the preload list.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Explicitly start hyprland-session.target in our hl.on("hyprland.start")
handler so waybar (and other session services) launch even if HM's
dbus-update-activation-environment chain fails silently upstream
- Power menu: replace plain spaces with bash $'\uXXXX' nerd font glyphs
(fa-lock, fa-sign-out, fa-refresh, fa-power-off)
- Waybar tray-handle: use builtins.fromJSON to embed U+E0B2 powerline
filled left-arrow as the drawer indicator
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
hl.dsp.workspace.change() does not exist; workspace switching uses
hl.dsp.focus({ workspace = N }).
hl.dsp.window.move_to_workspace() does not exist; moving a window to a
workspace silently uses hl.dsp.window.move({ workspace = N, follow = false })
(follow = false sets the silent flag in the C++ dispatcher).
hl.dsp.window.fullscreen() takes a 'mode' field, not 'state'; drop the
stale argument so the call uses the correct toggle-fullscreen default.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pkgs.writeText derivations (used by HM for config files) carry
preferLocalBuild = true, which the remote build hook declines, and
allowSubstitutes = false, which prevents cache hits. With max-jobs = 0
these can never be realised, causing nixos-rebuild to fail.
Setting max-jobs = 1 lets these millisecond-duration text-file writes
run locally with no gaming impact. All real compilation still goes to
the media server via the distributed build configuration.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Stylix's Hyprland target injects settings.{general,decoration,group,misc}
as top-level keys. In hyprlang mode these render as section blocks, but
in Lua mode (configType = "lua") they become hl.general(), hl.decoration(),
etc. — functions that don't exist, causing an emergency-mode config error.
Disable stylix.targets.hyprland and absorb all its colours into
settings.config.{general,decoration,group,misc} where they are correctly
rendered inside the single hl.config({}) call.
Also add a home.activation script that removes any stale hyprland.conf
(auto-generated by Hyprland before hyprland.lua was first placed) so the
autogenerated-config warning banner can never persist across restarts.
Keep services.hyprpaper.enable = true since it was previously set by the
now-disabled Hyprland target.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lutris and Wine pull in 32-bit (i686-linux) dependencies like openldap.
Without i686-linux in the supported systems list, nix falls back to
building those locally on the gaming PC instead of offloading to the server.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
max-jobs = 0 sends every build to nordhammer.it instead of compiling
locally, so nixos updates never compete with games for resources.
builders-use-substitutes lets the server pull from binary caches directly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
home-manager unstable requires lib/services/lib.nix which was added to
nixpkgs after 25.11. Move the two Hyprland hosts to unstable so the HM
module evaluates against a compatible nixpkgs. Mediaserver stays on stable.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Switch Gaming and Macbook to home-manager unstable which has
configType = "lua" support. Converts the full Hyprland config from
deprecated hyprlang to native Lua:
- flake: add home-manager unstable input for Gaming/Macbook
- hyprland.nix: configType = "lua", settings.config for static sections,
extraConfig for env/startup/animations/binds/window-rules
- hosts: monitor config updated to hl.monitor({}) table format
Eliminates the windowrulev2 deprecation banner.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
extraConfig is parsed as hyprlang by the HM module, not Lua — Lua syntax
caused parse errors. windowrulev2 in settings is the correct approach.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace deprecated windowrulev2 hyprlang syntax with the Hyprland 0.55+
Lua hl.window_rule() API via extraConfig.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Battle.net agent leaks a tiny floating XWayland window (steam_app_0,
empty title, 160x20) that isn't captured by the Wayland tray. Send it
to the special workspace silently.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces Vesktop for quick cross-device note-passing. Uses Flatnotes
with auth disabled so Authelia is the only login required.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
wob (Wayland OSD Bar) runs as a systemd user service listening on a FIFO.
Keyboard brightness keybindings now pipe the new brightness percentage to
the FIFO after each adjustment, showing a progress bar overlay.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
swayosd-client does not support --keyboard-brightness; use brightnessctl
directly to control smc::kbd_backlight.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add XF86KbdBrightnessUp/Down keybindings (Macbook-only) using swayosd
for consistent OSD behaviour with screen brightness and volume
- Enable hardware.acpilight for udev rules allowing video group to write
to /sys/class/leds/ (keyboard backlight)
- Add fred to the video group so brightnessctl/swayosd can write backlight values
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Newer *arr versions added AuthenticationRequired to config.xml and now
block access if it's not explicitly set. Patch it to
DisabledForLocalAddresses alongside the existing AuthenticationMethod
patch, since Authelia handles auth at the reverse proxy.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>