Skip to content

Installation

Most users should also install z13gui

z13ctl is the engine; z13gui is the recommended way to drive it for everyone except command-line veterans. It's a touch-friendly graphical overlay covering every feature — lighting, fan curves, TDP, undervolt, profiles, and battery limit. Install z13ctl first (this page), then add z13gui (see GUI Frontend below).

Prerequisites

  • Linux kernel with hidraw support (standard on all mainstream distributions)
  • 2025 ASUS ROG Flow Z13 (USB IDs 0b05:18c6 and 0b05:1a30)

InputPlumber conflict (Bazzite, ChimeraOS, Nobara)

On gaming distributions that ship InputPlumber, the z13ctl daemon's button watcher will fail to open the Armoury Crate button device. InputPlumber ships a built-in profile for the ROG Flow Z13 that grabs the device exclusively. See InputPlumber compatibility for the override instructions.

Optional: ryzen_smu kernel module (for undervolting)

CPU undervolting via AMD Curve Optimizer requires the ryzen_smu kernel module. Without it, all other features work normally — undervolt commands will return a helpful error explaining how to install the module.

Strix Halo requires the amkillam fork

The original leogx9r/ryzen_smu does not support Strix Halo (the SoC in the 2025 Z13). You must use the amkillam/ryzen_smu fork. z13ctl detects the wrong fork at startup and reports undervolt as unavailable.

Distribution Package Source
Arch / CachyOS ryzen_smu-dkms-git AUR (amkillam fork)
Other distros build from source github.com/amkillam/ryzen_smu
# Arch / CachyOS
yay -S ryzen_smu-dkms-git

# Other distros (build from amkillam fork)
git clone https://github.com/amkillam/ryzen_smu.git
cd ryzen_smu
make
sudo make install

Install

Download the latest linux_amd64 archive from the Releases page, then extract and install:

tar xzf z13ctl_*_linux_amd64.tar.gz
sudo install -Dm755 z13ctl /usr/local/bin/z13ctl

One-time permissions setup (requires root):

sudo z13ctl setup

Then log out and back in (or run newgrp users) for the group membership to take effect in your current session.

Install the systemd user service (socket activation):

install -Dm644 contrib/systemd/user/z13ctl.socket \
    ~/.config/systemd/user/z13ctl.socket
install -Dm644 contrib/systemd/user/z13ctl.service \
    ~/.config/systemd/user/z13ctl.service
systemctl --user daemon-reload
systemctl --user enable --now z13ctl.socket z13ctl.service

Install the z13ctl-bin package with your preferred AUR helper:

yay -S z13ctl-bin

The package installs the binary, udev rules, systemd units, and the sysfs permissions service automatically, restarting the latter so an upgrade applies any new permission grants without a reboot. After installing, add your user to the users group if not already a member:

sudo usermod -aG users $USER

Then log out and back in for the group membership to take effect.

Alternatively, download the .pkg.tar.zst package directly from the Releases page and install with pacman:

sudo pacman -U z13ctl-*.pkg.tar.zst

Download the .deb package from the Releases page, then install:

sudo apt install ./z13ctl_*.deb

The package installs the binary, udev rules, systemd units, and the sysfs permissions service automatically, restarting the latter so an upgrade applies any new permission grants without a reboot. After installing, add your user to the users group if not already a member:

sudo usermod -aG users $USER

Then log out and back in for the group membership to take effect.

Download the .rpm package from the Releases page, then install:

sudo dnf install ./z13ctl_*.rpm

The package installs the binary, udev rules, systemd units, and the sysfs permissions service automatically, restarting the latter so an upgrade applies any new permission grants without a reboot. After installing, add your user to the users group if not already a member:

sudo usermod -aG users $USER

Then log out and back in for the group membership to take effect.

Requires Go 1.23 or later.

git clone https://github.com/dahui/z13ctl
cd z13ctl
make build
sudo make install

make install installs the binary to /usr/local/bin and runs sudo z13ctl setup automatically.

Install the systemd user service:

make install-service

Verify the installation

z13ctl list

This should print the discovered hidraw devices and confirm Aura support. If it prints nothing, see Troubleshooting below.


