Advanced power management plugin for handheld gaming PCs and AMD desktop APUs.
PowerDeck provides per-game, per-power-source TDP, CPU, and GPU tuning for handheld gaming PCs and AMD Strix Halo / Ryzen AI MAX mini-PCs. The plugin detects AC versus battery and applies the right profile automatically. Each game can have its own profile, so you get max performance on AC and longer battery life unplugged without touching settings.
Profiles are written as JSON files in ~/.config/powerdeck/profiles/ and survive plugin updates and reboots. The plugin runs as root because it talks directly to AMD's System Management Unit (SMU) via ryzenadj.
PowerDeck running on the AYANEO Flip:
- Real-time detection of AC adapter connection and removal
- Instant switching between AC and battery power profiles
- Per-game profiles with separate AC and battery configurations
- Automatic profile inheritance for games without custom settings
- Thermal Design Power (TDP) adjustment within safe hardware limits
- ACPI
platform_profileauto-detected when available (Nimo Axis, ROG Ally with amd_pmf, upcoming JELOS); PowerDeck shows a profile picker instead of a watts slider and lets the kernel/EC own TDP - Native TDP via
ryzenadjonly exposed when ACPI platform profiles are absent, Secure Boot is off, and/dev/memis usable - Watts-to-profile band mapping (
power-saver/balanced/performance) so existing watt-level profiles still apply cleanly on ACPI devices - CPU boost enable/disable for performance versus battery optimization
- CPU core count management for power efficiency
- CPU frequency governor selection
- CPU Energy Performance Preference (EPP) control via amd-pstate-epp
- Integrated GPU frequency control for Intel and AMD processors
- Minimum and maximum frequency range configuration
- Fixed frequency mode for consistent performance
- AMD
power_dpm_force_performance_levelswitching (with JELOS safety net) - Hardware-appropriate stepping for Intel GPU compatibility
- CPU simultaneous multithreading (SMT) control
- PCIe Active State Power Management configuration
- USB device power management
- System governor and EPP profile selection
- Individual profiles stored as JSON files
- Base profiles for general AC and battery use
- Game-specific profiles override base settings
- Profile settings survive device restarts and plugin updates
- Full TDP control on Ryzen AI MAX 300 series (Strix Halo, Zen 5)
tctl-tempthermal limit (the family has no APU skin temperature sensor)- Radeon 8060S / 8050S iGPU frequency control via amdgpu sysfs
- cTDP range 45-120W per AMD spec, up to 130W on some boards (Beelink GTR9 PRO, Framework Desktop)
- Works on JELOS via
iomem=relaxedkernel cmdline for direct SMU access
See STYLE_GUIDE.md for frontend conventions (slider primitives, colour palette, section ordering, icon mapping) and AGENTS.md for backend module layout, build commands, and the per-feature commit checklist.
This project is licensed under the GNU General Public License v3.0. See the LICENSE file for complete terms.
- AYANEO handheld devices (2S, Air Pro, Flip KB / DS / 1S, and others)
- ASUS ROG Ally and ROG Ally X
- Lenovo Legion Go (original and Legion Go S)
- Generic AMD handhelds with supported processors
- Generic Intel handhelds with integrated graphics
- ASUS ROG Flow Z13 (2025) — GZ302
- Nimo Axis N161L
- Framework Desktop
- Beelink SER9 / GTR9
- Minisforum AI X1 / MS-A2
- HP Z2 Mini G1a
- Any other AMD Strix Halo system with DMI detection or via
strix_halo_desktopfallback
- Generic AMD systems with
ryzenadjsupport - Generic Intel systems with RAPL power capping
Ryzen AI MAX 300 Series (Strix Halo, Zen 5 desktop APUs)
- Ryzen AI MAX+ 395 (16C/32T, Radeon 8060S 40 CU, cTDP 45-120W)
- Ryzen AI MAX+ PRO 395 (16C/32T, Radeon 8060S 40 CU)
- Ryzen AI MAX 390 (12C/24T, Radeon 8060S)
- Ryzen AI MAX 385 (8C/16T, Radeon 8050S 32 CU)
- Ryzen AI MAX PRO 380 / 385 / 390
Ryzen AI 300 Series (Strix Point / Krackan Point, Zen 5 mobile)
- Ryzen AI 9 HX 370 / HX 375 / HX PRO 370 / HX PRO 375
- Ryzen AI 9 365
- Ryzen AI 7 350 / PRO 350 / PRO 360
- Ryzen AI 5 330 / 340 / PRO 340
Ryzen Z2 Series (handhelds)
- Ryzen Z2 Extreme
- Ryzen AI Z2 Extreme
- Ryzen Z2
- Ryzen Z2 A
- Ryzen Z2 Go
Ryzen Z1 Series (handhelds)
- Ryzen Z1 Extreme
- Ryzen Z1
Ryzen 7000 / 8000 / Phoenix / Hawk Point Series
- Ryzen 7 7840U / 7640U / 7540U / 7440U (Phoenix)
- Ryzen 7 7840HS / 7640HS (Phoenix-HS)
- Ryzen Z1 / Z1 Extreme
Steam Deck
- AMD Custom APU 0405 (LCD)
- AMD Custom APU 0932 (OLED)
Other AMD processors with ryzenadj SMU support and integrated graphics
- 8th through 13th Generation Intel Core processors with integrated graphics
- Intel Iris Xe / Iris Plus graphics support
- Various Intel processors with RAPL power capping
- SteamOS 3.0 or later (Decky Loader required)
- JELOS (SteamOS Holo variant) with
iomem=relaxedkernel cmdline for Strix Halo SMU access - SteamFork 3.8+ (jelos-manager daemon supports DBus power negotiation)
- Linux distributions with sysfs interface support and
ryzenadjavailable
- Handheld gaming device with supported AMD or Intel processor, OR
- AMD Strix Halo (Ryzen AI MAX 300 series) desktop / mini-PC
- Integrated graphics (AMD RDNA / RDNA 2 / RDNA 3 / RDNA 3.5 or Intel Iris Xe)
- At least 10MB available storage space
- Decky Loader plugin system
- Python 3.8 or later
ryzenadjutility for AMD TDP control (auto-installed on most distros; JELOS ships 0.19+)- Linux kernel with sysfs power management interface (
/sys/class/drm,/sys/devices/system/cpu/cpufreq) amd-pstate-eppdriver recommended for full EPP control on Zen 2+
- Secure Boot must be disabled in BIOS/UEFI for native (ryzenadj) TDP control. When Secure Boot is enabled and ACPI
platform_profileis unavailable, PowerDeck falls back toamd-pstate-eppgovernor/EPP only (no watt-level control). - Devices exposing ACPI
platform_profile(Nimo Axis, ROG Ally with amd_pmf, upcoming JELOS) get full TDP control regardless of Secure Boot because the kernel/EC handle it. - Root access required (plugin operates with elevated privileges; runs as root via Decky Loader)
/dev/memMMIO access forryzenadj(configured automatically on JELOS)
curl -L https://raw.githubusercontent.com/fewtarius/PowerDeck/main/install.sh | shAfter running the installer:
- Restart the Decky Loader service:
sudo systemctl restart plugin_loader - Reboot to ensure all components are loaded
- Access PowerDeck through the Decky Loader overlay
-
Download the latest release:
wget https://github.com/fewtarius/PowerDeck/releases/latest/download/PowerDeck.zip
-
Extract to the plugins directory:
sudo unzip PowerDeck.zip -d $HOME/homebrew/plugins/PowerDeck sudo chown -R deck:deck $HOME/homebrew/plugins/PowerDeck
-
Restart services:
sudo systemctl restart plugin_loader sudo reboot
- Open the Decky Loader overlay (Quick Access menu)
- Look for PowerDeck in the plugins list
- The plugin should display your device and current power settings
- Test AC power detection by plugging or unplugging your adapter
- Verify TDP control: open a game profile and adjust the TDP slider, then check
ryzenadj -ito confirm the SMU picked up the change
Plugin not appearing in Decky Loader:
- Verify Decky Loader is installed and running
- Check that plugin files are in the correct directory
- Restart the plugin loader service
TDP control not working on AMD:
- Check
ryzenadj -ifrom a shell — if it errors with "PCI Bus is not writeable", Secure Boot is on or the kernel lacksiomem=relaxed - Verify
ryzenadjis installed and accessible:which ryzenadj - Check that the plugin has root privileges (Decky Loader runs as root by default)
- On Strix Halo, the
--apu-skin-tempoption is unsupported (PowerDeck detects this and skips it automatically); checkjournalctl -u plugin_loaderfor "Skipping --apu-skin-temp" messages
Profile changes not persisting:
- Confirm write permissions to
~/.config/powerdeck/ - Verify sufficient disk space for profile storage
Wrong CPU detected (e.g. Ryzen AI MAX 395 showing up as 3950X):
- This was a bug in v1.0.47 and earlier. v1.0.48+ detects Ryzen AI families correctly. Upgrade.
TDP slider doesn't move on Strix Halo:
- PowerDeck v1.0.47 had a bug where
--apu-skin-tempwas passed unconditionally and caused ryzenadj to exit with rc=255 even when STAPM/PPT writes succeeded. Fixed in v1.0.48. Upgrade.
-
Stop the plugin loader:
sudo systemctl stop plugin_loader
-
Remove plugin files:
sudo rm -rf $HOME/homebrew/plugins/PowerDeck -
Remove configuration data (optional):
rm -rf ~/.config/powerdeck -
Restart the plugin loader:
sudo systemctl start plugin_loader
The device returns to default power management behavior after the next reboot.


