Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GNOME Device Manager

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.

Overview page showing machine name, OS, CPU temperature and primary storage

Why

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.

Crate layout

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.

Build

cargo run --bin gnome-device-manager

System dependencies on Fedora:

sudo dnf install gtk4-devel libadwaita-devel systemd-devel pkg-config glib-build-tools

On Debian/Ubuntu:

sudo apt install libgtk-4-dev libadwaita-1-dev libudev-dev libglib2.0-dev pkg-config

Flatpak

flatpak-builder --user --install --force-clean build-dir \
    build-aux/flatpak/io.github.martinalderson.DeviceManager.yml

The 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.

Architecture

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.

Status

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 run on 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 --json shell-out)
  • Editable module parameters (writing to /sys/module/.../parameters/<x> needs root + polkit)
  • Interactive device-manager mode (disable/eject/rebind) — the gdm-actions trait is the slot for this; v1 ships NoopActions

Install

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.

License

MIT. See LICENSE.

About

GTK4 + libadwaita hardware profiler for the GNOME desktop. The macOS System Information equivalent for Linux.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages