Make the ASUS Zenbook Duo (UX8406) work like Windows under Fedora/GNOME - keyboard backlight (USB + Bluetooth), dual-screen rotation, per-display touch, auto bottom-screen/brightness, and battery/power control, with a native GNOME GUI.
  • Python 91.1%
  • JavaScript 5.6%
  • Makefile 3.2%
  • CSS 0.1%
Find a file
JD 181c21b08c
All checks were successful
build / verify (push) Successful in 38s
release / rpm (push) Successful in 43s
release: 0.9.0
Dock D-Bus + live keyboard-docked indicator, keyboard-backlight slider, and
stylus libwacom tablet files.
2026-06-21 04:21:33 +08:00
.forgejo/workflows ci: generate SHA256SUMS after signing so checksums match the uploaded bytes 2026-06-21 04:07:04 +08:00
data feat: ship stylus libwacom tablet files for both panels 2026-06-21 04:17:54 +08:00
gnome-extension fix: disconnect settings + D-Bus proxy signals on extension teardown 2026-06-21 04:16:47 +08:00
packaging release: 0.9.0 2026-06-21 04:21:33 +08:00
scripts ci(release): CHANGELOG-driven release notes + dedup assets 2026-06-20 22:36:10 +08:00
tests feat: org.zenbookduo.Daemon D-Bus interface constants + PropertiesChanged helper 2026-06-21 04:08:33 +08:00
zenbook_duo_control chore: ruff config + lint fixes (import sorting, gi noqa) 2026-06-21 03:58:48 +08:00
zenbook_duod release: 0.9.0 2026-06-21 04:21:33 +08:00
.gitignore chore: stop tracking docs/superpowers (kept local, gitignored) 2026-06-14 05:41:53 +08:00
CHANGELOG.md release: 0.9.0 2026-06-21 04:21:33 +08:00
LICENSE Initial commit: design spec, README, MIT license 2026-06-14 03:59:39 +08:00
Makefile feat: ship stylus libwacom tablet files for both panels 2026-06-21 04:17:54 +08:00
PACKAGING.md docs: changelog + supply-chain notes for v0.8.0 hardening 2026-06-21 04:03:29 +08:00
pyproject.toml release: 0.9.0 2026-06-21 04:21:33 +08:00
README.md docs: changelog + README for the dock indicator, slider, and stylus files 2026-06-21 04:18:37 +08:00
RELEASE.md ci(release): CHANGELOG-driven release notes + dedup assets 2026-06-20 22:36:10 +08:00

fedora-zenbook-duo-ctl

A control utility that makes the ASUS Zenbook Duo (UX8406) behave under Fedora the way it does under Windows with the proprietary driver suite — keyboard backlight in both docked and Bluetooth modes, automatic bottom-screen and brightness handling, dual-screen rotation, per-display touch, and battery/power control — all toggleable from a native GNOME GUI.

Status: in development. The keyboard-backlight daemon (USB + Bluetooth) is implemented and verified on hardware; display, rotation, touch mapping, power control, and the GNOME GUI are in progress.

Target hardware

  • Model: 2025 Zenbook Duo (UX8406CA) — should apply to other UX8406 variants
  • Distro: Fedora 42, GNOME 48.8 (Wayland), kernel 6.19+

Features

  • Keyboard backlight in both docked (USB) and detached (Bluetooth) modes
  • Automatic bottom screen on/off when the keyboard is removed/placed
  • Display brightness sync between the two panels (with max_brightness scaling)
  • Automatic dual-screen rotation from the accelerometer
  • Per-display touchscreen / stylus mapping — touch on a panel controls that panel
  • Battery charge limit (charge_control_end_threshold)
  • Platform profile (quiet / balanced / performance)
  • Native GNOME GUI: Quick Settings extension + a libadwaita settings app
  • Runs in the user session (not gdm); privilege via udev rules, no sudo
  • Optional, off-by-default Wi-Fi/Bluetooth toggle on dock change

Architecture

One control point, three faces:

  • zenbook-duod — a Python session daemon that is the sole owner of hardware and policy. Event-driven (keyboard dock/undock, accelerometer, brightness, power events) with an idempotent state reconciler.
  • GNOME Shell extension — Quick Settings toggles and a live keyboard-docked indicator.
  • zenbook-duo-control — a GTK4/libadwaita settings app for full configuration.

Configuration lives in a GSettings schema (org.zenbookduo) shared by all three; live state is exposed over a small session D-Bus interface. Privileged hardware nodes are made group-writable by udev rules, so nothing runs as root.

Install

Packaging is in progress. The target distribution is an RPM built by Forgejo CI and served from a Forgejo RPM registry, installable with dnf:

# one-time: add the repo (URL provided once the registry is published)
sudo dnf config-manager addrepo --from-repofile=<forgejo-rpm-repo-url>
sudo dnf install fedora-zenbook-duo-ctl

For development, a Makefile provides make install / make uninstall.

The package enables the zenbook-duod user service on install. Because a user service can't be started from a package scriptlet, log out and back in (or reboot) to start it — or start it now without re-login:

systemctl --user --now enable zenbook-duod.service

Device access is granted automatically to your active session (a logind uaccess udev rule), so no group changes or sudo are needed.

GNOME Shell extension

A Quick Settings extension ships with the package (Fedora 42/43/44 → Shell 48/49/50). Enable it once per user:

gnome-extensions enable zenbook-duo-ctl@jd.jdneer.com

(Log out and back in first if it was just installed, so the Shell picks it up.) It adds panel toggles for auto-rotate, brightness sync, the bottom screen, and touch mapping, a keyboard-backlight slider, and a "keyboard docked" status icon (shown only while the keyboard is attached, driven by the daemon over D-Bus).

A full settings window is also available — launch Zenbook Duo Control from your apps, or run zenbook-duo-control — with sliders for the backlight level, charge limit, and scale, plus the platform-profile selector.

Uninstalling

systemctl --user --now disable zenbook-duod.service   # stop it in your session
sudo dnf remove fedora-zenbook-duo-ctl

Removal disables the unit and deletes every installed file. The dnf remove step cannot stop the daemon in your live session (a package scriptlet runs as root, outside your session) — hence the explicit --user disable above; logging out also stops it. Your personal settings remain in dconf; wipe them with dconf reset -f /org/zenbookduo/ if desired.

License

MIT — see LICENSE.