System Monitor
[system.monitor]enabled = true # sample CPU, memory, network, load, temperature, GPU VRAM, and disk statisticscpu_temp_sensor_path = "" # exact temp*_input path for CPU temperature override; empty = autocpu_poll_seconds = 2.0 # CPU usage, CPU temperature, and load averagegpu_poll_seconds = 0.0 # GPU temperature, usage, and VRAM (0 = disabled by default)memory_poll_seconds = 2.0 # RAM usagenetwork_poll_seconds = 3.0 # network throughputdisk_poll_seconds = 10.0 # disk usage and swap usageWhen disabled, Noctalia keeps system-monitor UI available but stops the background sampling thread. Bar sysmon widgets, desktop sysmon widgets, and the Control Center System tab show unavailable values until the setting is enabled again.
Poll intervals are configured globally under [system.monitor], not per widget. Each value is the number of seconds between samples for that metric group. A non-zero value is clamped to 1 to 120 seconds; setting a value to 0 disables that metric group entirely - it is never sampled and schedules no wakeups. Disabling gpu_poll_seconds is useful on laptops to avoid waking a discrete GPU. You can also adjust them in whole-second steps (down to 0) in Settings → Services → Advanced when the system monitor is enabled.
| Key | Default | Metrics |
|---|---|---|
cpu_poll_seconds | 2.0 | CPU usage %, CPU temperature, and load average (1 / 5 / 15 min) |
gpu_poll_seconds | 0.0 | GPU temperature, usage %, and VRAM used/total. Disabled by default so a discrete GPU is not woken on laptops; the Control Center GPU card stays hidden until you set a non-zero interval. If you enable it, 5 seconds is a good interval - GPU stats rarely need sub-second sampling, and a short interval keeps the GPU busy |
memory_poll_seconds | 2.0 | RAM usage % and used/total MB |
network_poll_seconds | 3.0 | Network download and upload throughput |
disk_poll_seconds | 10.0 | Disk usage % for paths used by bar sysmon widgets with stat = "disk_pct", plus swap usage % and used/total MB |
CPU usage and CPU temperature share cpu_poll_seconds because both are tied to the same CPU sampling pass. GPU temperature, usage, and VRAM share gpu_poll_seconds. Swap and disk usage share disk_poll_seconds. Network Rx and Tx share network_poll_seconds because they come from the same /proc/net/dev read. The aggregate network values exclude loopback; bar and desktop sysmon widgets can set interface to an exact /proc/net/dev interface name to show only that interface.
Bar and desktop sysmon widgets in graph mode, plus the Control Center System graphs, scroll using the same cadence as the fastest poll interval above (the minimum of the enabled, non-zero intervals). There is no separate graph-only setting. If every metric is set to 0, no history is recorded and the graphs stop updating.
CPU temperature auto-detection prefers known CPU hwmon drivers such as k10temp, zenpower, and coretemp. On AMD systems this normally selects the Tctl sensor exposed as temp1_input. To force a specific sensor, set cpu_temp_sensor_path to the exact sysfs input file:
[system.monitor]cpu_temp_sensor_path = "/sys/class/hwmon/hwmon3/temp1_input"When cpu_temp_sensor_path is set, Noctalia uses only that file. If the path is missing, unreadable, not a temp*_input file, or cannot be parsed, CPU temperature is reported as unavailable until the configuration is fixed.
To list available hwmon temperature inputs with their driver names, labels, and raw values:
for h in /sys/class/hwmon/hwmon*; do name="$(cat "$h/name" 2>/dev/null || echo unknown)" for input in "$h"/temp*_input; do [ -e "$input" ] || continue base="${input%_input}" label="$(cat "${base}_label" 2>/dev/null || basename "$base")" value="$(cat "$input" 2>/dev/null || echo unreadable)" printf '%s name=%s label=%s raw=%s\n' "$input" "$name" "$label" "$value" donedoneAvailable stats
Section titled “Available stats”Bar and desktop sysmon widgets and the Control Center System tab all draw from the same sampling thread, so they share one catalog of stats. Each widget picks one with stat (desktop graphs take an optional second with stat2).
| Value | Display | Description | Bar | Desktop |
|---|---|---|---|---|
cpu_usage | 75% | CPU utilisation (all cores) | ✓ | ✓ |
cpu_temp | 65°C | CPU package temperature | ✓ | ✓ |
gpu_temp | 72°C | GPU temperature | ✓ | ✓ |
gpu_usage | 48% | GPU utilisation | ✓ | ✓ |
gpu_vram | 42% | GPU VRAM usage | ✓ | ✓ |
ram_used | 4.2 GiB | RAM used (binary, auto-scaled) | ✓ | — |
ram_pct | 26% | RAM used % | ✓ | ✓ |
swap_pct | 12% | Swap used % | ✓ | ✓ |
disk_pct | 45% | Disk used % for the widget’s path | ✓ | — |
net_rx | 1.2 MB/s | Network download speed (decimal, auto-scaled) | ✓ | ✓ |
net_tx | 256 kB/s | Network upload speed (decimal, auto-scaled) | ✓ | ✓ |
A stat whose source is unavailable on the machine - GPU VRAM on an integrated GPU, for example - is shown as unavailable rather than as zero. The GPU stats are also disabled by default: they report nothing until gpu_poll_seconds is set to a non-zero value, and what each GPU vendor can report is covered under GPU data sources.
The stats are read once and shared, but a few presentation options stay per widget, because two widgets showing the same stat may want to show it differently: path selects which mount disk_pct measures, and interface selects which kernel interface net_rx/net_tx measures (an exact name from /proc/net/dev such as wlan0 or enp5s0; empty means the total across all non-loopback interfaces). Both are documented with the widget settings.
GPU data sources
Section titled “GPU data sources”Noctalia reads GPU statistics straight from the kernel and from the vendor’s own management library where one exists. No elevated privileges and no external tool (nvidia-smi, intel_gpu_top, radeontop) are required.
| GPU | Temperature | Usage | VRAM |
|---|---|---|---|
| AMD | amdgpu hwmon | gpu_busy_percent | mem_info_vram_used / mem_info_vram_total |
| NVIDIA | NVML, hwmon otherwise | NVML | NVML |
| Intel | i915 / xe hwmon | per-client DRM statistics | xe device query |
On AMD, ROCm SMI is used instead of sysfs when the ROCm runtime is installed. On NVIDIA, NVML comes from the proprietary driver; on a hybrid laptop whose discrete GPU is asleep, NVML is skipped so the GPU is not woken, and the integrated GPU is reported instead.
Intel is the odd one out: it publishes no device-wide busy counter, so usage is summed from the per-client statistics the kernel exposes for each process using the GPU. Two consequences follow. Work done by other users’ processes is not counted, which is invisible on a normal single-user desktop. And usage needs two samples before it can report anything, so the first value appears one gpu_poll_seconds interval after startup.
Intel VRAM is reported only for discrete cards such as Intel Arc, and requires Linux 6.18 or newer — earlier kernels release the used-memory figure only to privileged processes, so Noctalia reports VRAM as unavailable rather than showing a permanent zero. Integrated Intel GPUs have no dedicated video memory and never report VRAM.
Value highlighting
Section titled “Value highlighting”Bar sysmon widgets tint their value (icon, text label, graph line, and gauge fill) toward the widget’s highlight_color as the stat rises. Each stat has an activity threshold and a critical threshold, configured globally under [system.monitor]:
[system.monitor]cpu_usage_activity_threshold = 50 # %cpu_usage_critical_threshold = 90 # %cpu_temp_activity_threshold = 60 # °Ccpu_temp_critical_threshold = 85 # °Cgpu_temp_activity_threshold = 60 # °Cgpu_temp_critical_threshold = 85 # °Cgpu_usage_activity_threshold = 50 # %gpu_usage_critical_threshold = 95 # %gpu_vram_activity_threshold = 50 # %gpu_vram_critical_threshold = 90 # %ram_pct_activity_threshold = 60 # %ram_pct_critical_threshold = 90 # %swap_pct_activity_threshold = 20 # %swap_pct_critical_threshold = 80 # %disk_pct_activity_threshold = 80 # %disk_pct_critical_threshold = 95 # %net_rx_activity_threshold = 1 # MB/snet_rx_critical_threshold = 50 # MB/snet_tx_activity_threshold = 1 # MB/snet_tx_critical_threshold = 50 # MB/sThe value’s color is interpolated between the widget’s regular foreground color (its color setting) and its highlight_color (set per widget - see the sysmon widget). Below the activity threshold the value stays at its regular color; the moment it crosses the activity threshold it jumps to a small highlight tint, then ramps the rest of the way to the full highlight_color, reaching it at or above the critical threshold. Set the critical threshold to 0 to disable highlighting for that stat.
| Key | Default | Unit | Stat |
|---|---|---|---|
cpu_usage_activity_threshold / cpu_usage_critical_threshold | 50 / 90 | % | CPU usage |
cpu_temp_activity_threshold / cpu_temp_critical_threshold | 60 / 85 | °C | CPU temperature |
gpu_temp_activity_threshold / gpu_temp_critical_threshold | 60 / 85 | °C | GPU temperature |
gpu_usage_activity_threshold / gpu_usage_critical_threshold | 50 / 95 | % | GPU usage |
gpu_vram_activity_threshold / gpu_vram_critical_threshold | 50 / 90 | % | GPU VRAM usage |
ram_pct_activity_threshold / ram_pct_critical_threshold | 60 / 90 | % | RAM usage (also ram_used) |
swap_pct_activity_threshold / swap_pct_critical_threshold | 20 / 80 | % | Swap usage |
disk_pct_activity_threshold / disk_pct_critical_threshold | 80 / 95 | % | Disk usage |
net_rx_activity_threshold / net_rx_critical_threshold | 1 / 50 | MB/s | Network download |
net_tx_activity_threshold / net_tx_critical_threshold | 1 / 50 | MB/s | Network upload |
The ram_used and ram_pct stats share the ram_pct_* thresholds, since both are driven by the same RAM usage percentage. You can also adjust every threshold in Settings → Services when the system monitor is enabled; each stat has a single dual-handle range slider - the left handle sets the activity threshold and the right handle the critical threshold, and the handles cannot cross, so the activity threshold can never exceed its critical threshold.