{"id":50720195,"url":"https://github.com/davidboulay/openkraken","last_synced_at":"2026-06-09T23:01:58.312Z","repository":{"id":362152143,"uuid":"1257594247","full_name":"davidboulay/OpenKraken","owner":"davidboulay","description":"Linux control center for NZXT Kraken AIO coolers — monitoring, fan/pump curves, LCD control, and RGB lighting via a reverse-engineered protocol. Not affiliated with NZXT.","archived":false,"fork":false,"pushed_at":"2026-06-02T21:54:53.000Z","size":14818,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-02T23:16:35.046Z","etag":null,"topics":["aio","cooling","kraken","linux","liquidctl","nzxt","pyqt6","rgb"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davidboulay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-02T20:36:56.000Z","updated_at":"2026-06-02T21:54:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/davidboulay/OpenKraken","commit_stats":null,"previous_names":["davidboulay/openkraken"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/davidboulay/OpenKraken","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidboulay%2FOpenKraken","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidboulay%2FOpenKraken/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidboulay%2FOpenKraken/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidboulay%2FOpenKraken/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davidboulay","download_url":"https://codeload.github.com/davidboulay/OpenKraken/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidboulay%2FOpenKraken/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34129072,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aio","cooling","kraken","linux","liquidctl","nzxt","pyqt6","rgb"],"created_at":"2026-06-09T23:01:57.570Z","updated_at":"2026-06-09T23:01:58.288Z","avatar_url":"https://github.com/davidboulay.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenKraken\n\n*A native Linux desktop app for NZXT Kraken liquid coolers — monitor, tune curves, and drive the LCD without rebooting into Windows.*\n\nA Linux clone of **NZXT CAM** for the **NZXT Kraken 2024 Elite RGB** all-in-one\nliquid cooler, built with **PyQt6** on top of [**liquidctl**](https://github.com/liquidctl/liquidctl).\n\nNZXT does not ship CAM for Linux. OpenKraken gives you a native desktop app to\nmonitor your loop, drive pump/fan curves that run in the cooler's own firmware,\nand push live sensor screens, images, and GIFs to the round LCD — without\nrebooting into Windows.\n\n\u003e Status: early but functional (`0.1.0`). Targets the Kraken 2024 Elite RGB\n\u003e (USB `1e71:3012`) but works with any `KrakenZ3`-class cooler liquidctl supports.\n\n## Screenshots\n\nA rendered sensor screen running on the cooler's round LCD:\n\n![OpenKraken sensor screen on an NZXT Kraken 2024 Elite](docs/images/cooler.png)\n\n| Dashboard | Cooling |\n| --- | --- |\n| ![Dashboard](docs/images/dashboard.png) | ![Cooling curves](docs/images/cooling.png) |\n| **LCD** | **Lighting** |\n| ![LCD control](docs/images/lcd.png) | ![RGB lighting](docs/images/lighting.png) |\n\n\u003e The AMD / NVIDIA marks on the LCD sensor screen are user-supplied logo files\n\u003e (see *Custom vendor logos* above); OpenKraken ships none.\n\n## Features\n\n- **Live dashboard** — circular gauges for CPU/GPU/liquid temperature, pump and\n  fan RPM, plus scrolling time-series graphs (selectable metrics, 1m/5m/10m\n  windows).\n- **Cooling control** — Silent / Balanced / Performance presets, fully editable\n  pump and fan **curves** (drag-to-edit), or a flat fixed duty. Curves can track\n  **liquid**, **CPU**, or **GPU** temperature.\n  - **Liquid-temp curves run inside the cooler's firmware** and keep working\n    even after OpenKraken is closed.\n  - **CPU/GPU-temp curves** are driven by the app each tick, with a firmware\n    failsafe baked in so a crashed app can never cook the loop.\n- **LCD screen control** for the 640×640 round display:\n  - Firmware liquid-temp screen\n  - Live **sensor screens** rendered on the host and uploaded over USB\n    (multiple styles), with a configurable liquid-ring colour and\n    auto-detected CPU/GPU **vendor badges** (AMD / Intel / NVIDIA)\n  - **Static images** and **animated GIFs**\n  - Brightness, orientation (0/90/180/270°), and a software \"off\"\n\n  *Custom vendor logos:* the sensor screens show a stylised vendor wordmark by\n  default. To use official logo artwork instead, drop your own RGBA PNGs at\n  `~/.config/openkraken/logos/{amd,intel,nvidia}.png` — OpenKraken ships no\n  trademarked logos.\n- **RGB lighting** (off by default) for the 24-LED pump ring and the bundled\n  RGB Core fan chain: solid colours plus host-streamed Breathing / Color cycle /\n  Spectrum effects, with per-channel brightness. The wire protocol was\n  reverse-engineered by the community (liquidctl PR #882 / OpenRGB) since NZXT\n  ships no public spec; effects stream from the app at the device's ~1 frame/s\n  ceiling. See the [FAQ](#faq) for the caveats.\n- **System tray** with quick profile switching and close-to-tray.\n- **Persistent config** at `~/.config/openkraken/config.json`.\n\n## Requirements\n\n- Linux (developed on **Pop!_OS / COSMIC / Wayland**; works on GNOME and others).\n- **Python ≥ 3.10** (3.12 recommended).\n- **PyQt6 ≥ 6.4** — best installed from your distribution (e.g.\n  `sudo apt install python3-pyqt6` on Debian/Ubuntu/Pop!_OS). `setup.sh` will\n  fall back to installing PyQt6 from PyPI into the venv if no system package is\n  found.\n- **liquidctl ≥ 1.15** with support for your device. The Kraken 2024 Elite RGB\n  (`1e71:3012`) needs a build that knows that USB id; `setup.sh` checks and, if\n  necessary, upgrades liquidctl from upstream automatically.\n- **Pillow ≥ 9** (for LCD rendering) — installed automatically.\n- A C-less install: there are **no compiled extensions** in this project itself.\n\n## Install\n\n```sh\ngit clone https://github.com/davidboulay/OpenKraken openkraken\ncd openkraken\n./setup.sh\n```\n\n`setup.sh` is idempotent and:\n\n1. Creates `.venv/` with `--system-site-packages` (so the system PyQt6 is\n   visible).\n2. Installs the project (`pip install -e .`) and its dependencies.\n3. Verifies the liquidctl driver supports your Kraken (upgrades from the\n   upstream git repo if `0x3012` is missing).\n4. Verifies PyQt6 is importable (installs it into the venv if not).\n5. Installs an `openkraken.desktop` launcher into\n   `~/.local/share/applications/` with absolute `Exec`/`Icon` paths.\n\n## Run\n\nFrom a terminal:\n\n```sh\n.venv/bin/openkraken\n```\n\nOr launch **OpenKraken** from your application menu.\n\nFlags:\n\n| Flag             | Effect                                  |\n| ---------------- | --------------------------------------- |\n| `--minimized`    | Start hidden (in the tray, or in the background without one) |\n| `--config PATH`  | Use an alternate config file            |\n| `--debug`        | Verbose (DEBUG-level) logging           |\n| `--version`      | Print version and exit                  |\n\n### Autostart on login\n\nBecause curves can run autonomously in the cooler's firmware you often don't\nneed the app running, but if you want monitoring or CPU/GPU-temp curves at\nlogin:\n\n- **COSMIC / GNOME / most desktops:** drop a copy of the launcher into the\n  autostart directory:\n\n  ```sh\n  mkdir -p ~/.config/autostart\n  cp ~/.local/share/applications/openkraken.desktop ~/.config/autostart/\n  # optionally start hidden in the tray:\n  sed -i 's|openkraken$|openkraken --minimized|' ~/.config/autostart/openkraken.desktop\n  ```\n\n## GNOME / other desktops\n\nOpenKraken works on stock GNOME, KDE, COSMIC, and others. The one thing that\ndiffers between desktops is the **system tray**:\n\n- **With a tray** (KDE, COSMIC's panel applet, GNOME *with* the\n  [AppIndicator/KStatusNotifierItem extension](https://extensions.gnome.org/extension/615/appindicator-support/)),\n  you get the tray icon, quick profile switching, and close-to-tray.\n- **Without a tray** (stock GNOME ships none by default), the app still keeps\n  your cooling and lighting active when you close the window:\n  - **Closing the window hides it** and leaves the control engine running in the\n    background (so CPU/GPU-temp curves and sensor LCD screens keep updating).\n    This is the **\"Keep running in background when closed\"** option on the\n    Settings page (enabled by default; ignored when a tray is present, where\n    *close to tray* applies instead).\n  - **Relaunch OpenKraken** — from the application menu, the launcher, or\n    `.venv/bin/openkraken` — to **reopen the window**. A second instance does not\n    start; it just raises the running one (single-instance via a per-user socket\n    at `openkraken-$UID`).\n  - **`Ctrl+Q` quits** the app entirely (stops the engine and exits). Without a\n    tray this is the discoverable way to fully quit; you can also kill the\n    process.\n\nIf you only ever rely on **liquid-temp curves** (which run inside the cooler's\nfirmware), you do not need the app running at all after applying them once.\n\n### Wayland note\n\nPyQt6 at this project's floor (**≥ 6.4**, the version `setup.sh`/`pip` install\nand the one shipped on the target system) bundles the Qt **Wayland** platform\nplugin, so the app runs natively on Wayland sessions. If the Wayland plugin is\nmissing, Qt falls back to **XWayland**, which is harmless — the only visible\ndifference is that window raising on relaunch is a *request* the compositor may\nhonour or queue, per Wayland's focus-stealing policy.\n\n## Permissions\n\nliquidctl talks to the cooler over raw USB HID (`/dev/hidraw*` / the USB device\nnode). To use it **without root**, your user needs write access to the device.\nOn this machine that already works. **`setup.sh` checks this for you**: it probes\nfor an NZXT (`1e71`) `hidraw` node and, if one is present but not read/writable by\nyour user, *offers* to install the udev rule below (it never fails setup if you\ndecline, and stays silent when run non-interactively).\n\nTo add the rule **manually**, create `/etc/udev/rules.d/70-openkraken.rules`:\n\n```udev\n# NZXT devices (incl. Kraken 2024 Elite RGB, 1e71:3012) — accessible to plugdev\nSUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"1e71\", TAG+=\"uaccess\", MODE=\"0660\", GROUP=\"plugdev\"\n```\n\nThen reload and re-plug (or reboot):\n\n```sh\nsudo udevadm control --reload-rules\nsudo udevadm trigger\nsudo usermod -aG plugdev \"$USER\"      # only if you rely on the plugdev fallback\n```\n\nThe `TAG+=\"uaccess\"` line is usually enough on systemd-logind desktops; the\n`plugdev` group is a fallback for systems without logind seat management.\n\n## Supported devices\n\nAny `KrakenZ3`-class cooler that liquidctl recognises. LCD size and speed\nchannels are detected automatically from the driver:\n\n| Model                         | USB id        | LCD       |\n| ----------------------------- | ------------- | --------- |\n| Kraken Z53 / Z63 / Z73        | `1e71:3008`   | 320×320   |\n| Kraken 2023                   | `1e71:300e`   | 240×240   |\n| Kraken 2023 Elite             | `1e71:300c`   | 640×640   |\n| **Kraken 2024 Elite RGB**     | `1e71:3012`   | 640×640   |\n| Kraken 2024 Plus              | `1e71:3014`   | 240×240   |\n\nThe non-LCD Kraken X-series and other NZXT coolers are out of scope (no screen).\n\n## FAQ\n\n**Does it control the RGB lighting?**\nYes — but it's **off by default**, and you should know how it works first.\nInstalled liquidctl exposes **no lighting protocol** for the 2023/2024 Kraken\ngeneration (the driver's colour-channel map is empty), so OpenKraken speaks the\nHUE2 \"Direct\" wire protocol itself. That protocol was **reverse-engineered by\nthe community** — credit to the unmerged [liquidctl PR #882](https://github.com/liquidctl/liquidctl/pull/882)\n(`feat/kraken-2024-elite-rgb`, tested on this exact device) and to the\n[OpenRGB](https://openrgb.org/) NZXT HUE2 controller and its device issues\n(#4828 / #4985). There is no official NZXT spec.\n\nWhat that means in practice:\n\n- **Enable it explicitly.** The Lighting page ships with \"Control LEDs\"\n  unchecked; until you turn it on, OpenKraken never writes to the LEDs and your\n  existing (NZXT/firmware) lighting is left alone.\n- **Effects are streamed from the host at ~1 frame/s.** The device's firmware\n  rejects its own hardware animation modes for this generation and reliably\n  accepts Direct frames only at about **1 FPS**, so Breathing / Color cycle /\n  Spectrum are computed by the app and pushed one slow frame at a time. They are\n  designed as gentle drifts, not fast flashes, and they **stop when the app\n  closes** (a solid colour just stays as the last frame written).\n- **Brightness is applied host-side** (the device has no brightness command),\n  and **colours reset on an AC power-cycle** — reopen the app (or let it\n  autostart with \"apply on start\") to re-apply.\n- Covers the **24-LED pump ring** and the bundled **RGB Core fan** chain; ring\n  and fans can be synced or driven independently.\n\n**Why is the LCD sensor screen refresh so slow by default?**\nEach rendered frame is a full-resolution bitmap uploaded over USB — roughly\n**0.8 MB per frame** (640×640 RGB565, ≈819 KB). To avoid saturating the link and\nspamming the firmware, the **sensor screen defaults to a 2-second** refresh\ninterval (configurable 0.5–10 s on the LCD page). Animated GIFs are limited by\nthe firmware to an encoded size of about **24 MB**.\n\n**Do my fan/pump curves survive closing the app — or a reboot?**\n**Liquid-temp curves** are written into the cooler's firmware as a 40-point\ntable and **keep running after you close OpenKraken** (and across an OS reboot,\nas long as the cooler stays powered). They are **reset when the cooler loses\npower** (e.g. a full AC power cycle), after which you should reopen the app (or\nlet it autostart with \"apply on start\") to re-apply them. **CPU/GPU-temp\ncurves** require the app to be running because the host computes the duty each\ntick; a firmware failsafe still protects the loop if the app dies.\n\n**Why isn't there an \"LCD off\" button that actually turns the panel off?**\nThe firmware has no blank mode, so \"Screen off\" sets brightness to 0 and\nrestores your previous brightness when you switch back.\n\n**It says \"Disconnected\".**\nCheck the [permissions](#permissions) section, confirm `liquidctl list` (run via\nthe venv: `.venv/bin/python -m liquidctl list`) sees the device, and make sure\nnothing else (e.g. another monitoring tool) is holding the HID handle.\n\n## Uninstall\n\n```sh\nrm ~/.local/share/applications/openkraken.desktop\nrm ~/.config/autostart/openkraken.desktop   # if you added autostart\nrm -rf .venv                                 # the project's virtual environment\nrm -rf ~/.config/openkraken                  # config + cached LCD media (optional)\n# then delete the cloned project directory\n```\n\nAny udev rule that was installed (`/etc/udev/rules.d/70-openkraken.rules`) can be\nremoved separately with `sudo`.\n\n## License\n\nMIT — see [`LICENSE`](LICENSE). Each source file carries an\n`SPDX-License-Identifier: MIT` header.\n\nOpenKraken is an independent open-source project, not affiliated with or endorsed\nby NZXT. \"Kraken\" is referenced descriptively for hardware interoperability.\n\"NZXT\", \"Kraken\", and \"CAM\" are trademarks of their respective owners.\nBuilt on the excellent [liquidctl](https://github.com/liquidctl/liquidctl).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidboulay%2Fopenkraken","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidboulay%2Fopenkraken","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidboulay%2Fopenkraken/lists"}