Files
command-center/omp-docs/tools/noctalia-shell.md
Frank b441cfda56 docs(DE): full redesign sweep — desk profiles, keybinds, noctalia v5, handy fleet wiring, incident log
- niri: index/config-tree rework, displays.md desk-profile rewrite,
  tips/action-reference/default-bindings refresh (26.04),
  generated keybindings.md (119 bindings)
- noctalia-shell.md: settings.toml lives in ~/.local/state, taskbar
  widget, v5 keybind table (Mod+D/Mod+V/Alt+Tab)
- handy.md: NEW; live nested store shape, fleet endpoint, known
  thinking-model empty-content breaker + verified cure
- log.md: DE redesign entry + pam_faillock sudo-lockout incident
2026-10-09 14:42:08 -07:00

436 lines
15 KiB
Markdown

---
type: reference
title: Noctalia Shell
description: Native desktop environment for Niri — launcher, control center, settings, lock screen, session menu, hotkey overlay, media controls, and system management.
resource: https://github.com/Noctalia/noctalia
tags:
- noctalia
- niri
- wayland
- desktop-environment
- launcher
- control-center
- session-management
timestamp: 2026-10-09
verified: 2026-10-09
---
# Noctalia Shell
Noctalia is a native, minimal desktop environment for the [Niri](niri/index.md) compositor. It provides an application launcher, control center, settings GUI, lock screen, session menu, hotkey overlay, media controls, brightness/volume controls, wallpaper management, and system-level utilities.
**Version:** 5.2.1-1.1
**Binary:** `/usr/bin/noctalia` (native Qt application, no Quickshell dependency)
**Config:** `~/.config/noctalia/`
---
## Architecture
Noctalia is a native Qt binary that communicates with Niri and system services via direct IPC (`noctalia msg`) and shell scripts (`spawn-sh`). It does not depend on Quickshell.
### IPC Interface
All primary functionality is exposed via the `noctalia msg` command:
```bash
noctalia msg <command>
```
See `noctalia msg --help` for the complete command list.
**Historical Note:** v4.x used Quickshell IPC (`qs -c noctalia-shell ipc call ...`), but v5+ is a native binary with its own IPC interface.
---
## Command Reference
Commands are grouped by functional area.
### Shells / Surfaces
| Command | Description |
|---------|-------------|
| `bar-show [bar-name]` | Show a named bar or all bars |
| `bar-hide [bar-name]` | Hide a named bar or all bars |
| `bar-layer-set <layer>` | Set bar layer (e.g., `top`, `bottom`) |
| `bar-reserve-toggle [bar-name]` | Temporarily toggle reserve space |
| `bar-toggle [bar-name]` | Toggle visibility for a named bar or all bars |
| `dock-hide` | Hide the dock (persists override) |
| `dock-reload` | Reload dock configuration |
| `dock-show` | Show the dock (persists override) |
| `dock-toggle` | Toggle dock visibility (persists override) |
| `panel-close [id]` | Close the active or named panel |
| `panel-open <id> [context]` | Open a panel by id, optionally with context (e.g., `launcher /emo`, `control-center audio`) |
| `panel-toggle <id> [context]` | Toggle a panel by id, optionally with context |
| `settings-close` | Close the settings window |
| `settings-open [context]` | Open the settings window, optionally at a specific section |
| `settings-open-plugin <plugin-id>` | Open settings at a plugin's settings (e.g., `noctalia/notes`) |
| `settings-open-widget [bar-name] [widget-name]` | Open settings at a bar widget |
| `settings-toggle [context]` | Toggle the settings window, optionally at a specific section |
| `window-switcher [action]` | Open or close the window switcher overlay |
### Lockscreen / Session
| Command | Description |
|---------|-------------|
| `session lock` | Lock the screen |
| `session lock-and-suspend` | Lock and suspend the system |
| `lockscreen-widgets-edit` | Open the lockscreen widgets editor |
| `lockscreen-widgets-exit` | Close the lockscreen widgets editor |
| `lockscreen-widgets-toggle-edit` | Toggle lockscreen widgets edit mode |
### Desktop Widgets
| Command | Description |
|---------|-------------|
| `desktop-widgets-edit` | Open the desktop widgets editor |
| `desktop-widgets-exit` | Close the desktop widgets editor |
| `desktop-widgets-hide` | Hide desktop widgets (runtime only) |
| `desktop-widgets-show` | Show desktop widgets (runtime only) |
| `desktop-widgets-toggle` | Toggle desktop widgets visibility (runtime only) |
| `desktop-widgets-toggle-edit` | Toggle desktop widgets edit mode |
### Greeter
| Command | Description |
|---------|-------------|
| `greeter-sync` | Sync wallpaper, colors, and monitor layout to Noctalia Greeter |
### Media / UI
| Command | Description |
|---------|-------------|
| `notification-show <summary> <body...>` | Show an internal Noctalia notification |
| `notification-clear-active` | Dismiss all currently active notifications |
| `notification-clear-history` | Clear notification history |
| `notification-dnd-set <state>` | Set notification Do Not Disturb state |
| `notification-dnd-status` | Print notification DND state |
| `notification-dnd-toggle` | Toggle notification DND |
| `notification-invoke-latest` | Invoke the default action of the most recent active notification |
| `clipboard-copy <text>` | Copy text to the clipboard |
| `clipboard-text` | Print the most recent clipboard text |
| `clipboard-clear` | Clear clipboard history |
| `wallpaper-set [connector] <path>` | Set wallpaper for all or a specific output (persisted) |
| `wallpaper-next [connector]` | Switch to the next wallpaper immediately |
| `wallpaper-previous [connector]` | Switch to the previous wallpaper immediately |
| `wallpaper-random [connector]` | Switch to a random wallpaper immediately |
| `wallpaper-get [connector]` | Print default wallpaper path, or effective path for an output |
| `theme-mode-set <mode>` | Set theme mode and persist to `settings.toml` |
| `theme-mode-toggle` | Toggle theme mode between dark and light |
| `theme-mode-get` | Print the current resolved theme mode |
| `color-scheme-set <{builtin\|wallpaper\|community\|custom}> ...` | Set palette source and selection in `settings.toml` |
| `color-scheme-get` | Print active color scheme: `<source> <name>` |
| `screenshot-region` | Start an interactive region screenshot |
| `screenshot-fullscreen [mode]` | Capture the focused monitor by default, `pick` interactively, or `all` outputs |
| `screenshot-annotate` | Freeze the screen and annotate it, then copy or save |
| `annotate [path]` | Draw on the screen over running apps, or annotate an image file; press F or the Freeze button to capture the background |
### System Controls
| Command | Description |
|---------|-------------|
| `volume-up [step]` | Increase speaker volume |
| `volume-down [step]` | Decrease speaker volume |
| `volume-set <value>` | Set speaker volume |
| `volume-mute` | Toggle speaker mute |
| `volume-osd [value]` | Show the volume OSD without changing volume |
| `mic-mute` | Toggle microphone mute |
| `mic-volume-up [step]` | Increase microphone volume |
| `mic-volume-down [step]` | Decrease microphone volume |
| `mic-volume-set <value>` | Set microphone volume |
| `mic-volume-osd [value]` | Show the microphone volume OSD |
| `brightness-up [target] [step]` | Increase brightness (defaults to current monitor) |
| `brightness-down [target] [step]` | Decrease brightness (defaults to current monitor) |
| `brightness-set [target] <value>` | Set brightness (defaults to current monitor) |
| `brightness-osd <value>` | Show brightness OSD without changing brightness |
| `brightness-list-backlight-devices` | List available sysfs backlight device names |
| `keyboard-backlight-up` | Increase all keyboard backlights by one level |
| `keyboard-backlight-down` | Decrease all keyboard backlights by one level |
| `keyboard-backlight-toggle` | Toggle all keyboard backlights on/off |
| `keyboard-backlight-set <value>` | Set all keyboard backlights (0-100 percentage) |
| `keyboard-backlight-osd <value>` | Show keyboard backlight OSD without changing brightness |
| `keyboard-layout-cycle` | Switch to the next keyboard layout |
| `network-toggle` | Disconnect the active network, or reconnect when nothing is connected |
| `wifi-toggle` | Toggle Wi-Fi |
| `wifi-enable` | Enable Wi-Fi |
| `wifi-disable` | Disable Wi-Fi |
| `wifi-status` | Print Wi-Fi state |
| `bluetooth-toggle` | Toggle Bluetooth |
| `bluetooth-enable` | Enable Bluetooth |
| `bluetooth-disable` | Disable Bluetooth |
| `bluetooth-status` | Print Bluetooth state |
| `power-cycle [direction]` | Step through UPower's ordered profile list, forward by default (wraps) |
| `power-set <profile>` | Set the UPower power profile (e.g., `performance`, `balanced`, `power-saver`) |
| `caffeine-toggle` | Toggle caffeine (idle inhibitor) |
| `caffeine-enable` | Enable caffeine (idle inhibitor) |
| `caffeine-disable` | Disable caffeine (idle inhibitor) |
| `dpms-on` | Turn monitors on |
| `dpms-off` | Turn monitors off |
| `effects-profile-set <kind> <profile>` | Set the EasyEffects output or input profile |
| `log-level-set <level>` | Set the console log level |
| `log-level-status` | Print the current console log level |
| `session <action>` | Run a built-in session action (e.g., `lock`, `lock-and-suspend`) |
| `config-reload` | Reload the config file |
| `status` | Print current state as JSON |
| `taskbar-cycle <direction>` | Step to the adjacent task or workspace group in the invoking taskbar |
| `templates-apply` | Apply configured theme templates for the current palette |
| `osd-toggle` | Toggle OSD popups |
| `osd-enable` | Enable OSD popups |
| `osd-disable` | Disable OSD popups |
| `plugin <author/plugin:entry> <target[:bar-name]> <event> [payload]` | Dispatch an event to a plugin entry |
| `plugins <{list\|enable\|disable\|update\|source}> ...` | Manage plugins and sources (`list`/`enable`/`disable`/`update`, `source` list/add/remove) |
---
## Configuration Files
### `~/.config/noctalia/config.toml`
Main configuration file for runtime and persisted settings.
**Live config (tracked in repo):**
```toml
[shell]
polkit_agent = true
[wallpaper]
directory = "/home/blank/.local/share/noctalia/wallpapers"
```
### `~/.local/state/noctalia/settings.toml`
Settings GUI configuration (bar widgets, theme, wallpaper automation, plugins).
Note the location: **`~/.local/state/`**, not `~/.config/`.
**Location:** `~/.local/state/noctalia/settings.toml`
**Status:** Tracked in repo — `dotfiles/noctalia/.local/state/noctalia/settings.toml`;
the Settings GUI rewrites the live file, so deploy adopts divergents.
Bar layout lives in `[bar.default]`: `center = [ "taskbar", "cat" ]`,
`end = [ "notifications", "clipboard", "network", "bluetooth", "tray",
"battery", "session", "control-center", "clock" ]`. The taskbar widget lists
open windows of the focused workspace (added 2026-10-09). Apply changes with
`noctalia msg config-reload`.
### `~/.config/noctalia/palettes/`
Custom palette folders.
**Live config (tracked in repo):**
- `~/.config/noctalia/palettes/Gruber Red.json` → `/home/blank/.omp/dotfiles/noctalia/.config/noctalia/palettes/Gruber Red.json`
**Usage:**
```bash
noctalia msg color-scheme-set custom "Gruber Red"
```
Custom palettes are folder-based and immune to the community-palette catalog sync mechanism.
### `~/.config/niri/noctalia.kdl`
Niri-specific integration file (generated by Noctalia, untracked in repo).
Contains theme colors (live: `#f43841` red theme), layer rules, and wallpaper backdrop rules.
---
## Niri Integration
Noctalia is deeply integrated with the Niri compositor configuration.
### Autostart
**File:** `~/.config/niri/cfg/autostart.kdl`
```kdl
spawn-at-startup "noctalia"
```
### Window Rules
**File:** `~/.config/niri/cfg/rules.kdl`
```kdl
// Geometry and clipping
window-rule {
geometry-corner-radius 20
clip-to-geometry true
}
// Floating settings window
window-rule {
match app-id="dev.noctalia.Noctalia"
open-floating true
default-column-width { fixed 1080; }
default-window-height { fixed 920; }
}
// Wallpaper backdrop
layer-rule {
match namespace="^noctalia-wallpaper"
place-within-backdrop true
}
// Panels and overlays
layer-rule {
match namespace="^noctalia-(bar-[^\"]+|notification|dock|panel|attached-panel|osd)$"
background-effect {
xray false
}
}
```
### Keybindings
**File:** `~/.config/niri/cfg/keybinds.kdl`
| Keybind | Action | IPC Command |
|---------|--------|-------------|
| `Mod+Shift+Return` | Wallpaper panel | `noctalia msg panel-toggle wallpaper` |
| `Mod+S` | Control center | `noctalia msg panel-toggle control-center` |
| `Mod+Shift+S` | Settings | `noctalia msg settings-toggle` |
| `Mod+D` | App launcher | `noctalia msg panel-toggle launcher` |
| `Mod+ALT+L` | Lock screen | `noctalia msg session lock` |
| `Mod+Shift+Q` | Session menu | `noctalia msg panel-toggle session` |
| `Mod+V` | Clipboard history panel | `noctalia msg panel-toggle clipboard` |
| `Alt+Tab` | Window switcher (app icons + titles) | `noctalia msg window-switcher` |
| `XF86AudioRaiseVolume` | Volume up | `noctalia msg volume-up` |
| `XF86AudioLowerVolume` | Volume down | `noctalia msg volume-down` |
| `XF86AudioMute` | Mute | `noctalia msg volume-mute` |
| `XF86AudioMicMute` | Mic mute | `noctalia msg mic-mute` |
| `XF86AudioNext` | Next track | `noctalia msg media next` |
| `XF86AudioPrev` | Previous track | `noctalia msg media previous` |
| `XF86AudioPlay` | Play | `noctalia msg media play` |
| `XF86AudioPause` | Pause/stop | `noctalia msg media stop` |
| `XF86MonBrightnessUp` | Brightness up | `noctalia msg brightness-up` |
| `XF86MonBrightnessDown` | Brightness down | `noctalia msg brightness-down` |
| `Mod+Shift+ESCAPE` | Show hotkey overlay | `niri show-hotkey-overlay` |
**Recommended IPC binds** (from docs):
- `Mod+Space` — Launcher
- `Mod+S` — Control center
- `Mod+Comma` — Settings
- `Alt+Tab` — Window switcher (hold)
### Wallpaper Backdrop
The wallpaper layer is placed in the backdrop:
**File:** `~/.config/niri/cfg/rules.kdl`
```kdl
layer-rule {
match namespace="^noctalia-wallpaper"
place-within-backdrop true
}
```
### Background Color
**File:** `~/.config/niri/cfg/layout.kdl`
```kdl
layout {
background-color "transparent" // <- needed for noctalia-shell to set wallpaper
}
```
### Per-Widget Layer Namespaces
Widgets use namespace-based layer rules:
```kdl
layer-rule {
match namespace="^noctalia-(bar-[^\"]+|notification|dock|panel|attached-panel|osd)$"
background-effect {
xray false
}
}
```
### Laptop / Lid Policy
**File:** `~/.config/niri/cfg/keybinds.kdl`
```kdl
Mod+ALT+L hotkey-overlay-title="Lock Screen: noctalia lock" { spawn-sh "noctalia msg session lock"; }
```
**File:** `~/.config/niri/cfg/autostart.kdl`
```kdl
// Lid close policy (optional)
switch-events {
lid-close {
spawn "noctalia" "msg" "session" "lock-and-suspend";
}
}
```
Also requires logind configuration: `HandleLidSwitch=ignore` in `/etc/logind.conf`.
---
## Theme / Palette Workflow
### Builtin Themes
```bash
# List available builtin themes
noctalia msg theme-mode-get
# Set a builtin theme
noctalia msg theme-mode-set dark
noctalia msg theme-mode-set light
# Toggle between dark and light
noctalia msg theme-mode-toggle
```
### Community Palettes
```bash
# Set a community palette by ID
noctalia msg color-scheme-set community "Palette Name"
```
### Custom Palettes
```bash
# Set a custom palette from a folder
noctalia msg color-scheme-set custom "Gruber Red"
```
Custom palettes live in `~/.config/noctalia/palettes/` and are immune to the community-palette catalog sync.
**Apply templates:**
```bash
noctalia msg templates-apply
```
---
## Dependencies
| Package | Purpose |
|---------|---------|
| `noctalia` (Qt) | Native desktop environment |
| `qt6-base` | Qt6 runtime |
| `qt6-multimedia` | Multimedia support |
| `niri` | Wayland compositor |
| `wlr-randr` | Display information |
| `brightnessctl` | Brightness control |
| `imagemagick` | Image processing |
| `ffmpeg` | Media processing |
| `polkit` | PolicyKit integration |
---
## See Also
- [[niri|niri/index.md]] — Compositor configuration
- [[displays|displays]] — Display layout
- [[cachyos|cachyos]] — Operating system documentation
- [`noctalia msg --help`](https://github.com/Noctalia/noctalia) — Full command reference