Important Changes
- Config: app icon colorization is now set per component.
[shell].app_icon_colorizeis replaced bycolorize_iconstoggles in the launcher, dock, window switcher, notifications, audio, and the workspaces, taskbar, tray, and active-window widgets, plus[shell].screen_time_colorize_iconsand[shell].polkit_colorize_icons.[shell].app_icon_colorremains the shared tint - Config:
control_center.circular_avatarmoved toshell.circular_avatarand now applies to the launcher avatar too; the workspaces widget'sshow_all_outputs = truebecomesmonitors = ["*"] - Plugins:
noctalia.systemStats()no longer turns on GPU sampling, so reading CPU, RAM, or network stats no longer keeps a discrete GPU awake. GPU plugins must request sampling withnoctalia.setGpuMonitoring(true), release it when hidden, and declareplugin_api = 46. CPU, RAM, and network plugins need no changes
These renames are migrated automatically, and settings changed in the Settings window are updated for you. Hand-written or declarative configs (Nix, dotfiles…) keep working but log a migration warning until you switch to the new keys
✨ New Features
Bar & Widgets
- Peek mode for volume, brightness, keyboard layout, Bluetooth, network, weather, battery, custom button, sysmon, media, and tray widgets: show only the glyph and reveal the value on hover, with
peek,glyph_position, andpeek_delay_ms - Shared
custom_labelandshow_glyphoptions on every bar widget, including plugin widgets - Expanding spacers with
expand = true, sharing a lane's free space to center widgets between their neighbors margin_endsaccepts a screen percentage such as"15%", computed per monitorauto_hide_reserve_spacereleases an auto-hidden bar's reserved space while it is hidden and restores it when the bar slides back in- Workspaces widget
monitorslist for showing workspaces from chosen monitors in order, and text separators withseparatorandseparator_color - Taskbar
label_sourceto show workspace names or numeric ids on workspace group tags - Tray
icon_typeto replace app-provided icons with desktop-entry or symbolic icons, withicon_override_blacklistfor exceptions - Tray
drawer_background_opacityfor the detached drawer, andglyph_positionto place the drawer button before or after the icons - Battery
automode follows the lowest-charged peripheral on machines without a system battery, including the Control Center card and battery hooks - Custom "no active window" text with
empty_label - Privacy widget detects applications opening cameras directly through V4L2, ignoring brief capability probes
- Capsule-group accordions wait 100 ms of hover before expanding by default (
accordion_delay_ms)
Dock
- Optional icon shadows following each application icon's shape with
icon_shadow - Icon desaturation with
icon_saturation, including per-monitor overrides - Auto-hide reveal requires resting on the screen edge for 250 ms, configurable with
auto_hide_reveal_delay_ms
Launcher & Window Switcher
- Window switcher
gridandiconsstyles, the latter showing every window as stationary icon tiles without capturing previews reversedirection for thewindow-switcherIPC command, for Shift+Tab bindings such aswindow-switcher hold reversecategory_nextandcategory_previouskeybinds (Ctrl+Tab and Ctrl+Shift+Tab by default) cycle launcher categories and Control Center tabs- Emoji category filters shown as icons in the Full launcher layout;
category_icons_onlyalso covers provider category filters - AppImages launched through
envorTryExecdesktop entries are recognized and marked with a distinct glyph
Screenshots
- Zoom and pan in the annotation editor with Ctrl+wheel, Ctrl+drag, and the toolbar zoom control
- Capture window (Ctrl+W) and capture new region (Ctrl+R) from the annotation toolbar's Capture again popover
- Select the whole desktop during region capture with the
select_allkeybind (Ctrl+A by default) - Space as a
region_modifierfor moving and resizing regions append_mode_suffixto drop the-region,-annotated,-window, or-desktopfilename suffix; saves never overwrite an existing file and add a numeric suffix instead
Lock Screen
- Media playback controls in the login box with
show_media_controls, and media keys that control playback while locked - Do Not Disturb while locked with
[lockscreen].dnd, restoring the previous state on unlock - Custom background tint color with
tint_color - CRT transition for the lock screen and wallpapers
Appearance & Theming
- Synchronized wallpaper transitions across monitors with
sync_transitions, enabled by default - Fill mode selector and live palette previews in the wallpaper panel; palette pickers stay open while browsing
terminal_colors = "standard"keeps recognizable red, green, and yellow ANSI hues in wallpaper-generated themes- Palette files use role names as keys with
"version": 2; existing palette files and v4 color schemes keep working - Redesigned animated weather backgrounds for rain, sun, snow, clouds, fog, and stars; mostly clear skies and thunderstorms now animate too
- Control Center sidebar border following
card_borders - Running Helix instances reload after theme changes, the Umbriel template themes title-bar button glyphs, and the Emacs template colors message quotes
Notifications / OSD
- Notification history grouped by application, enabled by default with
group_by_app newest_on_edgeplaces new toasts against the screen edge and pushes older ones awayshow_progress_barto hide the toast timeout bar- OSD
centerposition
Calendar & Connectivity
- Choose which Google calendars to sync, independently of Google Calendar's sidebar
- VPN secret prompts for NetworkManager connections, including one-time codes, with secrets saved to the keyring like
nm-applet - NetworkManager password requests open the Control Center Network tab and stay pending while it is closed
Audio & Display
spectrum_frame_ratesets how often audio visualizers update instead of following the monitor refresh rate- Scheduled day and night brightness following the location schedule with
enable_scheduled_brightness, including per-monitor targets
Plugins
noctalia.umbriel.actionfor typed Umbriel IPC actions without spawning processesnoctalia.nightlightAPI with state, enable, force, and watch functionsnoctalia.mediaPlayer()snapshot of the active player with a smoothly projected position- Karaoke-style
ui.fillLabel, textshadow, anddesktopWidget.setVisible - Paint-only
translateX,translateY,scale, androtationprops and containerclipfor animating declarative UI without relayout onSuspendandonResumeservice callbackssecretsettings, left out bynoctalia config export --credentials omitfitmodes for pixel streams and afollowdefault layer for floating panels- Entries react when shell settings read through
noctalia.getSettingchange, throughonConfigChanged()or a script reload - Plugin store renders images from plugin READMEs
Other
- Experimental
Type=notifysystemd user service that starts Noctalia before XDG autostart apps, so their tray icons register reliably noctalia config export --credentials keep|omit|blank, also offered in the Settings export dialog~date-format modifier to capitalize localized day and month names- Localized special key names in shortcut labels
- Settings search ignores case beyond ASCII and accents; widget settings are grouped into collapsible cards, and Lock Screen and Greeter have their own section
- Guides for Hyprland permission rules and for disabling compositor layer animations on Hyprland, Mango, and Umbriel
🐛 Notable Fixes
- Audio: keep PipeWire's realtime module out of the shell's connections, preventing kernel kills under some realtime portal setups
- Audio: microphone volume changes no longer play the output volume sound, volumes above 100% display correctly, additional visualizer widgets honor
show_when_idle, and microphone mute follows port switches - Power: charger sounds no longer repeat while a full battery flips between charge states on AC
- Session: a failing logout, reboot, or shutdown hook no longer cancels the action
- Clipboard: pasting into Noctalia uses the live selection, so password-manager copies paste without being stored in history; plugin text copies paste into GTK and Firefox apps
- Screenshots: region and annotation keys no longer leak into an open launcher on niri, and dimmed areas no longer show hairline seams
- Tray: blinking items no longer trigger constant refetching, icons stay clickable while animating, the drawer refreshes immediately, Noctalia takes over when an external watcher exits, and unthemed icons resolve
- Dock: no icon stretching on niri when windows open or close, no recreation on every config reload, stable order for focused unpinned apps, no crash after reordering icons, and fewer wrong app matches between IDs sharing a publisher namespace
- Panels: context menus and dropdowns render on secondary monitors under Hyprland, unpinned panels open on the pointer's monitor on labwc, and panels resize when their scrolling content changes
- labwc: workspace occupancy is tracked from focus, fixing
hide_when_emptyand smart auto-hide() - Mango: workspace widget reconnects when its watch socket drops
- Sway and Scroll: keyboard layout widget updates on layout changes, and the window switcher no longer lists windows twice
- Performance: Hyprland plugin bar widgets no longer query monitors every 250 ms, and Umbriel triggers fewer workspace refreshes
- Network: keep NetworkManager when its service is enabled but starts after the shell, show Wi-Fi as off instead of "no networks", and show a running hotspot as a hotspot
- Bluetooth: open the Bluetooth tab for pairing requests that arrive while the Control Center is closed instead of letting them time out
- Wallpaper: seamless
repeattiling, no fill-color flash before the first image, per-connectorwallpaper_changedhooks at startup,~and environment variables in favorite paths, and the bundled fallback is no longer saved over a declarative wallpaper - Theme: wallpaper-generated ANSI colors no longer duplicate between normal and bright slots, and custom wallpaper schemes order surface container tones correctly
- Notifications:
max_visiblerespected when queued toasts appear, toasts no longer re-animate when rebuilt, and app icons resolve from the desktop-entry hint - Calendar: declined Google events no longer remind, and CalDAV calendar colors from the Apple namespace are read
- Links opened from Settings, plugin pages, and calendar events request browser focus through Wayland activation
- Clocks follow system timezone changes without a restart
- Bar and OSD content sits on whole pixels instead of blurring at half-pixel offsets
- Desktop widgets: clock, weather, and label text shadows are no longer clipped, and weather content is centered
- Control Center: media progress resets on track changes, and the niri overview backdrop stays opaque when tinted
- Lock screen: custom sleep actions remain visible
- Location: an explicit
custom_schedulesurvives toggling from Settings - Ghostty
+sshsessions survive theme reloads - Multiline text inputs scroll in the right direction without snapping to the caret
- IPC:
config-setaccepts quoted keys such as plugin ids - Plugins:
noctalia.appIconPathresolves raw icon names and absolute paths before fuzzy app matching - Settings: Esc or clicking elsewhere cancels a pending option reset
🔧 Build
- Experimental systemd user unit installed as
<datadir>/noctalia/assets/noctalia.service; Nix, Home Manager, and Hjem services useType=notifyand start beforegraphical-session.target - Shared rendering library moved to
lib/with vendored Wuffs underlib/third_party/.