A GTK4 + libadwaita hardware profiler for the GNOME desktop. Inspect the CPU, memory, GPUs, displays, storage, USB and PCI devices, network interfaces, Bluetooth devices, audio cards, sensors, battery, webcams and printers in your computer — with the kernel driver and firmware version surfaced for every device.
It does for Linux what macOS System Information does for macOS.
Big Hardware Info exists but is Python, ships inxi + Perl inside its
Flatpak, and is tied to the BigLinux distribution. Hardinfo is GTK3-feeling
and benchmark-centric. lshw-gtk is bare. This project aims at the gap: a
Flathub-ready, libadwaita-native, GNOME-HIG-conformant device profiler in
Rust, that talks to fwupd / UPower / UDisks2 / NetworkManager / BlueZ / udev
directly instead of shelling out to CLI tools.
See design/data-source-comparison.html for the full reasoning behind the
data-source choice, and design/ui-mockups.html for the visual direction.
crates/
gdm-data/ no GTK deps; one DeviceProvider per domain
gdm-actions/ extension point for a future interactive mode
gdm-app/ GTK4 + libadwaita binary
The boundary is enforced by the workspace: gdm-data cannot pull in GTK by
accident. Reuse it from a CLI or test harness without touching the UI layer.
cargo run --bin gnome-device-managerSystem dependencies on Fedora:
sudo dnf install gtk4-devel libadwaita-devel systemd-devel pkg-config glib-build-toolsOn Debian/Ubuntu:
sudo apt install libgtk-4-dev libadwaita-1-dev libudev-dev libglib2.0-dev pkg-configflatpak-builder --user --install --force-clean build-dir \
build-aux/flatpak/io.github.martinalderson.DeviceManager.ymlThe manifest uses --share=network for the cargo fetch during local builds.
For Flathub submission, vendor the dependencies with
flatpak-cargo-generator.py
and remove the network-share build arg.
Each device domain implements gdm_data::DeviceProvider:
#[async_trait]
pub trait DeviceProvider: Send + Sync {
fn kind(&self) -> DeviceKind;
async fn enumerate(&self) -> Result<Vec<Device>, Error>;
fn watch(&self) -> Option<broadcast::Receiver<LiveUpdate>> { None }
}UI pages are constructed by two scaffolds:
pages::scaffold::single_device— one device per domain (CPU, Memory, Battery)pages::scaffold::master_detail— many devices per domain (USB, PCI, Storage, Network, Bluetooth, Displays, Audio, Webcams, Printers, Sensors, GPU)
Both spawn enumerate() on a global tokio runtime via
runtime::handle().spawn(...), await the JoinHandle on glib's main loop with
glib::spawn_future_local, then update widgets on the GTK thread.
The FwupdService queries fwupd's GetDevices after each enumeration and
annotates devices whose sysfs paths match — firmware versions appear in the
shared Driver / Firmware card on every device-detail page.
Working today (v0.2):
- All 15 sidebar sections (Overview + 14 device domains) implemented end-to-end
- Refresh button per page
- Overview with system summary + 4 highlight cards
- Rich driver info per device, in the spirit of Windows Device Manager:
- kernel module + version + license + description + author
- module file path, dependencies, modules using it, signer + signing key
- module parameters (current runtime values from
/sys/module/.../parameters/) - required firmware blobs declared by the driver (collapsed expander for long lists)
- PCI resources: IRQ + memory BARs + I/O port ranges
- Power management: runtime status, time active vs suspended
- Light + dark themes
- Native window via
cargo runon the host
Deferred / planned:
- Per-DIMM memory detail (needs root, planned via small pkexec helper)
- v4l2 capability enumeration for webcams
- Live sensors view with sparklines and 1-second polling
- SMART for storage drives (
smartctl --jsonshell-out) - Editable module parameters (writing to
/sys/module/.../parameters/<x>needs root + polkit) - Interactive device-manager mode (disable/eject/rebind) — the
gdm-actionstrait is the slot for this; v1 shipsNoopActions
Pre-built binaries for x86_64 Linux are published on the
Releases page.
Download the tarball, extract, and run ./install.sh (installs to
~/.local/bin and registers the .desktop file under your user). The binary
links against system GTK4, libadwaita, glib and libudev — Fedora 41+ /
Ubuntu 24.10+ / Arch should already have everything; older distros may need a
rebuild from source.
MIT. See LICENSE.
