Linux-native control app for ASUS ROG laptops, built as a Rust workspace with a GTK/libadwaita UI, a user-session daemon, a provider layer for DBus/sysfs/procfs integration, and a diagnostics CLI.
This repository was reviewed and its markdown docs were refreshed against the current source code. When documentation and source disagree in the future, prefer the implementation in crates/ and update the docs.
rog-helper is designed to provide a single Linux-native control surface for ASUS laptop features that are otherwise split across multiple services and system interfaces. Packaged installs also include an optional, PolicyKit-gated root helper for a small set of typed hardware writes; the UI and session daemon remain unprivileged.
The current codebase implements:
- A GTK4/libadwaita desktop application with tray support via
ksni - A session-DBus daemon (
rog-helperd) that owns current state and control actions - Provider modules for
asusd,supergfxd,UPower,hwmon, CPU sysfs, keyboard backlight sysfs, battery sysfs, memory telemetry, DBus diagnostics, and setup-readiness checks - A CLI (
rog-helper) for diagnostics and environment inspection
The project is clearly beyond an initial scaffold, but it is still an early implementation. Several core features are working today, while other planned features are still missing or only partially modeled.
The current runtime architecture is:
UI / tray
-> session DBus (`io.github.roghelper.Daemon`)
-> rog-helperd
-> providers / system DBus (`asusd`, `supergfxd`, `UPower`)
-> direct user-writable sysfs when safe
-> optional system DBus + PolicyKit -> rog-helper-privileged
-> approved sysfs ABI or root-only /dev/rog-helper-aura
High-level responsibilities:
rog-ui: unprivileged GTK/libadwaita UI and trayrog-daemon: user-session daemon, state owner, telemetry aggregator, and control routerrog-providers: DBus/sysfs/procfs integration layerrog-core: shared domain model, validation, and policy typesrog-cli: diagnostics and probing toolrog-privileged: on-demand root service with path-free CPU, verified fan, keyboard-brightness, battery-threshold, and allow-listed Aura-effect methods
See docs/ARCHITECTURE.md for the current runtime architecture.
Start with docs/QUICK_START.md for the shortest path to:
- running the daemon, UI, and diagnostics CLI from source
- finding the main source files by feature area
- choosing the right user or developer document
crates/rog-core- Shared domain types, validation, errors, and policy model
- No hardware or DBus I/O
crates/rog-providers- Provider modules for
asusd,supergfxd,UPower,hwmon, CPU controls, keyboard backlight, power-supply sysfs, memory telemetry,nvidia-smi, and DBus inspection helpers
- Provider modules for
crates/rog-daemonrog-helperdsession daemon and DBus service
crates/rog-uirog-helper-uiGTK4/libadwaita desktop application and tray
crates/rog-clirog-helperdiagnostics CLI
crates/rog-privileged- Optional root system service; callers never provide paths, commands, programs, or raw hardware payloads
Basic packaging assets are also included under packaging/:
packaging/systemd-user/rog-helperd.servicepackaging/systemd-system/rog-helper-privileged.servicepackaging/dbus-system/packaging/polkit/io.github.roghelper.policypackaging/desktop/rog-helper.desktoppackaging/dbus-session/io.github.roghelper.Daemon.servicepackaging/metainfo/io.github.roghelper.UI.metainfo.xmlpackaging/arch/PKGBUILDpackaging/arch/.SRCINFOpackaging/arch/rog-helper.installpackaging/flatpak/io.github.roghelper.UI.ymlpackaging/flatpak/cargo-sources.jsonpackaging/flatpak/flathub.jsonpackaging/flatpak/README.md- generated-on-demand hicolor PNG icon set under
packaging/desktop/icons/hicolor/ packaging/scripts/build-deb.shpackaging/scripts/build-rpm.shpackaging/scripts/build-flatpak.shpackaging/scripts/stage-apt-repo.shpackaging/scripts/build-tarball.shpackaging/scripts/build-appimage.shpackaging/scripts/build-release-assets.shpackaging/scripts/generate_icons.py
Branding source of truth:
assets/logo.png
Current source-backed features include:
- Telemetry dashboard with CPU temperature, GPU temperature, battery, power source, fans, and warnings
- CPU telemetry and generic Linux CPU controls
- physical-core count and logical-thread count
- per-logical-CPU / thread usage, frequency, policy, and online/offline state
- turbo boost
- power mode
- governor
- energy performance preference
- min/max frequency limits
- per-logical-CPU online/offline toggles
- structured diagnostics for
available,unsupported,missing_backend,permission_denied, andtemporarily_unavailablewrite states
- GPU mode read/write through
supergfxd - ASUS performance profile read/write through
asusd - ASUS battery charge limit read/write through
asusd - Keyboard backlight brightness read/write through sysfs when permissions allow
- Capability-aware unavailable/read-only UX that keeps controls visible and explains common missing-backend or permission-blocked states
- Dedicated Setup & Access UI plus
rog-helper setup-check, backed by live API verification and read-only permission probes - Fan monitoring and safe fan controls for supported ASUS/Linux hardware
- polished RPM monitoring dashboard with animated fan rotors, larger CPU/GPU gauges, and best-effort operating MHz display
- best-effort dynamic RPM telemetry for 0..N fans
- verified eight-point ASUS WMI fan curves with direct or PolicyKit-gated writes
- Auto/BIOS restore and curve sync when the exact ASUS device identity and channel mapping are confirmed
- generic PWM, RPM-target, and boost candidates remain disabled even when a file appears writable
- Battery, power, health, and time estimates from
UPowerwith sysfs fallback for additional details - RAM, swap, PSI, zram, zswap, and top memory process telemetry
- Diagnostics UI and diagnostics CLI
- About page update/support section with manual GitHub release checks, release-note preview, source/support links, and issue-reporting action
- Limited UI lifecycle preferences for close-to-tray behavior, launch-on-login autostart, and start-minimized-to-tray behavior
- Official
rog-helperlogo wired into desktop packaging, launcher metadata, tray/window icon naming, and packaging scripts - Session DBus API for the UI and other local clients
- Optional typed privileged fallback with separate CPU, fan, lighting, and battery PolicyKit actions; direct/asusd/supergfxd routes remain preferred
- ASUS Aura lighting through an exact asusd 6.3.8-6.4.0 DBus adapter or the single allow-listed G615JMR target mapping (DMI prefix
G615JM); sysfs remains brightness-only - Lighting UI 2.0 with capability-driven effects, validated hex colour fields and swatches, a keyboard-shaped local preview, Current/Pending state, local Reset, and dirty-only Apply; authentication is requested only when Apply needs the typed privileged route
rog-helper privileged-statusreports both daemon/helper compatibility and the installed binary, D-Bus, systemd, PolicyKit, udev, Aura alias, descriptor, and protocol readiness
See:
- docs/FEATURE_MATRIX.md
- docs/DBUS_API.md
- docs/DBUS_CONTRACT_MAP.md
- docs/PROVIDER_MATRIX.md
- docs/UI_PAGES.md
- docs/PRIVILEGED_SECURITY_REVIEW.md
Important gaps in the current implementation:
- Broader fan-control contracts beyond the verified ASUS WMI eight-point curve ABI
- Broader Aura/RGB lighting validation across ASUS models and asusd versions; the native HID implementation is deliberately limited to the G615JMR target identity and has not yet been physically validated through ROG Helper
- Live auto mode / policy automation integration
- Persistent hardware/control configuration and saved automation rules beyond the current UI lifecycle preferences
- Generated strongly typed external DBus payloads (the current backwards-compatible
a{sv}API now shares internal key constants and decoding semantics) - Complete tested hardware support matrix
- Broader cross-distro install validation, including wider AppImage runtime validation beyond the current Ubuntu-class release host
Some related domain types and traits already exist in rog-core and rog-providers, but they are not fully wired into runtime behavior yet.
Hardware support note:
- unless a real machine record has been added under the hardware-validation docs, treat support for that machine or scenario as untested rather than validated
- Rust stable via
rustup - GTK4 development packages
- libadwaita development packages
pkg-config
Ubuntu/Debian example:
sudo apt-get update
sudo apt-get install -y build-essential pkg-config libgtk-4-dev libadwaita-1-devcargo build --workspaceStart the daemon first:
cargo run -p rog-daemonStart the UI in another terminal:
cargo run -p rog-uiOptional CLI diagnostics:
cargo run -p rog-cli -- services
cargo run -p rog-cli -- dbus --filter "asus|rog|aura|kbd|keyboard|led|rgb|supergfx|power|upower"
cargo run -p rog-cli -- caps
cargo run -p rog-cli -- lighting-diagnosticsTagged releases now ship Linux release assets instead of source-only tags:
.debpackages for Debian/Ubuntu-style installs.rpmpackages for Fedora-family installs- portable
x86_64AppImages for direct download-and-run use - prefix-friendly Linux tarballs for
/usr/local - direct
rog-helper,rog-helperd, androg-helper-uibinaries for advanced user-local installs and the UI updater - SHA256 checksum files for every published asset
See docs/BUILD.md for the current install paths and packaging commands.
Direct .deb install:
sha256sum -c rog-helper-0.3.1-SHA256SUMS.txt --ignore-missing
sudo apt install ./rog-helper_0.3.1_amd64.deb
rog-helper privileged-statusNo manual systemd, D-Bus, PolicyKit, udev, device-permission, or daemon setup is required.
Launching rog-helper-ui activates the unprivileged session daemon on demand. The package
manager installs and refreshes the root-owned integration during the single APT transaction.
The Debian-family package installs:
rog-helper-ui,rog-helperd, androg-helperunder/usr/bin- the desktop launcher under
/usr/share/applications - hicolor icons under
/usr/share/icons/hicolor - AppStream metadata under
/usr/share/metainfo - session D-Bus activation under
/usr/share/dbus-1/services - the user service under
/usr/lib/systemd/user - the root-owned
rog-helper-privilegedbinary under/usr/libexec, plus its systemd, system-D-Bus, PolicyKit, and root-only Aura udev integration
Developers building from this checkout can use the normal-user, one-command flow documented in docs/DEVELOPER_INSTALL.md.
Remove cleanly with:
sudo apt remove rog-helper
systemctl --user daemon-reloadDirect .rpm install:
sha256sum -c rog-helper-0.3.1-RPM-SHA256SUMS.txt --ignore-missing
sudo dnf install ./rog-helper-0.3.1-1.x86_64.rpmOptional user-session daemon enablement:
systemctl --user daemon-reload
systemctl --user enable --now rog-helperd.serviceThe Fedora RPM installs:
rog-helper-ui,rog-helperd, androg-helperunder/usr/bin- the desktop launcher under
/usr/share/applications - hicolor icons under
/usr/share/icons/hicolor - AppStream metadata under
/usr/share/metainfo - session D-Bus activation under
/usr/share/dbus-1/services - the user service under
/usr/lib/systemd/user
Remove cleanly with:
sudo dnf remove rog-helper
systemctl --user daemon-reloadThis repository ships a source-based PKGBUILD under packaging/arch/.
Build and install it directly from a repository checkout:
git clone https://github.com/UdayaSri0/g-helper-linux.git
cd g-helper-linux/packaging/arch
makepkg -siOptional user-session daemon enablement:
systemctl --user daemon-reload
systemctl --user enable --now rog-helperd.serviceThe Arch package installs:
rog-helper-ui,rog-helperd, androg-helperunder/usr/bin- the desktop launcher under
/usr/share/applications - hicolor icons under
/usr/share/icons/hicolor - AppStream metadata under
/usr/share/metainfo - session D-Bus activation under
/usr/share/dbus-1/services - the user service under
/usr/lib/systemd/user
If an AUR package repository is published later, package helpers such as yay
or paru can install it. This repository already includes AUR-ready
PKGBUILD, .SRCINFO, and install-hook metadata, but it does not publish to
the AUR automatically today.
This repository ships a local Flatpak manifest under packaging/flatpak/.
Build and install it from a repository checkout:
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
ROG_HELPER_FLATPAK_INSTALL=1 packaging/scripts/build-flatpak.sh
flatpak run io.github.roghelper.UIThe Flatpak bundles:
rog-helper-ui,rog-helperd, androg-helperunder/app/bin- a Flatpak-specific desktop file and AppStream metadata under
/app/share - both
rog-helperandio.github.roghelper.UIicon names under the hicolor theme - a session D-Bus activation file for the bundled
rog-helperd
Flatpak runtime notes:
rog-helperdruns inside the sandbox and is activated on the session bus; the hostsystemd --userunit is not installed or enabledUPower,asusd, andsupergfxdaccess is requested through specific system D-Bus permissions, but the host services still have to be installed and may still reject sandboxed callers- direct sysfs writes are not available in Flatpak, so CPU tuning, per-core toggles, and keyboard-backlight writes remain unavailable or read-only
- procfs-backed per-process diagnostics are limited to processes visible inside the sandbox
- the
nvidia-smifallback is not expected to work inside the sandbox - tray integration may still be limited on hosts that require extra StatusNotifier D-Bus ownership
If a Flathub publication is added later, the end-user install path would become
flatpak install flathub io.github.roghelper.UI, but that repository is not
live today.
A signed APT repository is not live yet.
The repository is now future-ready for static hosting through the staging helper at packaging/scripts/stage-apt-repo.sh, which generates pool/, Packages, Packages.gz, and Release metadata for a preview repository.
When a signed repository is published later, the install flow will look like this:
# placeholder only: do not use until a real repository URL and signing key are published
deb [signed-by=/usr/share/keyrings/rog-helper-archive-keyring.gpg] https://<future-host>/ stable main
sudo apt update
sudo apt install rog-helper
Download the AppImage and verify it before first run:
sha256sum -c rog-helper-0.3.1-SHA256SUMS.txt --ignore-missing
chmod +x rog-helper-v0.3.1-x86_64.AppImage
./rog-helper-v0.3.1-x86_64.AppImageThe AppImage bundles:
rog-helper-uirog-helperdrog-helper- the desktop launcher, icon assets, AppStream metadata, and session D-Bus activation files needed inside the portable bundle
Important AppImage notes:
- the AppImage cannot safely install the root helper, system D-Bus policy, PolicyKit policy,
systemd system service, or Aura udev rule; privileged hardware features require separately
installed system integration, so the
.debis the recommended full-featured format - the AppImage does not install itself into the system menu or enable desktop integration automatically
- the bundled
rog-helperd.serviceunit is included for reference, but it is not installed or enabled by running the AppImage - the AppImage updates the session environment so the bundled D-Bus activation file can find
rog-helperd, but if you want persistent login-session integration, prefer the.debpackage
Useful commands for local development:
cargo fmt --all -- --check
cargo build --workspace
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warningsImportant note: the repository CI expects fmt, build, clippy, tests, and packaging smoke tests to pass. If local results differ, compare against .github/workflows/ci.yml.
Tagged release packaging is driven by .github/workflows/release.yml.
The application can launch without all external services, but feature availability depends on what is installed and reachable:
UPower: expected for battery and power-source telemetryasusd: required for ASUS platform profile control and preferred for battery limits; Aura is accepted only for the exact 6.3.8-6.4.0xyz.ljones.Auracontractsupergfxd: required for GPU mode control- Writable sysfs access: required for some CPU and keyboard-backlight operations
- Tray support: depends on desktop support for StatusNotifierItem / AppIndicator integration
When these dependencies are missing or read-only, the UI is expected to degrade gracefully instead of crashing.
Current release behavior to expect:
- missing
asusd-> profile and charge-limit controls stay visible but explain thatasusdis required - asusd without the verified Aura contract -> the daemon may select the allow-listed native G615JMR target backend; otherwise RGB stays disabled while brightness-only sysfs support remains available
- missing
supergfxd-> GPU mode controls stay visible but explain thatsupergfxdis required - readable-but-not-writable CPU sysfs -> CPU telemetry still works, writes become read-only, and Diagnostics lists the blocked paths
- readable-but-not-writable keyboard backlight sysfs -> current brightness can still be shown while writes remain unavailable
- dynamic fan telemetry -> the UI adapts to the detected fan set instead of assuming a fixed one-fan or two-fan layout
- update checks are manual and UI-side; in-place replacement is attempted only for safe user-local direct-binary installs and otherwise falls back to the latest release page
Start here:
User docs:
- docs/BUILD.md
- docs/TROUBLESHOOTING.md
- docs/PERMISSIONS.md
- docs/FEATURE_MATRIX.md
- docs/UI_PAGES.md
- docs/HARDWARE_SUPPORT.md
- docs/HARDWARE_VALIDATION_TEMPLATE.md
Developer docs: