Cryo Docs
Everything to get Cryo running on an alienware-wmi laptop: requirements, install, compatibility, configuration, architecture, and the security model. Then dive into the 14-command CLI Reference.
Step 1 → 3
Quick start
From git clone to a running daemon in one command.
1Check the requirements
- alienware-wmi kernel driverAll thermal I/O goes through the in-kernel driver over sysfs — no acpi_call, no out-of-tree modules.
- NVIDIA proprietary driverGame detection reads dGPU process state via NVML. Without it, Cryo degrades gracefully — everything else keeps working.
- Python 3.12+The daemon, GUI, and CLI are Python 3.12 on PySide6/Qt 6.
- uvAlready installed and on your PATH before you run the installer — it provisions an isolated uv venv, no system pip pollution.
Developed on the Alienware m18 R2, designed for the alienware-wmi family (Alienware and Dell G-Series). The daemon probes what your machine supports at startup and the GUI, tray, and CLI render only what exists — see Compatibility below. Two laptops are SUPPORTED so far (the m18 R2 and the 16X Aurora AC16251); watch your temperatures on first runs.
2Install from source
The installer provisions a uv venv, creates /etc/cryo, installs the cryod systemd unit, and adds a desktop entry:
$ git clone https://github.com/I4cTime/cryo.git && cd cryo && sudo ./packaging/install.sh
To update later, pull and re-run the installer:
$ cd cryo && git pull && sudo ./packaging/install.sh
Verify with cryoctl doctor first (it works without the daemon and lists what was probed), then cryoctl status — see the CLI reference for all 14 commands.
3Check compatibility
Every feature is probed at startup. What the kernel or the machine doesn't offer is hidden or disabled with a visible notice — never assumed. The full matrix, doctor's four verdicts and every reported model live on the compatibility page.
| Feature | Requires | When missing |
|---|---|---|
| Power modes | alienware-wmi platform profiles | Limited mode: mode grid hidden, auto rules idle; everything else runs |
| Fans and temperatures | alienware-wmi hwmon | Limited mode: telemetry tiles, fan control, curves and guard hidden; GPU telemetry stays |
| G-Mode | G-Mode-capable model (kernel advertises balanced-performance and performance) | "Performance" becomes the boost profile; auto-rules fall back |
| Fan curves + manual boost | fan*_boost support — probed; "not implemented in every model" per the kernel docs | Curves and sliders disabled with a visible notice |
| Thermal Guard | Fan boost (above) | Disabled — nothing to actuate |
| Auto profiles (AC/battery) | A Mains-type power supply in sysfs (name discovered, not assumed) | Battery rules never fire; everything else works |
| CPU Turbo toggle | intel_pstate/no_turbo or cpufreq/boost | Toggle hidden |
| CPU power cap (per mode) | intel_pstate/max_perf_pct (Intel; amd_pstate has no global knob) | Cap card hidden; cryoctl cap reports it unavailable |
| Game detection | NVIDIA proprietary driver (NVML) | Auto-G-Mode off; manual modes unaffected |
| AlienFX chassis lighting (rings, lid logo, power button) | AW-ELC USB controller 187c:0550/0551 (≈2020+ m/x-series) | Lighting section hidden unless a keyboard backlight exists |
| Keyboard backlight | Darfon per-key keyboard 0d62:aab1/bab1 ("DELL Technologies Keyboard", m16/m18 R1/R2) | Keyboard keeps its firmware lighting; chassis effects unaffected |
Tested models
| Model | Thermals | Curves / Guard | G-Mode | Lighting | Game sense | Reported by |
|---|---|---|---|---|---|---|
| Alienware m18 R2 (Intel + RTX 4080) | ✓ | ✓ | ✓ | ✓ | ✓ | maintainer |
| Alienware 16X Aurora AC16251 (Core Ultra 9 275HX + RTX 5060 Laptop) | ✓ | ✓ | ✓ | ✓ | ✓ | community (issue #21) |
| Alienware Aurora R4 (2011 desktop, RTX 5060 Ti) | ✗ | ✗ | ✗ | ✗ | ✓ | community (issue #9) |
Have a different Alienware or Dell G-Series machine? Run cryoctl doctor and open a model report with the output — working or not, both results grow this table. The canonical matrix lives in the repo's COMPATIBILITY.md.
Known out of scope for now: AMD dGPU game detection (needs DRM fdinfo instead of NVML); Pre-ELC lighting controllers (older AlienFX protocols); Per-key patterns and two-color fades on the keyboard; Keyboards wired to the ELC itself on some G-Series/m15 models; Thermals on Aurora/Area-51 desktops the driver doesn't cover — pre-2012 models run in limited mode.
Configuration
/etc/cryo/config.json
Deep-merged over the shipped defaults — a partial file (even an empty object) is always valid. Set only what you want to change.
{
"fan_curves": {
"enabled": true,
"cpu": [[45, 0], [60, 15], [70, 35], [80, 60], [88, 85], [95, 100]],
"gpu": [[45, 0], [60, 15], [70, 40], [80, 70], [87, 100]],
"hysteresis_c": 3.0,
"min_step": 5
},
"thermal_guard": { "cpu_trip": 88, "gpu_trip": 85, "release_c": 10, "min_hold_s": 30 },
"cpu_cap": { "enabled": true, "profiles": { "performance": 90, "gmode": 100 } },
"auto": {
"on_battery": "quiet",
"on_ac": "balanced",
"on_game": "gmode",
"after_game": "balanced",
"game_ignore": ["xwayland", "gnome-shell"]
},
"lighting": { "restore": true }
}The example above is illustrative — it shows the shipped defaults for the fan_curves, thermal_guard, auto and lighting keys plus a cpu_cap override. The file holds only your overrides; the daemon rewrites it only when you change a setting from the GUI or cryoctl curve/guard/cap (validated first, and keys you never touched keep tracking new defaults). What the daemon changes on its own (last lighting, the curves-off latch a manual boost sets) lives in /var/lib/cryo/state.json. Curve points are [temperature °C, fan boost %]; game_ignore matches exact lowercase process basenames, never substrings. Print the effective merged config with cryoctl config.
How it fits together
Architecture
One root daemon owns the hardware; the GUI, tray, and CLI are thin clients on a Unix socket.
- cryod — the root daemonRuns under systemd as root and is the only process that touches hardware: platform profiles and fan boosts via the alienware-wmi sysfs interface, game detection via NVML, and AlienFX via raw HID.
- /run/cryo.sock — one socket, JSON linesGroup-owned Unix socket, mode 0660. Requests and responses are single JSON lines; sending {"op":"subscribe"} upgrades the connection to a 1 Hz push telemetry stream.
- Thin clientsThe Qt GUI (QLocalSocket, 2-second auto-reconnect), the tray icon, and cryoctl are all equal clients of the same protocol — nothing in the UI holds hardware state.
- Config that can't half-break/etc/cryo/config.json is deep-merged over shipped defaults, so a partial file is always valid — set only what you want to change.
Security model
Permissions
Root where the hardware demands it, unprivileged everywhere else.
- Why root at allPlatform-profile and fan-boost writes go through privileged sysfs attributes, and AlienFX needs raw HID access. Isolating that in one small daemon means the GUI and CLI never need elevation.
- The socket is the boundary/run/cryo.sock is group-owned with mode 0660 — only root and members of the cryo group can talk to the daemon. No TCP port, nothing network-facing.
- In-kernel driver onlyAll thermal I/O uses the mainline alienware-wmi driver. No acpi_call, no out-of-tree modules, nothing taints the kernel.
Want the full tour?