Skip to content

rldyour-sysinfo

CI

Low-overhead live system metrics from one Rust daemon on Linux, macOS and Windows. Linux has a GNOME Shell indicator, macOS has a native menu bar client, and every platform exposes the same versioned local JSON protocol.

The protocol also has a dependency-free Python client published as rldyour-sysinfo on PyPI. The Rust daemon is published as rldyour-sysinfod on crates.io.

The indicator in the top bar

Why it is two pieces

Platform UI processes stay deliberately thin. Collection, rate calculation and hardware access live in the Rust daemon; clients only decode one JSON line and render it. Linux and macOS use Unix domain sockets, while Windows uses its native AF_UNIX implementation available since Windows 10.

The split is not only a workaround. Under Wayland the shell cannot be restarted without logging out, so any change to extension code costs a session. Keeping the extension thin and stable, and putting everything that evolves into a daemon that restarts in milliseconds, is what makes the thing maintainable.

What the design deliberately avoids

  • No async runtime. One timer at 0.2 Hz does not pay for tokio or async-io. The daemon is one sleeping thread plus one accept thread.
  • No D-Bus stack. zbus spawns a thread per connection and its own executor. For pushing under two hundred bytes every five seconds, a plain UnixListener from the standard library costs nothing and depends on nothing.
  • No process scanning. Linux reads /proc and /sys directly. macOS uses Mach, BSD, IOKit, AppleSMC and IOHID. Windows refreshes system, component and network counters without constructing a process list.
  • No polling in the shell. The cadence belongs to the daemon; the extension only waits on the next line. It runs no timer while connected, which also removes the most common cause of leaks in shell extensions.

Cost

Measured on the development machine, resident private memory (Pss):

Configuration Pss Threads Binary
Daemon without GPU metrics ~0.6 MB 2 375 KB
Daemon with NVIDIA metrics ~19.6 MB 3 484 KB

The entire difference is NVML. The proprietary NVIDIA driver publishes no utilisation or temperature through procfs or sysfs and binds no hwmon node, so NVML is the only interface that answers, and it maps about nineteen megabytes of driver-side state. Set RLDYOUR_SYSINFO_GPU=0 in the service environment, or build with --no-default-features, and that cost disappears along with the GPU readings.

Platform support

Metric Linux macOS Windows
CPU load /proc/stat Mach host statistics Windows system counters
CPU temperature hwmon AppleSMC / IOHID hardware component provider
Memory and swap /proc/meminfo Mach VM statistics Windows memory counters
GPU load, memory, temperature NVIDIA NVML IOAccelerator and AppleSMC / IOHID NVIDIA NVML
Disk throughput /proc/diskstats IOKit storage statistics unavailable, reported as null
Network throughput /proc/net/dev BSD interface counters Windows network counters

Unsupported or unavailable hardware readings are always null. The daemon does not substitute estimates. NVIDIA metrics can be disabled at build time with --no-default-features.

Install on Linux

Requires Rust 1.85 or newer and GNOME Shell 46 (Ubuntu 24.04 LTS), 48, 49 or 50.

Ubuntu amd64 can install the signed package repository:

curl -fsSL https://nddev-opennetwork.github.io/rldyour-sysinfo/apt/rldyour-sysinfo.asc \
  | sudo tee /usr/share/keyrings/rldyour-sysinfo.asc >/dev/null
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/rldyour-sysinfo.asc] https://nddev-opennetwork.github.io/rldyour-sysinfo/apt stable main" \
  | sudo tee /etc/apt/sources.list.d/rldyour-sysinfo.list
sudo apt update
sudo apt install rldyour-sysinfo

The package installs the Rust daemon and its socket-activated user service. Install the GNOME indicator from the matching GitHub release asset.

./install.sh

This builds the daemon into ~/.local/bin, installs a socket-activated user service, and copies the extension into place. Nothing needs root.

The daemon starts on the first connection and stops again thirty seconds after the last client disconnects, so it consumes nothing while the extension is off.

