Handheld Linux Showdown: Bazzite vs CachyOS vs SteamOS on the ROG Ally
The ROG Ally is no longer a Windows-only device in any meaningful sense. With Valve’s release of SteamOS 3.9 in April 2026 officially extending support to third-party AMD handhelds, the Ally joins a maturing Linux handheld ecosystem that already had two strong contenders: Bazzite, the immutable Fedora Atomic gaming image from the Universal Blue project, and CachyOS Handheld Edition, the performance-obsessed Arch derivative with a custom kernel and the LAVD scheduler baked in. All three converge on the same underlying enabling stack — Gamescope as the Wayland compositor and session manager, Handheld Daemon (HHD) for TDP and controller abstraction, and Decky Loader for plugin-based extensibility — but they diverge sharply in lineage, update model, hardware support maturity, and the implied relationship between the user and their OS.
The honest answer to “which one should I run on my Ally” depends less on raw benchmark numbers — the performance gaps are real but measured in single-digit percentages in most titles — and more on which failure mode you are willing to tolerate. SteamOS gives you the closest thing to a console appliance, with the risk that non-Deck hardware remains a secondary target for Valve engineering. Bazzite gives you the widest hardware support, the most batteries-included setup, and atomic rollback as a safety net, with the caveat that Fedora Atomic’s tooling has a learning curve the moment you need to deviate from the happy path. CachyOS gives you full pacman control, a genuinely faster kernel, and the ability to break things in completely new and interesting ways on a Friday evening.
The Shared Stack: What All Three Are Building On
Before diving into the differences, it is worth mapping the software infrastructure these distributions share, because it explains why the experience is more similar across all three than the lineage differences would suggest.
+---------------------------------------------------------------+
| User-visible layer |
| Steam Big Picture / Gaming Mode | KDE Plasma (Desktop) |
+-----------------------------------+---------------------------+
| Session layer |
| Gamescope (Wayland compositor + session manager) |
+---------------------------------------------------------------+
| Hardware abstraction layer |
| Handheld Daemon (HHD) | InputPlumber |
| TDP / fan / RGB | Input device unification |
+---------------------------------------------------------------+
| Extensibility layer |
| Decky Loader (plugin runtime for Gaming Mode) |
| MangoHud (overlay: FPS, temps, power draw) |
+---------------------------------------------------------------+
| Kernel / base layer |
| |
| SteamOS 3.9 Bazzite 43 CachyOS Handheld |
| Arch (Valve fork) Fedora Atomic 42 Arch (CachyOS) |
| jupiter/hw kernel kernel-cachyos* linux-cachyos- |
| A/B image update rpm-ostree image deckify kernel |
| update pacman rolling |
+---------------------------------------------------------------+
* Bazzite ships its own kernel builds derived from the CachyOS
and fsync patch trees on non-Deck image variants.
Gamescope is the piece that makes all three feel like a console. It is a nested Wayland compositor originally written by Valve for the Steam Deck that handles the full-screen gaming session, HDR tonemapping, integer scaling, frame limiting, and VRR signaling to the panel. All three distributions ship a gamescope-session systemd unit that boots directly into Gaming Mode instead of a desktop environment.
Handheld Daemon (HHD) from the hhd-dev project is the keystone of non-Deck handheld Linux support. It provides a unified vendor interface replacement: it exposes the Ally’s controller hardware as a standard DualSense or Xbox pad to the kernel, handles TDP control via ryzenadj and ACPI hooks, manages RGB on the Ally’s controller ring, and translates the M1/M2 rear buttons and the Armory Crate button into usable input events. Without HHD, the Ally’s controller presents as a raw HID device that Steam does not fully understand, the rear buttons do nothing useful, and TDP control requires manual ryzenadj invocations. All three distributions ship HHD; the difference is in how pre-configured and visible it is. Note that the standalone Decky HHD plugin was archived in April 2025 and is no longer recommended — HHD’s overlay interface is now the canonical control surface.
InputPlumber handles input device unification below HHD, consolidating the multiple HID interfaces the Ally exposes (separate gamepad, keyboard, and consumer-control descriptors) into a single coherent virtual device. This is what makes Steam Input’s gyro and haptics configuration work correctly.
Decky Loader is a plugin runtime that injects a sidebar into Gaming Mode, enabling community plugins for TDP management (SimpleDeckyTDP, AllyCentre), game library integration (Junk-Store for Epic Games), UI customization (CSS Loader, TabMaster), artwork management (SteamGridDB), and — as of May 2026 — eGPU management via the XG Mobile Manager plugin for ROG Ally users with an XG Mobile dock.
SteamOS 3.9: The Official Answer
Lineage and What It Actually Is
SteamOS 3 is Valve’s in-house Linux distribution, built on a heavily modified Arch Linux base with a custom kernel derived from the linux-neptune tree (targeting AMD APU-specific patches, Pressure Vessel container runtimes for Steam’s compatibility layers, and Gamescope integration). The OS uses an immutable image model with A/B partition pairs: the active slot boots the current OS image, the passive slot holds the previous image, and an update atomically writes a new image to the passive slot before flipping the boot target. A failed update boots back to the previous slot automatically. This is a different mechanism from OSTree/rpm-ostree — it is a block-level image swap, similar to how Android handles OTA updates — and it means the root filesystem is truly read-only at runtime with no layering.
Through SteamOS 3.6 and 3.7, Valve provided unofficial, community-flagged instructions for installing on non-Deck hardware. The 3.9 release in April 2026 formalized this, declaring official support for the ASUS ROG Ally, ROG Ally X, and the Lenovo Legion Go family, with device-specific hardware configurations shipping in the base image.
Hardware Support on the Ally
Out-of-the-box hardware status with SteamOS 3.9 on the Ally is substantially better than it was in the 3.6/3.7 era. The AMD Ryzen Z1 Extreme APU, Wi-Fi, the internal 1080p 120 Hz panel, and the standard gamepad functions work without intervention. VRR on the internal panel is now exposed through the standard SteamOS Performance overlay, accessible via the Quick Access Menu.
The trickier surfaces have improved but are not fully settled. Suspend/resume had a documented regression in 3.8 builds that caused controls to misbehave after wake (fixed in the 3.8.5 beta before the 3.9 stable release), and there is at least one open issue as of mid-2026 regarding the right speaker on Xbox Ally X units not functioning correctly. The Armory Crate button and rear buttons (M1/M2) require HHD to be correctly configured to produce useful Steam Input events — they do not work as general system shortcuts the way the three-dot button does on a Steam Deck.
Fan and TDP control on SteamOS uses the standard Gamescope TDP interface and HHD, exposed through the Quick Access Menu’s Performance tab. The Ally-specific TDP range (up to 30 W in turbo scenarios) is visible and configurable. For users wanting deeper fan curves, the AllyCentre Decky plugin provides preset-based fan and TDP management (Silent, Download, Performance, Turbo modes) and live thermal monitoring.
Update Model and Tradeoffs
SteamOS updates are delivered as whole OS images. In Gaming Mode, the system checks for and downloads updates in the background, notifying you to reboot. There is no granular package management for the base system from the user’s perspective — you cannot pacman -S anything into the root. The escape hatch is toolbox (or distrobox in some configurations) for a mutable container environment, and Steam’s Pressure Vessel runtime for game compatibility. The update cadence loosely tracks Valve’s Steam Deck release schedule, which has historically meant stable releases lag behind upstream Arch by months, though HWE (hardware-enablement) updates for newer APU silicon have been arriving faster since the non-Deck expansion.
The downside is real: if Valve’s hardware focus shifts, or if a specific ROG Ally quirk requires a kernel patch that Valve has not merged, you are waiting on Valve’s release cycle. The Ally is not a Steam Deck.
Bazzite: The Batteries-Included Atomic Image
Lineage and What It Actually Is
Bazzite is produced by the Universal Blue (uBlue) project, which builds OCI container images on top of Fedora Atomic base images and publishes them as bootable OS images via the rpm-ostree / libostree toolchain. In practical terms: the base image is Fedora Kinoite (KDE Plasma on Fedora Atomic), layered with gaming-specific packages, kernel replacements, firmware, and configuration. rpm-ostree manages the system as a series of immutable image commits with a mutable /var and /home. The Bazzite project releases multiple image variants; the handheld-relevant one is bazzite-deck (or the architecture-appropriate variant for Ally), which boots directly into a Gamescope gaming session.
Bazzite 43 (February 2026) is the current generation, tracking Fedora 43. It ships with HHD pre-installed and enabled for non-Deck handhelds, Decky Loader pre-installed, MangoHud, Gamescope from the upstream tree (frequently newer than the SteamOS-pinned version), and a kernel derived from the CachyOS and Clear Linux patch trees with fsync/futex2 patches for improved gaming scheduler behavior.
Hardware Support on the Ally
Bazzite’s ASUS ROG Ally page in its Handheld Wiki is one of the most comprehensive device-specific documentation sets in the handheld Linux ecosystem, which itself signals something about the community investment. The key Ally-specific behaviors on Bazzite:
- HHD is pre-installed and starts at boot, immediately exposing TDP control and the rear buttons through the Gaming Mode overlay without additional configuration.
- CPU Boost is explicitly disabled by default for the Ally and Ally X, because CPU boost is documented to cause excessive power draw on Renoir/Rembrandt APUs in handheld power envelopes. This is a meaningful default that SteamOS also handles but that CachyOS requires the user to configure manually.
- The SMT suspend bug (a known Ally quirk where symmetric multi-threading state needs to be toggled around suspend cycles to avoid kernel panics on some firmware revisions) is worked around automatically by the HHD/SimpleDeckyTDP integration.
- Fan curves and granular TDP are available via the HHD overlay or the SimpleDeckyTDP Decky plugin.
- Audio works correctly on current Bazzite 43 builds for both Ally and Ally X with the UCM audio profiles shipped in the image.
Update Model and Tradeoffs
rpm-ostree (or its successor interface bootc in future Fedora generations) stages updates in the background and applies them on reboot. Rolling back is a first-class operation: rpm-ostree rollback or selecting the previous deployment from the GRUB menu. Bazzite retains build history for up to 90 days, meaning you can rebase to any commit in that window by its checksum. This is meaningfully safer than SteamOS’s two-slot A/B scheme for users who skip updates and then apply several at once.
The compositing of rpms on top of the base image (“package layering”) is possible via rpm-ostree install, but each layered package increases the delta size for future updates and can pin the system to specific base commits. The recommended path for additional software is Flatpak (for GUI applications) or distrobox (for a full mutable Arch or Fedora container). For most Gaming Mode users this is invisible — you install games via Steam, add Decky plugins, and the system handles the rest.
The Fedora Atomic lineage means Bazzite tracks a faster-moving kernel and Mesa than SteamOS. Mesa updates that add new RADV features, new Proton experimental builds, and kernel scheduler improvements land in Bazzite weeks to months before they reach stable SteamOS. The cost is a slightly higher rate of regressions — Fedora’s rapid cadence occasionally ships a Mesa or kernel that briefly breaks something — but the rollback story means recovery is one command.
CachyOS Handheld Edition: The Performance-Tuned Tinkerer’s Choice
Lineage and What It Actually Is
CachyOS is an Arch-based distribution with a custom package repository and build infrastructure that applies CPU architecture-specific optimizations (x86-64-v3/v4 instruction sets, LTO, profile-guided optimization where practical) to packages. The main differentiator is the kernel: CachyOS ships multiple kernel variants — linux-cachyos with the BORE (Burst-Oriented Response Enhancer) scheduler as default, plus sched-ext variants — and the Handheld Edition specifically uses linux-cachyos-deckify configured with the LAVD (Latency-oriented Assisted Virtual Deadline) scheduler from the sched-ext framework.
LAVD is worth understanding because it is not just a gaming optimization — it is a scheduler with Valve funding behind it, specifically designed for latency-sensitive, communication-heavy workloads where threads rapidly signal each other (which describes a game engine: render thread pinging GPU thread, audio thread, physics thread). The sched-ext framework lets the scheduler run as a BPF program in kernel space, meaning CachyOS can update the scheduler logic without a kernel rebuild. LAVD additionally implements an asymmetric core utilization policy: when overall CPU load is below roughly 50%, active cores run at higher frequency while idle cores stay in deep C-states, improving both latency and battery life in light workloads.
CachyOS Handheld Edition was experimental at its first public release in mid-2024 and reached a stable designation in late 2024. The 2026 releases ship with a Calamares-based graphical installer, audio UCM profiles for the Ally X and Legion Go, HHD, Gamescope from the upstream tree (matching or exceeding Bazzite’s version), and a game session that boots into Gaming Mode comparably to Bazzite and SteamOS.
Hardware Support on the Ally
CachyOS Handheld’s hardware support on the Ally is solid for the core surface area. The LAVD-equipped kernel handles the AMD APU correctly, Wi-Fi and audio work with the UCM profiles, and the Gamescope session starts. HHD provides TDP and rear button support. The gaps relative to Bazzite are in the default configuration and automatic workarounds: CachyOS does not automatically disable CPU Boost or apply the SMT suspend workaround for the Ally — these are user-configurable but require knowing they exist. The documentation is less Ally-specific than Bazzite’s.
Package installation on the mutable system carries a specific warning from the CachyOS project itself: manual installation of gaming packages outside the provided cachyos-gaming-meta metapackage tends to produce dependency mismatches that can break the Gamescope session. This is not a theoretical concern — the CachyOS forums have Ally X threads specifically about broken sessions after unguided package installations. The recommended command is:
|
|
Decky Loader is available and functions correctly. CachyOS ships an upstream Gamescope build rather than the SteamOS-pinned fork, which means Gamescope HDR pipeline improvements arrive quickly but occasionally at the cost of regressions that the SteamOS and Bazzite trees have already patched.
Update Model and Tradeoffs
CachyOS is a rolling Arch derivative. pacman -Syu updates everything: kernel, Mesa, Gamescope, system libraries, and userspace in one transaction. There is no atomic rollback at the OS level — BTRFS snapshots via Snapper are the standard mitigation, and the CachyOS installer configures BTRFS with automatic Snapper snapshots by default. A bad update can be rolled back via the BTRFS snapshot in GRUB, but this is a manual recovery step, not an automatic boot-time fallback.
The rolling model is the correct one for users who want the latest RADV/ACO improvements, the newest kernel patches for AMD APU power management, and the ability to pull in any AUR package without friction. It is the wrong model for users who want a gaming appliance that stays out of the way. A pacman -Syu that lands a Mesa regression on game night is a real failure mode, and unlike Bazzite where rollback is trivially one command, CachyOS recovery requires either BTRFS snapshot awareness or manual package downgrading.
The CachyOS kernel’s performance advantage is measurable in focused benchmarks. In Cyberpunk 2077 testing, the LAVD scheduler with Gamescope shows notably improved 1% lows and frame-time consistency relative to the stock upstream kernel, with reported frametimes that are closer to a flat line under sustained particle-heavy scenes where SteamOS shows occasional micro-stutter. Across a broader game library, the difference averages out to low single-digit FPS improvements in sustained scenarios, with the more reliable benefit being felt as smoother frame pacing rather than higher absolute averages.
Comparison Matrix
| Dimension | SteamOS 3.9 | Bazzite 43 | CachyOS Handheld |
|---|---|---|---|
| Base / lineage | Arch (Valve fork) | Fedora Atomic 43 (uBlue) | Arch (CachyOS) |
| Update model | A/B block image | rpm-ostree image commits | pacman rolling |
| Mutability | Immutable root (read-only) | Immutable root, atomic commits | Fully mutable |
| Rollback | A/B slot (one step back) | 90-day commit history | BTRFS snapshots (manual) |
| Kernel | linux-neptune (Valve) | linux-cachyos + fsync patches | linux-cachyos-deckify (LAVD) |
| Scheduler | Stock CFS (tuned) | CFS/fsync (gaming-tuned) | sched-ext LAVD |
| Ally controller / HHD | HHD (official, 3.9+) | HHD (pre-installed, auto-configured) | HHD (installed, manual tuning) |
| Rear buttons (M1/M2) | Via HHD (3.9+) | Via HHD, pre-configured | Via HHD, configure manually |
| Fan / TDP in UI | Quick Access Menu | HHD overlay + SimpleDeckyTDP | HHD overlay + SimpleDeckyTDP |
| VRR on internal panel | Yes (3.9+) | Yes | Yes |
| Decky Loader | Pre-installed | Pre-installed | Available, manual install |
| Audio (Ally X) | UCM profiles (some edge cases) | UCM profiles, stable | UCM profiles included |
| Suspend/resume | Mostly stable (regressions patched) | Mostly stable, SMT workaround auto | Functional, workarounds manual |
| CPU Boost default | Disabled (Ally) | Disabled (Ally) | Enabled (user must disable) |
| Who it is for | Console appliance users | Most Ally users | Tinkerers, performance chasers |
Performance and Battery: What the Numbers Actually Show
The practical performance spread across these three, running the same game at the same TDP setting, is small enough that chasing it as a primary selection criterion is misguided. All three converge on similar Mesa/RADV versions within a few months of each other, and Proton (running from Steam’s own Pressure Vessel container) is the same binary regardless of the host distribution. The differences are real but they live at the margins.
Where CachyOS’s LAVD scheduler makes a visible difference is frame-time consistency rather than peak FPS. Games that push the Z1 Extreme’s CPU hard — open-world titles with dense simulation, shader compilation stutter during traversal — benefit from LAVD’s latency-aware scheduling because the frame-to-frame variance tightens. The 1% and 0.2% lows improve more than the average framerate. For competitive titles or titles where frame pacing matters perceptibly, this is worth having. For turn-based games, visual novels, and anything GPU-bound, the scheduler is irrelevant.
Battery life under matched TDP limits (15 W sustained, for example) is close across all three because battery life at a fixed TDP is dominated by panel brightness, Wi-Fi activity, and the game’s GPU utilization — not scheduler policy. CachyOS’s deep C-state behavior under light CPU load (the LAVD <50% utilization policy described above) can extend battery life measurably in less demanding titles or during cutscene-heavy sequences. This is a real benefit, though again it is not the kind of difference that justifies a distribution choice on its own.
Bazzite’s fsync/futex2 patches improve performance in heavily multi-threaded Proton titles (anything that maps Windows synchronization primitives heavily, like certain Unreal Engine 5 titles) relative to a vanilla Arch or SteamOS kernel. The gap between Bazzite and CachyOS in this area is smaller than it used to be, as the CachyOS kernel also carries fsync.
The Immutable-vs-Traditional Question Applied to a Handheld
The immutable/atomic model (SteamOS, Bazzite) and the traditional mutable model (CachyOS) represent a genuine philosophical difference in what a handheld operating system is for. On a desktop workstation, the mutable model is almost always the right choice because the machine is a general-purpose tool that you configure and maintain. On a device that you primarily pick up to play a game for an hour, the appliance model has a strong argument.
Bazzite’s atomic commits mean that a Decky plugin update, a firmware package, or an errant Flatpak installation cannot destabilize the base OS. The system that booted last week will boot next week unless you explicitly change something, and even if you do, rolling back requires one command and a reboot. For a device that lives in dock mode connected to a TV, gets grabbed occasionally for couch gaming, and where you are not at a keyboard to troubleshoot, this matters. The console-like update story — system updates happen in the background, apply on next reboot, and never leave you in a broken state — is not incidental to the Bazzite design; it is the point.
CachyOS’s value is precisely the opposite: full control at the cost of full responsibility. If the upstream Gamescope adds a feature you want today, you pacman -S gamescope and have it. If you need a kernel module for a USB device that is not in the default build, you install it. If you want to experiment with a different sched-ext scheduler (scx_rustland, scx_bpfland, or the experimental scx_cosmos), you install the scx-scheds package and switch at runtime. This is genuinely useful for the user who is also treating the Ally as a general Linux portable computer and wants the device to behave like one. The same user is also prepared to fix it when an update breaks the Gamescope session, which will happen.
The Update Experience, Practically
SteamOS: In Gaming Mode, updates are nearly invisible. The system downloads an image update in the background, shows a notification that a reboot will apply it, and the update applies on next shutdown. There is no user action required beyond agreeing to reboot. The Steam client itself updates independently via Valve’s CDN. Valve’s cadence for non-Deck stable releases is still maturing — the 3.9 release was the first to officially carry the Ally, and subsequent point releases will determine whether the cadence is tight or loose.
Bazzite: System updates are applied via the ujust update command (a convenience wrapper), or automatically if you enable the auto-update systemd timer. The update downloads and stages the new image, and on reboot the new deployment activates. From Gaming Mode, Bazzite shows an update notification comparable to SteamOS. Decky plugins update independently through Decky’s own update mechanism. The Flatpak layer updates via flatpak update or the Discover software center in Desktop Mode.
CachyOS: sudo pacman -Syu from a terminal in Desktop Mode is the full system update. There is no background update mechanism by default, no Gaming Mode update notification, and no atomic staging. You update when you decide to update. This is fine for users who maintain their systems; it is a liability for users who neglect updates and then apply six months of accumulated packages at once, which is where Arch-based rolling distributions earn their “breakage” reputation.
Verdict: Which One for Your ROG Ally
SteamOS 3.9 is the right choice if your primary goal is the closest possible experience to what Valve ships on the Steam Deck, with official Valve support and a update story that requires no decisions. You are trading some flexibility and accepting that non-Deck hardware support, while now official, remains second-priority for Valve engineering. Residual edge cases (audio quirks on specific Ally X units, occasional suspend regressions) will be addressed on Valve’s timeline. If you own an Ally and want to forget it is running Linux, SteamOS 3.9 is the answer. Install via the SteamOS installer image from Valve’s site, which now explicitly supports the Ally.
Bazzite 43 is the right choice for the largest population of Ally users who want Linux but also want it to work correctly out of the box, stay working across updates, and offer enough extensibility to install Decky plugins and Flatpaks without feeling constrained. Bazzite ships more Ally-specific defaults (CPU Boost disabled, SMT suspend workaround, pre-configured HHD) than either alternative. The rpm-ostree model feels unfamiliar for the first week and then disappears into the background as an asset. Use the Bazzite ISO from bazzite.gg, select the handheld image, and flash it with Rufus or dd. The Handheld Wiki page for the ASUS ROG Ally is worth reading before and after install.
CachyOS Handheld Edition is the right choice if you already know Arch, you want pacman-level control over every package on the system, and you are genuinely interested in the LAVD scheduler’s frame-time improvements rather than treating them as abstract benchmarks. This is also the correct choice if you want to use the Ally as a general-purpose portable Linux computer — not just a gaming appliance — and want the full Arch toolchain available without distrobox mediation. Accept that you will occasionally need to repair a broken Gamescope session, maintain awareness of your BTRFS snapshots, and handle hardware workarounds manually. The payoff is real if you are that user.
None of these is wrong. The Ally’s hardware is well enough supported across all three that “pick one and install it” is now a reasonable instruction. The era of spending a weekend patching kernels to get the controller to register is over.
Sources
- SteamOS 3.9 Brings Official Support for ASUS ROG Ally and AMD Handhelds — Ubergizmo
- How to Install SteamOS on ROG Ally, ROG Ally X, Xbox Ally X — ROG Ally Life
- SteamOS Now Runs on Every AMD Handheld — XDA Developers
- 6 Things I Wish I Knew Before Installing SteamOS on My ROG Ally X — XDA Developers
- ASUS Handhelds — Bazzite Documentation
- Bazzite: Updates, Rollbacks, and Rebasing — Bazzite Documentation
- Comparison of Bazzite and SteamOS — Bazzite Documentation
- ublue-os/bazzite — GitHub
- CachyOS Handheld Edition Installation — CachyOS Wiki
- CachyOS Kernel Features — CachyOS Wiki
- sched-ext Tutorial — CachyOS Wiki
- CachyOS/CachyOS-Handheld — GitHub
- CachyOS Gets Experimental Handheld Edition for ROG Ally — GamingOnLinux
- hhd-dev/hhd: Handheld Daemon — GitHub
- SimpleDeckyTDP — GitHub
- XG Mobile Manager Decky Plugin for ROG Ally — ROG Ally Life
- The Best SteamOS Plugins for the ROG Ally — ROG Ally Life
- AllyCentre Decky Loader Plugin — GitHub
- ROG Ally Does Not Sleep Successfully — SteamOS Issue Tracker
- Xbox ROG Ally X Right Speaker Not Working — SteamOS Issue Tracker
- Mastering CachyOS Handheld: Ultimate Gaming Guide 2026 — FOSSLinux
Comments