Skip to content

Widgets

Widget definitions are optional. When a name in a widget list matches a [widget.<name>] entry, that entry’s type and settings are used. When there is no match, the name itself is treated as the widget type with default settings.

Middle-click a bar widget to open Settings directly to that widget’s configuration. Disable [shell].middle_click_opens_widget_settings if you want middle-click to remain available to scripted widgets.

[widget.<name>]
type = "<widget-type>" # defaults to <name> when omitted
# ...widget-specific settings

This allows multiple instances of the same widget type:

[widget.clock-seconds]
type = "clock"
format = "{:%H:%M:%S}"
[bar.main]
end = ["clock", "clock-seconds"] # two clock widgets, different formats

Displays the current time.

SettingTypeDefaultDescription
formatstring{:%H:%M}Clock format string for horizontal bars and vertical fallback. Use \n for multiple lines; examples: {:%H:%M}\n{:%d/%m}, %H:%M, {:%-I:%M %p}. See Date format tokens.
vertical_formatstring""Format used when the bar is vertical. When empty, falls back to format with : replaced by line breaks. Supports the same syntax as format.
[widget.clock]
format = "{:%H:%M}\n{:%d/%m}"
vertical_format = "{:%H\n%M}"
[widget.clock-12h]
type = "clock"
format = "{:%-I:%M %p}"
[widget.clock-seconds]
type = "clock"
format = "{:%H:%M:%S}"
vertical_format = "{:%H\n%M\n%S}"

Empty space between widgets.

SettingTypeDefaultDescription
lengthnumber8Spacer length in screen pixels
[widget.gap]
type = "spacer"
length = 24

Workspace switcher with solid dots/pills and optional labels.

SettingTypeDefaultDescription
displaystring"id"Label mode: "none", "id", or "name"
focused_colorstring"primary"Color role or hex color for the focused workspace pill
occupied_colorstring"secondary"Color role or hex color for occupied (non-focused) workspace pills
empty_colorstring"secondary"Color role or hex color for empty workspace pills
[widget.workspaces]
display = "id" # none | id | name
focused_color = "primary"
occupied_color = "secondary"
empty_color = "surface_variant"

Icon-only running application list. By default it follows the bar’s output (only windows the compositor associates with that monitor). Enable Show all monitors when you use one bar for everything but still want to see and focus apps on other displays.

Left-click an icon to focus that window. The active window shows a small primary dot under the icon.

When group_by_workspace is enabled, workspace group capsules use the taskbar widget’s resolved capsule_radius. Set [widget.taskbar].capsule_radius for just the taskbar, or [bar.<name>].capsule_radius as the bar default.

SettingTypeDefaultDescription
group_by_workspaceboolfalseGroup icons into workspace capsules when backend workspace-app mapping is available.
show_all_outputsboolfalseInclude windows from all displays. With group_by_workspace, workspaces from every monitor are merged; capsule badges use tag·n (workspace tag, middle dot, monitor index in bar output order) when there is more than one output.
[widget.taskbar]
group_by_workspace = true
show_all_outputs = true

Shows the active window icon and title for the current output.

SettingTypeDefaultDescription
min_lengthnumber80Minimum widget length in pixels
max_lengthnumber260Maximum widget length in pixels
icon_sizenumber14Icon size in pixels
title_scrollstring"none"Title scrolling mode: "none", "always", or "on_hover"
[widget.active_window]
min_length = 80
max_length = 260
icon_size = 14
title_scroll = "on_hover"

Opens the control center panel on click.

SettingTypeDefaultDescription
glyphstring"noctalia"Bar glyph name: Noctalia alias, Tabler icon name, or U+ / 0x codepoint
custom_imagestring""Path to a custom image displayed instead of the glyph. Leave empty to use the glyph
[widget.control-center]
custom_image = "/path/to/image.png"

System resource monitor. Shows an icon and value for one configurable stat. Multiple instances with different stats can coexist on the same bar.

SettingTypeDefaultDescription
statstring"cpu_usage"Which stat to display (see table below)
pathstring"/"Mount path for disk_pct (ignored otherwise)
displaystring"gauge""gauge" = icon + vertical fill bar; "graph" = icon + sparkline; "text" = icon + value
show_labelbooltrueShow the text value next to the graph or gauge (always shown in "text" mode)

stat values:

ValueDisplayDescription
cpu_usage75%CPU utilisation (all cores)
cpu_temp65°CCPU package temperature
gpu_temp72°CGPU temperature
ram_used4.2GRAM used (human-readable)
ram_pct26%RAM used %
swap_pct12%Swap used %
disk_pct45%Disk used % for path
net_rx1.2MNetwork download speed (auto-scaled)
net_tx256KNetwork upload speed (auto-scaled)
[widget.cpu]
type = "sysmon"
stat = "cpu_usage"
[widget.cpu-graph]
type = "sysmon"
stat = "cpu_usage"
display = "graph"
show_label = false
[widget.temp]
type = "sysmon"
stat = "cpu_temp"
[widget.ram]
type = "sysmon"
stat = "ram_used"
[widget.disk]
type = "sysmon"
stat = "disk_pct"
path = "/"