GUI Frontend

Highly recommended for most users. Install z13gui alongside z13ctl — a touch-friendly GTK4 overlay that communicates with z13ctl through its daemon and exposes every feature graphically. While the raw z13ctl CLI is ideal for scripting and advanced tuning, beginners and anyone who prefers a point-and-tap interface will find the more advanced features (custom fan curves, TDP, undervolting) far easier to use through z13gui. See the z13gui README for installation instructions.

Requires the daemon

z13gui talks to z13ctl over its daemon socket, so make sure the systemd user service is installed and enabled (the AUR, .deb, and .rpm packages do this for you).


Next steps

You're installed and ready to go. Head to the Quick Start guide to set your first lighting effect, fan curve, and performance profile.


What setup does

sudo z13ctl setup performs four steps:

  1. Writes /etc/udev/rules.d/99-z13ctl.rules — grants the users group MODE=0660 / GROUP=users on the ASUS HID and input device nodes; uses RUN+=chgrp/chmod to set permissions on the platform-profile attribute, hwmon fan curve attributes (asus_custom_fan_curve + asus pwm_enable), and asus-nb-wmi PPT power limit attributes when the drivers load.
  2. Reloads udev and applies permissions immediately to all currently present files — including ryzen_smu sysfs files for undervolting (if the module is loaded).
  3. Writes /etc/systemd/system/z13ctl-perms.service and enables it — a Type=oneshot service that runs chgrp + chmod g+w at boot on BAT*/charge_control_end_threshold, the asus-armoury firmware attributes (boot_sound, panel_overdrive), the asus-nb-wmi ppt_* power limits, and the ryzen_smu_drv files.
  4. Starts the service immediately so battery limit, TDP, and undervolt are accessible right away.

Why a separate oneshot service?

The charge_control_end_threshold and ppt_* attributes are added by the asus_nb_wmi kernel driver late in its probe() sequence — after all observable udev child-device events have already fired. The firmware-attribute current_value files may likewise be created after their parent's ADD event, and the ryzen_smu files are kobjects under /sys/kernel/, not udev-managed devices. No udev hook can reliably target any of them. The z13ctl-perms.service unit is a self-contained workaround that runs at sysinit.target. It has no dependency on the z13ctl binary and can be inspected at any time:

systemctl cat z13ctl-perms.service

Use --dry-run to preview all changes without root or any side effects:

z13ctl --dry-run setup

Uninstall

Remove the user service first:

systemctl --user disable --now z13ctl.socket z13ctl.service
rm -f ~/.config/systemd/user/z13ctl.socket \
      ~/.config/systemd/user/z13ctl.service
systemctl --user daemon-reload

Then remove the binary and system files:

sudo rm /usr/local/bin/z13ctl
sudo rm /etc/udev/rules.d/99-z13ctl.rules
sudo udevadm control --reload-rules
sudo systemctl disable --now z13ctl-perms.service
sudo rm /etc/systemd/system/z13ctl-perms.service
sudo systemctl daemon-reload

Troubleshooting

z13ctl list prints nothing

The device was not found. Check that the kernel loaded the hid and hidraw modules:

lsmod | grep hid
ls /dev/hidraw*

If /dev/hidraw* devices exist but none match the ASUS USB IDs, the device is present but not recognized. This tool targets the 2025 ROG Flow Z13 specifically (USB IDs 0b05:18c6 and 0b05:1a30).

Permission denied

Run sudo z13ctl setup and log out/in to apply the group membership. Verify with:

ls -la /dev/hidraw*
groups

Daemon logs "button watcher stopped; retrying … permission denied"

Something else is managing the Armoury Crate button device and z13ctl cannot open it. On gaming distributions, InputPlumber is a common cause. See InputPlumber compatibility for the fix.

Armoury Crate button does nothing, and the log shows no error

z13ctl reads the button device non-exclusively, so a process holding an exclusive EVIOCGRAB on it receives every event instead — with nothing for z13ctl to report. Check what else has the device open:

sudo fuser -v /dev/input/eventN

Daemon not starting

systemctl --user status z13ctl.socket z13ctl.service
journalctl --user -u z13ctl -n 50