Because Wayland cannot restart the shell in place, log out and back in, then:

gnome-extensions enable rldyour-sysinfo@nddev-opennetwork

To remove everything: ./uninstall.sh.

Install on macOS

Requires macOS 12 or newer, Rust 1.85 or newer and the Swift toolchain shipped with Xcode Command Line Tools.

./install-macos.sh

The installer builds the same Rust daemon with native Mach, BSD, IOKit and SMC readers, creates a small native menu bar app, and starts both with per-user LaunchAgents. It does not install or invoke a third-party monitor and needs no administrator privileges. Apple GPU load comes from IOAccelerator performance statistics; CPU and GPU temperatures come from read-only AppleSMC sensors with an IOHID temperature fallback on supported Apple silicon models.

Remove it with ./uninstall-macos.sh.

Install on Windows

Requires Windows 10 or newer and Rust 1.85 or newer. Run PowerShell as the current desktop user:

.\install-windows.ps1

This installs the daemon under %LOCALAPPDATA%\rldyour-sysinfo and starts it at login. Remove it with .\uninstall-windows.ps1. The Windows daemon publishes the same protocol; a native tray client is not part of version 0.2.0.

Configuration

Open the extension's preferences for what most people want to change:

  • Interval — seconds between readings, 1 to 60. The indicator asks the daemon for this cadence when it connects, and the daemon serves the fastest any connected client requested.
  • Panel — which of processor, memory, graphics and network appear in the top bar, and whether temperatures are shown beside them. The dropdown always lists everything regardless.

The daemon accepts these environment variables. On Linux they can be placed in ~/.config/systemd/user/rldyour-sysinfod.service; on macOS, add them to the daemon LaunchAgent's EnvironmentVariables dictionary.

Variable Default Meaning
RLDYOUR_SYSINFO_INTERVAL 5 Cadence when no client asks for one
RLDYOUR_SYSINFO_GPU unset Set to 0 to skip NVML entirely

Protocol

A client may open with a single line stating the cadence it wants, which the daemon honours within one to sixty seconds and otherwise ignores:

{"interval":5}

The daemon then sends one newline-terminated JSON object per tick. Every metric is always present; one the host cannot supply is null, so a client never distinguishes "missing" from "unsupported". v is incremented only on an incompatible change.

{"v":1,"cpu":{"usage":55.4,"temp":88.6},"memory":{"used":54.7,"swap":4.2},
 "gpu":{"usage":7.0,"memory":9.6,"temp":69.0},
 "disk":{"read":10628,"write":3789480,"temp":47.8},
 "net":{"rx":18360,"tx":342578}}

Percentages are per cent, temperatures are degrees Celsius, disk and network figures are bytes per second.

Python clients can use pip install rldyour-sysinfo; the command rldyour-sysinfo --once prints a single live sample from the local daemon.

Checks

./scripts/check-extension.sh                      # what CI runs for the extension
cd daemon && cargo test && cargo clippy --all-targets --all-features -- -D warnings
cd extension && gjs -m tests/smoke.js             # needs the daemon reachable
swiftc -typecheck macos/RldyourSysinfo.swift       # macOS menu client

scripts/check-extension.sh covers syntax, metadata, the settings keys the code actually reads, process isolation between the shell and preferences processes, and deprecated modules. It needs no running shell, which matters because Wayland gives no way to reload extension code without a new login.

Licence

AGPL-3.0-or-later.

Low-level macOS API precedents and dependency licences are recorded in THIRD_PARTY_NOTICES.md.

Note that this places the extension outside what extensions.gnome.org accepts: the portal requires every extension to be distributable under GPL-2.0-or-later, which AGPL-3.0 is not compatible with. The portal separately forbids shipping binaries, which this project needs. Distribution is therefore from this repository.

About

Lightweight system monitor for the GNOME top bar: Rust daemon + GJS extension. CPU, RAM, GPU, temperatures, disk and network at a glance, at near-zero cost.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages