A native GTK4 / libadwaita desktop app for liquidctl — monitor liquid temperature, pump and fan speeds, edit fan curves, and control RGB lighting from a proper GNOME app instead of the command line.
Hardware compatibility notice. This app was built and tested against one specific device: a Corsair iCUE H150i Elite RGB White (Hydro Platinum) AIO, alongside an ASUS Aura LED Controller. liquidctl supports many more devices, and the driver-family detection in this app is a best-effort guess for those — it has not been verified against them. If you own a different pump/fan hub, it's worth trying, but expect rough edges (a curve tab that doesn't apply, a sensor that doesn't show up) until someone tests and fixes it for that specific device.
![]() |
![]() |
| Dashboard | Curves |
![]() |
![]() |
| Lighting | Profiles |
- Dashboard — live liquid temperature, pump and fan RPM/duty for the selected device, plus a discreet bottom bar with host CPU temperature and a per-fan RPM/duty breakdown (both fully dynamic: shows your actual CPU model and however many fans your device reports, wraps to a second line instead of overflowing on a narrow window).
- Curves — a draggable temperature × duty graph per channel (add/remove points, presets, or freehand). Falls back automatically to host-side polling for devices whose driver doesn't support hardware speed profiles.
- Pump mode — for devices without continuous pump duty control (like the Hydro Platinum family), a simple quiet/balanced/extreme switch instead of a curve that wouldn't apply.
- Lighting — off/static/breathing/pulse/spectrum, plus per-LED effects for devices with more than one individually-addressable LED (e.g. the Hydro Platinum family's pump-head ring): Rainbow, Comet, Wave and Police Lights (with direction, speed and — for Police — two independently-picked colors), and a Reactive mode that shifts green → yellow → red with the live liquid temperature. A quick color palette plus a native GNOME color picker, brightness and animation speed round it out. Animated modes are driven host-side when the hardware itself has no on-device animation support.
- Profiles — save/apply/delete named bundles of fan+pump curves.
- Per-device enable/disable — in Settings, turn off any detected device you don't want this app touching at all (it's never connected to or initialized). Handy if, say, you only want it managing your cooler and not another RGB controller on the same system.
- Clear hardware-limit messaging — every page tells you plainly when the active device can't do something, instead of silently doing nothing or showing controls that don't work: Curves, Lighting and Profiles each show a specific explanation (e.g. "this device has RGB lighting, but its protocol isn't supported by this app yet"), and applying a profile warns if part of it (pump or fan) couldn't be applied to the selected device.
- Tray — closing the window keeps the app running in the background (curves need a live process to keep re-applying, since liquidctl itself has no daemon) until you quit from the tray menu. Uses a symbolic (theme-matched, monochrome) tray icon like other well-behaved GNOME apps.
- Start with the system — an optional autostart entry that launches straight into the tray, no window popping up on login.
- Self-healing fan duty validation — some multi-fan coolers can occasionally desync a fan's duty from the rest on a firmware-level hiccup (confirmed on the Hydro Platinum's 3-fan variant). Right after applying a curve, the app double-checks quickly a few times until every fan actually matches it; once settled, it switches to a slower steady check so it isn't hammering the device forever. That steady interval is configurable in Settings — higher values use less CPU/USB traffic, lower values catch a glitch faster.
- Locale-aware — Portuguese (
pt_BR) if that's your system locale, English everywhere else. - Remembers window size, sidebar width, theme and default device between launches.
- Python 3.10+
- GTK4 + libadwaita via PyGObject
- liquidctl — used as a library, not shelled out to
- AyatanaAppIndicator3 for the tray icon (runs in a small GTK3 helper subprocess, since GTK3
and GTK4 can't share a process and the tray menu API requires a GTK3
Gtk.Menu) - gettext for translations
- No external UI/charting libraries — the curve editor is a
Gtk.DrawingAreadrawn with Cairo
git clone https://github.com/weversonl/liquidctl-gtk
cd liquidctl-gtk
./install.shThis creates an isolated virtualenv under ~/.local/share/liquidctl-gui, installs a
liquidctl-gui launcher to ~/.local/bin, and registers the app + icon with GNOME (so it shows
up in the app grid). Remove everything later with ./install.sh --uninstall (your saved
curves/settings in ~/.config/liquidctl-gui are left alone).
Dependencies the installer expects to already be on your system (installed via your distro's
package manager): GTK4, libadwaita, PyGObject, liquidctl's udev rules (installing the
liquidctl package on most distros, e.g. Arch, sets these up for you — otherwise see
liquidctl's udev docs), the
AyatanaAppIndicator3 introspection bindings, and gettext.
python -m venv .venv --system-site-packages
source .venv/bin/activate
pip install -e .
python -m liquidctl_guiSee docs/ARCHITECTURE.md for the module map, threading model, and where each feature lives.
GPL-3.0-or-later, matching liquidctl's own license.