Shows PipeWire output (speaker) or input (microphone) volume and mute state.

SettingTypeDefaultDescription
devicestring"output"Audio target: "output" (default sink) or "input" (default source / microphone)
show_labelbooltrueShow the volume percentage next to the glyph (horizontal and vertical bars)
[widget.volume]
device = "output" # output | input
show_label = false
[widget.input-volume]
type = "volume"
device = "input"
[widget.output-volume]
type = "volume"
device = "output"
Terminal window
# Output (speaker)
noctalia msg set-volume 65
noctalia msg raise-volume
noctalia msg raise-volume 10
noctalia msg lower-volume
noctalia msg mute
# Input (microphone)
noctalia msg set-mic-volume 0.5
noctalia msg raise-mic-volume
noctalia msg raise-mic-volume 5%
noctalia msg lower-mic-volume
noctalia msg mute-mic

Volume and mic IPC use a default step of 5% when no explicit step is provided. Values and steps accept normalized (0.01.0) or percentage-style values (65, 65%, 5%). Rule of thumb: if you include a decimal and the value is <= 1.0, it is treated as normalized; otherwise it is treated as a percentage.

Output and mic volume are clamped to 0–100% by default. If [audio] enable_overdrive = true, the maximum is raised to 150%.


Horizontal audio spectrum using the current PipeWire monitor stream.

SettingTypeDefaultDescription
widthnumber56Widget width in screen pixels
bandsnumber16Number of spectrum bands
mirroredbooltrueMirror the spectrum around the center line
show_when_idleboolfalseKeep the widget visible even when no media is playing
low_colorstring"primary"Color role or hex color for the first bars
high_colorstring"primary"Color role or hex color for the last bars

The widget height fills the available bar space automatically.

[widget.audio-vis]
type = "audio_visualizer"
width = 64
bands = 20
show_when_idle = true
low_color = "primary"
high_color = "secondary"

Shows the current media artwork and track title from MPRIS.

SettingTypeDefaultDescription
min_lengthnumber80Minimum widget length in pixels
max_lengthnumber220Maximum widget length in pixels
art_sizenumber16Artwork size in pixels before scale
title_scrollstring"none"Media title scrolling mode: "none", "always", or "on_hover"
[widget.media]
min_length = 80
max_length = 220
art_size = 24
title_scroll = "on_hover"

Shows battery charge level and state via UPower. Hides itself when the selected battery is missing or not present.

SettingTypeDefaultDescription
devicestringautoUPower device selector. auto monitors the system power-supply battery only; explicit selectors can target any present battery-capable UPower device.

device = "auto" is safe on desktops: it will not use gamepads, mice, headsets, or other peripherals as the default battery widget. Use an explicit selector for those devices.

Selectors can be a full UPower object path, a native path/name, a stable suffix such as BAT0, or available device metadata such as model, serial, or vendor.

# Default system/laptop battery
[widget.battery]
type = "battery"
device = "auto"
# Internal battery by native name/suffix
[widget.internal_battery]
type = "battery"
device = "BAT0"
# Second battery by full UPower object path
[widget.second_battery]
type = "battery"
device = "/org/freedesktop/UPower/devices/battery_BAT1"
# Explicit peripheral battery
[widget.gamepad_battery]
type = "battery"
device = "/org/freedesktop/UPower/devices/gaming_input_hid_001"

Shows the current display brightness level and adjusts it via scroll wheel (±5% per step). Hides itself when no controllable display is found. Click opens the display tab in the control center.

SettingTypeDefaultDescription
show_labelbooltrueShow the brightness percentage next to the glyph (horizontal and vertical bars)
[widget.brightness]
show_label = false

See [brightness] for backend configuration.


Shows the Bluetooth adapter state and connected device. Click opens the Bluetooth tab in the control center.

SettingTypeDefaultDescription
show_labelboolfalseShow the connected device name next to the icon
[widget.bluetooth]
show_label = true

Shows the current network connection (Wi-Fi SSID and signal, or wired) via NetworkManager. Dims and shows a wifi-off glyph when disconnected.

SettingTypeDefaultDescription
show_labelbooltrueShow the SSID or interface name next to the glyph
[widget.network]
show_label = false

Shows the current keyboard layout indicator from the active XKB state.

Left-click cycles layouts using the compositor backend when supported. Override with cycle_command for a custom shell command.

SettingTypeDefaultDescription
displaystring"short""short" = compact code; "full" = full layout name
cycle_commandstring""Optional override command run on left click instead of compositor backend
[widget.keyboard_layout]
display = "short" # short | full

