Skip to content
Documentation

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:

install
$ git clone https://github.com/I4cTime/cryo.git && cd cryo && sudo ./packaging/install.sh

To update later, pull and re-run the installer:

update
$ 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.

FeatureRequiresWhen missing
Power modesalienware-wmi platform profilesLimited mode: mode grid hidden, auto rules idle; everything else runs
Fans and temperaturesalienware-wmi hwmonLimited mode: telemetry tiles, fan control, curves and guard hidden; GPU telemetry stays
G-ModeG-Mode-capable model (kernel advertises balanced-performance and performance)"Performance" becomes the boost profile; auto-rules fall back
Fan curves + manual boostfan*_boost support — probed; "not implemented in every model" per the kernel docsCurves and sliders disabled with a visible notice
Thermal GuardFan 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 toggleintel_pstate/no_turbo or cpufreq/boostToggle 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 detectionNVIDIA 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 backlightDarfon per-key keyboard 0d62:aab1/bab1 ("DELL Technologies Keyboard", m16/m18 R1/R2)Keyboard keeps its firmware lighting; chassis effects unaffected

Tested models

ModelThermalsCurves / GuardG-ModeLightingGame senseReported 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.

config.json (illustrative)
{
  "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.