Switch to Noctalia v5 and fix niri startup

Fix Mod+T bind (one action per bind), launch noctalia v5 from autostart,
port keybinds to `noctalia msg`, add config.toml, changelog and docs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
bgrollemanandClaude Sonnet 5.5 committed 2026-10-10 11:08:24 +02:00
1 parent 626bf30386
commit cb80e100f4
6 files changed
+122 -17

No files matched your search

+12
View File
@@ -0,0 +1,12 @@
# Changelog
## 2026-10-10
- Fix niri login: Mod+T bind had three actions, niri rejected the config and fell back to defaults (no bar, no kanshi).
- Autostart now launches `noctalia` (v5, native) instead of `qs -c noctalia-shell` (v4, Quickshell/QML).
- Reason for the switch: Qt 6.12 broke noctalia-shell 4.x colours (`resolveColorKey is not a function`) and noctalia-qs was built on 6.11.
- Port all niri keybinds from `qs ... ipc call` to `noctalia msg` (launcher, lock, session, volume, media, brightness).
- Add `noctalia/config.toml`: theme, wallpaper, weather, idle, dock and bar layout ported from the old `settings.json`.
- Bar on the 5120px ultrawide (DP-1) is limited to ~70% width via a per-monitor `margin_ends` override.
- Restore previous wallpaper (`stellar-blade-2024-ultrawide.jpg`) on all outputs.
- Document the noctalia v4 to v5 migration (files, keybinds, bar, rollback) in `docs/noctalia-v5.md` and CLAUDE.md.
+2 -1
View File
@@ -40,7 +40,8 @@ This installs ansible if missing, then runs the playbook. Tasks are split by cat
Edit the relevant split file, not `config.kdl` itself. Edit the relevant split file, not `config.kdl` itself.
### Noctalia (desktop shell / bar) ### Noctalia (desktop shell / bar)
All settings live in `noctalia/settings.json` (JSON, edited by the Noctalia GUI or directly). Colorschemes are in `noctalia/colorschemes/` and plugins in `noctalia/plugins/`. Runs **Noctalia v5** (`noctalia`, native). Config is `noctalia/config.toml` (TOML, hot-reloaded); validate with `noctalia config validate`.
`noctalia/settings.json` is the legacy v4 config. See `docs/noctalia-v5.md` for details and `CHANGELOG.md` for history.
### Neovim ### Neovim
Uses **LazyVIM** framework. Entry point is `nvim/init.lua` which bootstraps lazy.nvim via `nvim/lua/config/lazy.lua`. Uses **LazyVIM** framework. Entry point is `nvim/init.lua` which bootstraps lazy.nvim via `nvim/lua/config/lazy.lua`.
+36
View File
@@ -0,0 +1,36 @@
# Noctalia v5
Noctalia v5 (`noctalia` package) is a native Wayland shell with no Qt dependency. It replaces v4
(`noctalia-shell` + `noctalia-qs`, Quickshell/QML), which broke on Qt 6.12.
## Files
- `noctalia/config.toml` - hand-edited config, hot-reloaded. Linked to `~/.config/noctalia/config.toml`.
- `~/.local/state/noctalia/settings.toml` - GUI-managed overrides and runtime state (not in this repo).
- `noctalia/settings.json` - old v4 config, kept for reference or fallback.
Validate after editing: `noctalia config validate`. Open the settings GUI: `noctalia msg settings-open`.
## Startup and keybinds
- Started from `niri/cfg/autostart.kdl` with `spawn-at-startup "noctalia"`.
- Keybinds in `niri/cfg/keybinds.kdl` call `noctalia msg <command>`; list them with `noctalia msg --help`.
- Panel ids for `panel-toggle`: clipboard, control-center, launcher, polkit, session, tray-drawer, wallpaper.
- Wallpaper is set with `noctalia msg wallpaper-set [output] <path>` and persists.
## Bar
- Layout is the `start`, `center` and `end` lists in `[bar.main]`.
- `[bar.main.monitor.ultrawide]` matches DP-1 and sets `margin_ends = 768`, which gives about 70% width on 5120px.
Formula: `(monitor_width - wanted_width) / 2`.
## Not ported from v4
- System monitor widget (widget id unknown in v5), per-widget options such as hover-only labels.
- v4 plugins (`polkit-agent`): v5 has a built-in `polkit` panel instead.
- The v4 bar only ran on DP-1; v5 runs on every output.
## Rolling back
Set autostart to `qs -c noctalia-shell` again and restore the `qs ... ipc call` binds from git history.
This needs a `noctalia-shell` that works with the installed Qt version.
+1 -1
View File
@@ -1,5 +1,5 @@
// ────────────── Startup Applications ────────────── // ────────────── Startup Applications ──────────────
// https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#spawn-sh-at-startup // https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#spawn-sh-at-startup
spawn-sh-at-startup "qs -c noctalia-shell" spawn-at-startup "noctalia"
spawn-at-startup "kanshi" spawn-at-startup "kanshi"
+15 -15
View File
@@ -16,29 +16,29 @@ binds {
Mod+G hotkey-overlay-title="Focus: Gmail" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-fmgjjmmmlfnkbppncabfkddbjimcfncm-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=fmgjjmmmlfnkbppncabfkddbjimcfncm"; } Mod+G hotkey-overlay-title="Focus: Gmail" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-fmgjjmmmlfnkbppncabfkddbjimcfncm-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=fmgjjmmmlfnkbppncabfkddbjimcfncm"; }
Mod+W hotkey-overlay-title="Focus: WhatsApp" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=hnpfjngllnobngcgfapefoaidbinmjnm"; } Mod+W hotkey-overlay-title="Focus: WhatsApp" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-hnpfjngllnobngcgfapefoaidbinmjnm-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=hnpfjngllnobngcgfapefoaidbinmjnm"; }
Mod+D hotkey-overlay-title="Focus: Todoist" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-dlgohinmglaoopaiplliaecdpmnepmga-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=dlgohinmglaoopaiplliaecdpmnepmga"; } Mod+D hotkey-overlay-title="Focus: Todoist" { spawn-sh "$HOME/.config/niri/focus-or-launch.sh chrome-dlgohinmglaoopaiplliaecdpmnepmga-Default /opt/helium-browser-bin/helium-wrapper --profile-directory=Default --app-id=dlgohinmglaoopaiplliaecdpmnepmga"; }
//Mod+CTRL+Return hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "qs -c noctalia-shell ipc call launcher toggle"; } //Mod+CTRL+Return hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "noctalia msg panel-toggle launcher"; }
Alt+Space hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "qs -c noctalia-shell ipc call launcher toggle"; } Alt+Space hotkey-overlay-title="Open App Launcher: noctalia launcher" { spawn-sh "noctalia msg panel-toggle launcher"; }
Alt+Shift+Space hotkey-overlay-title="Open Window Search: noctalia launcher" { spawn-sh "qs -c noctalia-shell ipc call launcher windows"; } Alt+Shift+Space hotkey-overlay-title="Open Window Search: noctalia launcher" { spawn-sh "noctalia msg window-switcher"; }
Mod+B hotkey-overlay-title="Open Browser: helium" { spawn "helium-browser"; } Mod+B hotkey-overlay-title="Open Browser: helium" { spawn "helium-browser"; }
Mod+L hotkey-overlay-title="Lock Screen: noctalia lock" { spawn-sh "qs -c noctalia-shell ipc call lockScreen lock"; } Mod+L hotkey-overlay-title="Lock Screen: noctalia lock" { spawn-sh "noctalia msg session lock"; }
Mod+Shift+Q hotkey-overlay-title="Session Menu: noctalia sessionMenu" { spawn-sh "qs -c noctalia-shell ipc call sessionMenu toggle"; } Mod+Shift+Q hotkey-overlay-title="Session Menu: noctalia sessionMenu" { spawn-sh "noctalia msg panel-toggle session"; }
// Please choose your own file manager. // Please choose your own file manager.
Mod+E hotkey-overlay-title="File Manager: Nautilus" { spawn "nautilus"; } Mod+E hotkey-overlay-title="File Manager: Nautilus" { spawn "nautilus"; }
// ─── Media Controls ─── // ─── Media Controls ───
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume increase"; } XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; }
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume decrease"; } XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; }
XF86AudioMute allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume muteOutput"; } XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; }
XF86AudioMicMute allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume muteInput"; } XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; }
XF86AudioNext allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media next"; } XF86AudioNext allow-when-locked=true { spawn-sh "noctalia msg media next"; }
XF86AudioPrev allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media previous"; } XF86AudioPrev allow-when-locked=true { spawn-sh "noctalia msg media previous"; }
XF86AudioPlay allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media playPause"; } XF86AudioPlay allow-when-locked=true { spawn-sh "noctalia msg media toggle"; }
XF86AudioPause allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media playPause"; } XF86AudioPause allow-when-locked=true { spawn-sh "noctalia msg media toggle"; }
// ─── Brightness Controls ─── // ─── Brightness Controls ───
XF86MonBrightnessUp allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call brightness increase"; } XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg brightness-up"; }
XF86MonBrightnessDown allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call brightness decrease"; } XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg brightness-down"; }
// ─── Window Movement and Focus ─── // ─── Window Movement and Focus ───
Alt+H { focus-column-left; } Alt+H { focus-column-left; }
+56
View File
@@ -0,0 +1,56 @@
# Ported from the old settings.json (noctalia-shell 4.x). Unlisted keys use defaults.
[theme]
mode = "dark"
source = "builtin"
builtin = "Catppuccin"
[wallpaper]
enabled = true
fill_mode = "crop"
transition = ["fade", "disc", "stripes", "wipe", "honeycomb"]
transition_duration = 1500
directory = "/home/bgrolleman/Documents/Resources/Backgrounds"
[weather]
enabled = true
unit = "celsius"
[location]
address = "Amersfoort, The Netherlands"
[idle.behavior.lock]
timeout = 660
action = "lock"
enabled = true
[idle.behavior.screen-off]
timeout = 600
action = "screen_off"
enabled = true
[dock]
enabled = true
position = "left"
auto_hide = true
[bar.main]
position = "top"
background_opacity = 0.93
capsule = true
margin_ends = 4
margin_edge = 4
widget_spacing = 6
start = ["launcher", "taskbar"]
center = ["clock", "media"]
end = ["workspaces", "tray", "network", "bluetooth", "notifications", "battery", "volume", "brightness", "control-center"]
[widget.clock]
format = "{:%H:%M %a, %b %d}"
tooltip_format = "{:%H:%M %a, %b %d}"
# 70% of the 5120px ultrawide: (5120 - 3584) / 2
[bar.main.monitor.ultrawide]
match = "DP-1"
margin_ends = 768