3.2 KiB
name, description
| name | description |
|---|---|
| noctalia-config-remote-edit | Edit live Noctalia v5 shell config on a fleet host over SSH: which config layer is live, why noctalia msg fails from ssh context, and the systemd-run --pipe workaround that works. |
Noctalia config edit over SSH (v5 native, both fleet hosts)
Current architecture (since 2026-09-10 unification)
Both dankware and blankpad run the bare noctalia v5 binary as the desktop shell (launch: niri spawn-at-startup "noctalia"). The old Quickshell-hosted v4 architecture (qs -c noctalia-shell, JSON config) is retired on both hosts. Live config layer = TOML only:
- Hand-edit declarative layer:
~/.config/noctalia/<name>.toml(e.g.config.toml). - Runtime state file
~/.local/state/noctalia/settings.tomlloads LAST and overrides declarative values for the same keys — never hand-edit it; UI/IPC writes land there.
Why msg fails remotely, and the workaround that works
noctalia msg <command> resolves the running instance via the D-Bus session bus. sshd-spawned non-login shells lack DBUS_SESSION_BUS_ADDRESS, so plain ssh exec prints error: noctalia is not running even when the shell IS running. Do not conclude "shell dead" from this error.
Working remote procedure (runs in systemd user-manager context where the bus address exists):
systemd-run --user --pipe --wait noctalia msg <command> [args]
Verified: msg status returns live JSON state; unknown panel ids return an error listing all valid panel ids (clipboard, control-center, launcher, polkit, session, setup-wizard, test, tray-drawer, wallpaper).
Verified v5 msg verb grammar (keybinds-safe)
panel-toggle <id>, session lock|suspend|lock-and-suspend|logout|reboot|shutdown, volume-up [step], volume-down, volume-mute, mic-mute, media next|previous|playPause (graceful no-op with rc 0 when no active player), brightness-up [target] [step], brightness-down, settings-open [context], settings-toggle [context], config-reload, wallpaper-get [connector], wallpaper-set <path>, wallpaper-next.
Wallpaper directory semantics
Empty/unset [wallpaper] directory resolves to XDG Pictures ($HOME/Pictures) via user-dirs.dirs; an explicit directory key overrides. Fleet default pattern: point directory at the repo-tracked wallpapers dir so git-tracked wallpapers serve the shell without copying files. After writing config.toml over ssh, the file watcher hot-reloads automatically; config-reload via systemd-run --pipe forces it immediately. Note: the current wallpaper stays the built-in default asset until the next rotation or an explicit wallpaper-next; wallpaper-get then reports a path inside the configured directory = confirmation the config took effect.
Lock chain (unified)
swayidle-lock.service ExecStart on both hosts: /usr/bin/swayidle -w timeout 300 '/usr/bin/noctalia msg session lock' before-sleep '...' after-resume '...'. msg resolves via session bus, so no WAYLAND_DISPLAY pinning is needed in unit context (niri's own /proc/PID/environ lacks WAYLAND_DISPLAY but spawn-at-startup children still receive a working display connection empirically — verified by qs-hosted autostart working from boot pre-unification).