Skip to content
Documentation

Cryo Docs

Everything to get Cryo running on the m18 R2: requirements, install, configuration, architecture, and the security model. Then dive into the 10-command CLI Reference.

Step 1 → 2

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.
  • uvThe installer provisions an isolated uv venv — no system pip pollution.

Cryo targets exactly one machine — the Alienware m18 R2 (built on Pop!_OS). Other alienware-wmi laptops may work but are untested and unsupported.

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 status — see the CLI reference for all 10 commands.

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)
{
  "profiles": {
    "custom": {
      "curves": {
        "cpu": [[45, 0], [60, 15], [70, 35], [80, 60], [88, 85], [95, 100]],
        "gpu": [[45, 0], [60, 15], [70, 40], [80, 70], [87, 100]]
      }
    }
  },
  "auto_rules": {
    "on_battery": "quiet",
    "on_ac": "balanced",
    "on_game": "gmode",
    "after_game": "previous"
  },
  "gamesense": {
    "ignore": ["xwayland", "gnome-shell"]
  },
  "lighting": {
    "effect": "quantum",
    "brightness": 80
  }
}

The example above is illustrative — it shows the shipped defaults for the curves, auto_rules, and lighting keys. Curve points are [temperature °C, fan boost %]; the ignore list under gamesense 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.