Shows Caps Lock / Num Lock / Scroll Lock state from the active XKB keyboard state.

SettingTypeDefaultDescription
displaystring"short""short" (C N S) or "full" (Caps Num Scroll)
show_caps_lockbooltrueShow the Caps Lock indicator
show_num_lockbooltrueShow the Num Lock indicator
show_scroll_lockboolfalseShow the Scroll Lock indicator
hide_when_offboolfalseHide each indicator when it is off
[widget.lock_keys]
display = "short"
show_caps_lock = true
show_num_lock = true
show_scroll_lock = false
hide_when_off = false

Opens the launcher panel on click.

SettingTypeDefaultDescription
glyphstring"search"Bar glyph name: Noctalia alias, Tabler icon name, or U+ / 0x codepoint
custom_imagestring""Path to a custom image displayed instead of the glyph. Leave empty to use the glyph
[widget.launcher]
glyph = "menu-2"

Shows a clipboard glyph and opens or closes the clipboard panel on click.

SettingTypeDefaultDescription
glyphstring"clipboard"Bar glyph name: Noctalia alias, Tabler icon name, or U+ / 0x codepoint
[widget.clipboard]
glyph = "clipboard-list"

Shows the current weather in the bar and opens the Weather control-center tab on click. Requires [weather] to be configured.

SettingTypeDefaultDescription
max_lengthnumber160Maximum length for the weather text
show_conditionbooltrueShow condition text like Overcast next to temperature
[widget.weather]
max_length = 180
show_condition = false

Shows the pending notification count. Right-clicking toggles transient Do Not Disturb (DND) mode.

SettingTypeDefaultDescription
hide_when_no_unreadboolfalseHide the widget when there are no unread notifications
[widget.notifications]
hide_when_no_unread = true
Terminal window
noctalia msg toggle-notification-dnd
noctalia msg notification-dnd-status
noctalia msg notification-clear-active
noctalia msg notification-clear-history

When DND is enabled, incoming notifications are stored in history/control center but toast popups are suppressed.


System tray (StatusNotifierItem).

SettingTypeDefaultDescription
hiddenarray of string[]Tray items to hide by id/name/bus/path token
pinnedarray of string[]Tray items that always stay visible in the bar when drawer = true
drawerboolfalseReplace inline tray icons with a tray button that opens a tray drawer panel
drawer_columnsnumber3Number of tray icons per row in the drawer panel (1 to 5)
[widget.tray]
hidden = ["nm-applet", "blueman", "org.kde.StatusNotifierItem-1-1"]
pinned = ["nm-applet"]
drawer = true
drawer_columns = 3

Tip: right-click a tray item and use Pin / Unpin in the item menu to update pinned without editing config manually.


Shows the current power profile using a glyph and cycles to the next available profile on click.

No configurable settings.


Shows a coffee glyph and toggles the compositor idle inhibitor on click. Uses the standard Wayland zwp_idle_inhibit_manager_v1 protocol.

No configurable settings.

Terminal window
noctalia msg caffeine-enable
noctalia msg caffeine-disable
noctalia msg caffeine-toggle

StateIconMeaning
Offmoon-offNight light disabled
OnmoonScheduled — follows start_time/stop_time or location
Forcedmoon-starsAlways-on override — ignores schedule

Click behavior:

  • Left-click: toggles night light on/off. If currently forced, this drops the force override and lands on the regular scheduled-on state, so force is reversible without also turning night light off.
  • Right-click: toggles the always-on (force) override.

User toggles made via the bar widget (or control center) are preserved across config hot-reload — only an actual change to enabled / force in your config file resets the corresponding override.

No configurable settings.

Terminal window
noctalia msg toggle-nightlight
noctalia msg toggle-force-nightlight

Toggles between dark (moon glyph) and light (sun glyph) theme mode on click.

No configurable settings.

Terminal window
noctalia msg theme-mode-toggle

Shows a power glyph and opens the session menu panel on click.

SettingTypeDefaultDescription
glyphstring"shutdown"Bar glyph name: Noctalia alias, Tabler icon name, or U+ / 0x codepoint
[widget.session]
glyph = "lock"

Shows a glyph and opens the wallpaper picker panel on click.

SettingTypeDefaultDescription
glyphstring"wallpaper-selector"Bar glyph name: Noctalia alias, Tabler icon name, or U+ / 0x codepoint
[widget.wallpaper]
glyph = "photo"

Custom widget driven by a Luau script. See Scripted widgets for the full Lua API reference, callbacks, and examples.

SettingTypeDefaultDescription
scriptstring""Path to the Luau script file (~ is expanded)
hot_reloadboolfalseWatch the script file and reload on change (dev tool)
[widget.my_widget]
type = "scripted"
script = "~/.config/noctalia/scripts/my_widget.lua"
hot_reload = true