Configure CachyOS Niri desktop with Noctalia shell
User: aps
OS: CachyOS (Arch-based)
Compositor: Niri (scrolling tiling Wayland)
Desktop Shell: Noctalia (quickshell-based)
Noctalia is a quickshell-based desktop shell that replaces multiple components:
Other tools:
| Component | Config Path |
|---|---|
| Niri | ~/.config/niri/ (modular: config.kdl + cfg/*.kdl) |
| Noctalia | ~/.config/noctalia/settings.json |
| Noctalia Colors | ~/.config/noctalia/colors.json |
| Noctalia Templates | ~/.config/noctalia/user-templates.toml |
| Noctalia User Templates | ~/.config/noctalia/templates/ |
| Ghostty | ~/.config/ghostty/config (generated) |
| Alacritty | ~/.config/alacritty/ |
| Fish | ~/.config/fish/config.fish |
| Starship | ~/.config/starship.toml (auto-generated) |
| GTK | ~/.config/gtk-3.0/ + ~/.config/gtk-4.0/ |
Noctalia settings: Edit ~/.config/noctalia/settings.json (single 600+ line file)
Niri keybinds: Edit ~/.config/niri/cfg/keybinds.kdl (not main config.kdl)
Theme switching: Handled natively by Noctalia (via UI or IPC).
Window rules: Edit ~/.config/niri/cfg/rules.kdl
Main Settings: ~/.config/noctalia/settings.json
Current Colors: ~/.config/noctalia/colors.json
Noctalia auto-generates themed configs for: ghostty, alacritty, walker, niri, zed, gtk3/4, btop, cava, zenBrowser, mangoHud, qt, foot, and KDE apps. See the templates.activeTemplates section in settings.json.
User Templates: Enable in Settings ā Color Scheme ā Templates ā Advanced ā User templates
~/.config/noctalia/user-templates.toml~/.config/noctalia/templates/# Lock screen
qs -c noctalia-shell --lock
# Launch app launcher
qs -c noctalia-shell --launcher
# Open control center
qs -c noctalia-shell --control-center
# Change wallpaper
qs -c noctalia-shell --set-wallpaper /path/to/wallpaper
# Set color scheme (triggers template regeneration)
qs -c noctalia-shell ipc call colorScheme set <ThemeName>
Config: ~/.config/noctalia/user-templates.toml
Template syntax: {{colors.name.mode.format}}
{{colors.primary.default.hex}}Starship template: ~/.config/noctalia/templates/starship.toml
{{colors.primary.default.hex}} for accent color~/.config/starship.toml on theme changeModular config structure in ~/.config/niri/:
niri/
āāā config.kdl # Main entry point
āāā cfg/
ā āāā autostart.kdl # Startup apps
ā āāā keybinds.kdl # Keybindings
ā āāā display.kdl # Monitor outputs
ā āāā input.kdl # Keyboard/touchpad
ā āāā layout.kdl # Layout settings
ā āāā rules.kdl # Window rules
ā āāā misc.kdl # Environment variables
ā āāā animation.kdl # Animations
ā āāā noctalia.kdl # Noctalia-specific colors
Defined in ~/.config/niri/cfg/autostart.kdl:
qs -c noctalia-shell)Keybinds are defined in ~/.config/niri/cfg/keybinds.kdl. Common binds include terminal, browser, editor, lock screen, and launcher. Check the file for current bindings.
Noctalia v5 natively manages themes and wallpapers.
Colors: Noctalia generates the color scheme and stores it in ~/.config/noctalia/colors.json. All apps (including Starship via user templates) get themed automatically when you change the color scheme.
Available Themes: Themes are selected directly through the Noctalia Control Center / Settings UI.
All apps update automatically - no manual template substitution needed.
Key Insight: Fingerprint login at greetd doesn't unlock gnome-keyring (needs actual password). We separate PAM configs:
/etc/pam.d/login ā includes system-auth ā NO fingerprint (requires password for keyring)/etc/pam.d/noctalia-lock ā HAS fingerprint (keyring already unlocked)/etc/pam.d/noctalia-lock)#%PAM-1.0
# Noctalia lock screen - includes fingerprint auth
auth sufficient /usr/lib/security/pam_fprintd.so timeout=-1
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
Note: Use full path /usr/lib/security/pam_fprintd.so - Noctalia may not find it otherwise.
Note: timeout=-1 keeps fingerprint reader active indefinitely.
Noctalia reads NOCTALIA_PAM_SERVICE env var to determine which PAM service to use. Set via systemd override:
Override file: ~/.config/systemd/user/noctalia.service.d/pam.conf
[Service]
Environment=NOCTALIA_PAM_SERVICE=noctalia-lock
After creating/editing, run: systemctl --user daemon-reload && systemctl --user restart noctalia.service
Noctalia provides the lock screen with PAM authentication.
Auto-lock: Handled natively by Noctalia v5's built-in idle management (replacing swayidle).
Enroll fingerprints: fprintd-enroll
Result of this setup:
Incorrect password attempts trigger a temporary lockout via pam_faillock.so (configured in /etc/security/faillock.conf).
sudo faillock --user aps --reset. Alternatively, since records are stored in temporary RAM (/var/run/faillock), simply rebooting the system instantly clears the lockout.Agent: /usr/lib/polkit-kde-authentication-agent-1
Uses greetd with noctalia-greeter to match the Noctalia shell UI.
Config files:
/etc/greetd/config.toml - Main greetd config (launches /usr/bin/noctalia-greeter-session)/var/lib/noctalia-greeter/greeter.toml - Greeter settings (default session/user)/var/lib/noctalia-greeter/sync.toml - Auto-synced appearance settingsFeatures: matches Noctalia color scheme and wallpaper, remembers last user/session, supports session selection.
Syncing appearance:
Run Settings ā Security ā Noctalia Greeter ā Sync Now from the Noctalia shell to sync wallpaper and colors.
If on seatd without logind, run: pkexec noctalia-greeter-apply-appearance "$XDG_RUNTIME_DIR/noctalia-greeter-sync" in a terminal after staging.
Display Scaling & Multiple Monitors:
If the greeter looks excessively large/pixelated natively on high-DPI screens, wlroots is likely applying scale = 2.0 automatically.
To force scale = 1.0 while keeping multiple monitors active (and avoiding TOML parse errors), use global output settings with a combined layout string in /var/lib/noctalia-greeter/greeter.toml:
[output]
layout = "eDP-1:0,0; HDMI-A-1:1920,0"
scale = 1.0
Uses wl-clipboard with cliphist for history. Clipboard watching is configured in Noctalia settings.json - look for clipboard-related settings in the appLauncher section.
Edit ~/.config/niri/cfg/keybinds.kdl
Edit ~/.config/niri/cfg/rules.kdl. Example patterns:
window-rule {
match app-id=r#"^firefox$"#
open-maximized true
}
Edit ~/.config/niri/cfg/layout.kdl
Edit ~/.config/noctalia/settings.json in the bar.widgets.right (or left/center) array. Use CustomButton widget type to add custom buttons with icons, click handlers, and dynamic text from shell commands.
~/.config/noctalia/templates/myapp.conf~/.config/noctalia/user-templates.toml:[templates.myapp]
input_path = "~/.config/noctalia/templates/myapp.conf"
output_path = "~/.config/myapp/theme.conf"
post_hook = "pkill -USR1 myapp" # optional reload command
{{colors.primary.default.hex}}These files are managed automatically - edit their sources instead:
| Generated File | Source/Manager |
|---|---|
ghostty/config |
Noctalia template in settings.json |
alacritty/themes/noctalia.toml |
Noctalia |
gtk-3.0/noctalia.css |
Noctalia |
gtk-4.0/noctalia.css |
Noctalia |
starship.toml |
Noctalia user template |
niri/cfg/noctalia.kdl |
Noctalia |
Dotfiles tracked at github.com/APS6/nox-config.
Remember: After making changes to any system components that are documented in this skill (themes, auth, keybinds, Noctalia config, etc.), update this skill file to reflect the current state. This ensures the AI has accurate information for future tasks.