Releases: Valkirie/HandheldCompanion
Build 0.28.4.6
Handheld Companion – Release Notes
0.28.4.6
Hotfixes
- Fixed an issue preventing CPU data from being read due to outdated LibreHardwareMonitor library and recent PawnIO update.
- Fixed an issue with PawnIO implementation due to lack of PCI Mutex.
- Fixed an issue causing TDPOverride values to be set to 0, potentially causing major stability and performance issues.
Build 0.28.4.5
Handheld Companion – Release Notes
0.28.4.5
Highlights
-
WinRing0/RyzenAdj to PawnIO (AMD power path): All AMD power manipulation (TDP, CPU clock frequency, GPU frequency, Curve Optimizer) has been moved off WinRing0/RyzenAdj and onto PawnIO. This should prevent any future Windows Defender warnings and make the whole stack more robust and cooperative with anti-cheat systems going forward.
-
Extra buttons on SDL controllers: We’ve updated the SDL controller database and added support for paddles and miscellaneous buttons on any SDL-supported controller. If your pad exposes extra buttons through SDL, HC can now see and bind them.
Hotfixes
-
0.28.4.3b: Fixed a regression with keyboard based OEM buttons.
-
0.28.4.4: Fixed support for PawnIO version 2.1.0.0.
-
0.28.4.5: Fixed simultaneous support for PawnIO versions 2.0.1.0 and 2.1.0.0.
Power & Dependencies
Please let us know if you notice any regressions or improvements on TDP manipulation (all devices) or Curve Optimizer (AMD specific).
PawnIO-based power path
We’ve replaced the RyzenAdj and WinRing0 dependencies with PawnIO for AMD power manipulation, covering:
-
TDP control
-
CPU clock frequency
-
GPU frequency
-
AMD voltage curve (Curve Optimizer)
This is aimed at eliminating WinRing0-related issues and Defender warnings, and giving us a cleaner, more maintainable power path going forward.
TDP handling improvements
- Improved overall TDP management so requested values are properly (re)applied instead of occasionally "sticking".
Controllers & Input
-
Improved SDL controllers support with an updated the gamecontroller database (12/02/2025) and support for paddles and miscellaneous buttons from generic SDL controllers.
-
Legion Go 2: M1 and Page/Desktop buttons are now properly integrated into the device mapping.
UI/UX & OSD
- On-screen display / RTSS: Added an RTSS frame graph to the on-screen display, giving you a clearer view of frame pacing and performance (thanks to @ltchipotle).
Navigation & interaction
-
You can now use the gamepad left joystick for UI navigation.
-
Miscellaneous tweaks and improvements to the Layout page for a smoother configuration experience.
Settings & window behavior
- New setting: Fullscreen on launch. ALT+ENTER now toggles the main window between windowed and fullscreen states.
- New setting: Show splash-screen at startup if you like the visual cue when HC launches.
QuickTools
- Added an "Exit HC" button to the QuickTools navigation bar to cleanly close Handheld Companion without having to fight against Windows task-tray icon.
Stability & Fixes
- Fixed an issue where Configurable TDP up/down could be set to 0, forcing TDP to an abnormally low value.
- Fixed AMD-specific Curve Optimizer availability checks so the feature is only exposed when supported.
- Fixed AMD integer scaling registry check/override by matching the currently active GPU while also making the integer scaling dropdown selection more robust.
- Fixed an issue preventing some inputs from being captured when the controller polling rate was set to 250 Hz and above.
- Fixed Legion Go 2 M1 button behavior, so the button now works as expected.
- Fixed a crash when failing to open the ONEXPLAYER serial port.
- Fixed a crash on null selectedProfile when navigating to the power profile page.
Library Updates
- SDL3
- LibreHardwareMonitor
- Sentry
- Microsoft.Xaml.Behaviors.Wpf
- System.Drawing.Common
- System.IO.Ports
- System.ServiceProcess.ServiceController
- System.Text.Json
Special thanks to
@ltchipotle for his support on WinRing0 migration
Release Build 0.28.3.3
Handheld Companion – Release Notes
0.28.3.3
Highlights
- UI/UX overhaul (Profiles + Layout): Redesigned pages for simpler navigation and reduced loading times, plus improved controller-first navigation across the app.
- NavigationView improvements: Main window navigation is now horizontal (use L1/R1), and embedded NavigationViews (as seen on the Layout page) now support L2/R2 navigation.
- Update interval (advanced latency tuning): New setting for advanced users to manipulate the controller update rate. Default is now 125 Hz (8 ms) instead of 100 Hz (10 ms), with options up to 1000 Hz (1 ms).
- Controller order management (better out-of-the-box experience): Controller order adjustment is now manual by default, with clear UI feedback (toast + icon) if your virtual controller is not on slot 1—helping avoid “why is my controller unresponsive?” situations.
UI/UX improvements
- Profiles page: Full UI refresh aimed at faster load and simpler day-to-day navigation.
- Layout page: Revamped layout experience and navigation, including easier access to advanced action configuration.
- Controller management UI polish: Controller management should behave the same as before, but now includes clearer interface text and notifications (updated across all supported languages), and a more understandable user flow around controller order and slot state.
- Quality-of-life: Added a library shortcut to edit controller layout when pressing the X button.
NavigationView controls:
- Main window: L1/R1 navigation (horizontal logic).
- Embedded views (Layout page): L2/R2 navigation.
Update interval (advanced latency tuning)
We’re adding a new setting for advanced users who want to manipulate the controller update rate. The new default is 125 Hz (8 ms), replacing the previous 100 Hz (10 ms).
Available options:
- 125 Hz ≈ 8.00 ms: very common for Xbox/XInput-class wireless + many older controllers
- 250 Hz ≈ 4.00 ms: very common for PlayStation over USB, and many wired third-party pads
- 500 Hz ≈ 2.00 ms: less common; some wireless/dongle implementations
- 1000 Hz ≈ 1.00 ms: common on competitive/PC-focused wired pads; some dongles
Higher rates may slightly increase CPU usage, but the goal is to give latency-focused users a straightforward, supported way to tune responsiveness.
Stability & Fixes
- Fixed a crash when calling ControllerManager.GetDefault().
- Fixed a crash when cloning an unsynced Layout (Clone()).
- Fixed SensorsManager suspend/resume handling across sleep.
- Fixed a race-condition crash in TimerManager.
- GPD Win 5: Added OEM buttons mapping support.
Library updates
- SDL: updated gamecontrollerdb and SDL 3.3.6.
Special thanks to
- @P3P0 (new layout functions + layout UI revamp)
- @mistakeplays (support to validate and land proper GPD Win 5 mapping)
Full Changelog: 0.28.3.1...0.28.3.3
Release Build 0.28.3.1
Handheld Companion – Release Notes
0.28.3.1
Highlights
- Voltage control (AMD & Intel): Implemented proper voltage control for both AMD and Intel devices.
- AMD: Works on all 4000-series SKUs and below. From the 5000-series onward, voltage control only works on Ryzen 9 or HX SKUs.
- Intel: Works as expected.
- Layout Editor upgrades: More reliable toggles and new automation options. Toggle state is now shared and matches the real status, action bindings can be delayed, and shift actions now support triggers (by @pepordev).
- Improved sleep behavior: Added Enhanced sleep to optimize modern sleep power policies, plus Go back to sleep to automatically send the device back to sleep when it wakes for reasons other than the power button (ported from SuspendedNTime by @BassemMohsen).
- Improved FSE support: HC main window and quick tools window will now properly be recognized and manipulated by FSE task manager.
Device & Controller Support
SuiPlay
- 0X1: Implemented device support for SuiPlay 0X1 (MYSTEN LABS, INC.).
GPD
- Win 5: Updated device max TDP to 85W and fixed gyrometer support.
- Win Mini (8840U, HX370 models): Fixed gyrometer support.
- Win Max (HX370): Fixed gyrometer support.
- AYANEO (all devices): Improved LED control (by @GopherTheCoder).
UI & Experience
Hotkeys
- New command: Controller status (Connected / Disconnected).
- New command: PowerShellCommands (execute multiline script content).
- UI: Ask before deleting hotkeys (confirmation prompt).
Layout Editor
- New layout action: Absolute mouse position.
- Added new action modifier key: LWin.
- Added support for shift combinations (by @pepordev).
Power & Process Handling
EnhancedSleep & ReSleep
- Ported Enhanced sleep, which optimizes modern sleep power policies.
- Ported Go back to sleep, which puts the device back to sleep when wake source is not the power button.
Stability & Fixes
- Fixed: AMD Adrenalin library (ADLX) NET10 support.
- Fixed: An edge case where profile's actions could end up with Turbo and Toggle enabled simultaneously.
- Fixed: Layout editor input duration slider not displayed.
- Fixed: Layout editor shift logic.
- Fixed: A rare crash when editing a layout.
- Fixed: Charge bypass logic for AYANEO Legacy and Modern device families.
- Fixed: AYANEO Air Plus EC logic.
- Fixed: An issue where the plugged controller wouldn't behave properly after a power cycling.
- Fixed: A rare crash on HotkeyViewModel where Hotkey command buttonflags would be null.
- Fixed: Creating a profile for explorer.exe will no longer try and get an artwork and proper name for it.
Library updates
- SDL3
- LibreHardwareMonitor
- RAMSPDToolkit-NDD
Special thanks to
- @pepordev (shared toggle state, delayed actions, shift triggers)
- @GopherTheCoder (AYANEO LED control fix)
- @BassemMohsen (EnhancedSleep / ReSleep port)
Build 0.28.2.3
Handheld Companion – Release Notes
0.28.2.3
Stability & Fixes
- Fixed an issue with ADLX_Probe, preventing AMD Graphics Settings from being available.
- Removed maximum configurable TDP limit on Device page.
Build 0.28.1.6
Handheld Companion – Release Notes
0.28.1.6 - Hotfix
Fixes
- Fixed crashes on a few devices (ONEX) due to incorrect OnScreenKeyboard device hotkeys
Build 0.28.1.5
Handheld Companion – Release Notes
0.28.1.5 - Hotfix
Fixes
- Fixed crashes on a few devices (GPD, AOKZOE and ONEX) due to missing UseOpenLib declarations
Build 0.28.0.0
Handheld Companion – Release Notes
0.28.0.0 - Gotta Go fast
Thanks to our audacious members, we have been able to accelerate the cycle of detecting and resolving issues, allowing us to devote time to improving performance and reducing CPU usage. In case you missed it, nightly-builds are now available roughly every few days to early adopters. With 0.28.0.0 we also added a workaround to the Windows Defender “Trojan:Win32/Vigorf.A” alert (WinRing0) issue by adding the affected files to Windows Defender exceptions list.
Improvements
Performance
- Reduced CPU usage across all action classes (Button, Axis, Triggers, Mouse, Keyboard, Gyro) and state classes (Button, Axis, Gyro).
- Reduced CPU usage when using Ambilight LED mode.
- Faster sleep resume: HC should resume components on system resume even if session is locked.
Device/Controller handling
- Reworked device/controller arrival–removal queuing and concurrency for HID/XInput.
- Per-device default hotkeys are created on first initialization.
- GuideCommands hotkey was replaced by ButtonCommands, allowing mapping to any gamepad button, not just Xbox Guide.
Navigation & UI
- Gamepad navigation refined across the app; main window A/B flow feels more natural.
- QuickTools: remembers last focused item, no longer targets the AppBarButton first, L1/R1 auto-enter the page, and L1/R1 now cycle within menu items.
- QuickTools Home & Applications UI refreshed.
- Layout Manager UI now uses SettingsExpander and SettingsCard components.
Profiles & Power
- New profiles inherit all buttons/axes by default, including OEM buttons (OEM set to Inherit).
- Users can now edit default power profiles.
- When launching a game from HC, HC waits longer for the profile-related executable to appear before minimizing itself.
- Revised Mouse actions acceleration logic, adding velocity memory logic.
Platforms & Devices
- Improved EA Desktop library support.
- ONEXPLAYER X1 (8840U) recognized with ProductName ONEXPLAYER X1z.
- (Tentative) ROG Ally PerformanceMode & AsusFan behavior improvements.
Setup
- Installer adds WinRing0x64.sys and HandheldCompanion.sys to Microsoft Defender exclusions.
Bugfixes
- Hotkeys: duplication on migration resolved; regression from ButtonState logic fixed.
- Legion Go S: fixed swapped LegionR/LegionL buttons.
- ZOTAC Gaming Zone: VRAM control fixed.
- ROG Ally: Xbox Adaptive Controller support fixed; fan & power management corrected.
- Profiles: version check that excluded profiles fixed; duplication when a library import finds multiple executables fixed; updates during resolution/refresh changes stabilized.
- QuickTools: transparency no longer lost after moving the window.
- Commands: GameBarCommands & DesktopCommands now work correctly.
- Controllers: tentative phantom-controller filtering; prevented SDL from randomly taking over XInput.
- Mapping/Input: button→trigger layout mapping fixed; gamepad input injection from hotkeys on dummy controllers fixed; OEM buttons now correctly inherit default layout.
- Dependencies: missing YamlDotNet library fixed.
- Events/Concurrency: asynchronous HID/XInput event handling issues fixed.
- Stability: rare UI rendering freeze fixed.
Full Changelog: 0.27.0.7...0.28.0.0
Build 0.27.0.7
Handheld Companion – Release Notes
0.27.0.7 - Hotfix
Bugfixes
- Fixed: Compiling issues
- Fixed: Controller management issues
- Fixed: WMI TDP Method on AMD based devices
- Fixed: InputsManager incorrect IsMapped check
Full Changelog: 0.27.0.6...0.27.0.7
Build 0.27.0.6
Handheld Companion – Release Notes
0.27.0.6 - Game Library, New Devices & Smoother Experience
0.27.0.6 is a big milestone for Handheld Companion. This version introduces a brand-new game library system, better support for new handhelds, and a more comfortable experience with QuickTools and profiles. On top of that, we’ve made improvements to power management, cooling, and overall stability.
A New Game Library
We’ve started integrating GameLib.NET, a powerful library that makes managing games easier and more reliable. Installed games from most popular platforms (BattleNet, Epic, GOG, Origin, Riot Games, Rockstar, Steam and Ubisoft Connect) are recognized and displayed in your library. Box art and covers are also automatically fetched from either IGDB or SteamGrid.
Profiles with Executables
Until now, a profile was linked to a single executable and applied when that executable was in the foreground. This logic caused limitations with platforms such as Steam, where applications did not reveal their main executable, but instead reported the entire stack of executables (could be a dozen). Now, a single profile can include multiple executables. This means you can cover all possible executables for a game if you're not sure which one is the right one, or even decide to share the same profile between unrelated applications and games if you want them to use the same settings or layout.
Device Support
Device coverage continues to grow, with three major additions in this release.
- Zotac Gaming Zone is fully supported, including back buttons, joystick wheels, FAN and LED management as well as VRAM and TDP control.
- Lenovo Legion Go S is fully supported.
- MSI Claw A8 is fully supported.
Power and Cooling
Until now, Handheld Companion exposed a single slider to manage both PL1 (sustained power limit) and PL2 (short boost power limit). According to recent report on Intel’s new Lunar Lake CPUs, when PL1 and PL2 are set to the exact same value, performance can actually drop by up to 30%. Intel’s own specification requires PL2 to be at least 1 W higher than PL1 to allow the CPU to boost correctly.
With 0.27.0.2, we have brought back the long-gone ability to set PL1 and PL2 separately. This is available on all CPUs, both AMD and Intel, giving users fine control while preventing performance regressions.
We have also improved the software fan management logic, making cooling more responsive and stable when users pick the software fan option in their power profile.
QuickTools and Profiles
Our in-game overlay, QuickTools, UI has been improved to feel more user-friendly. It can now be placed at the bottom center of the screen and features an optional open/close animation. The interface has also been refreshed for clarity and ease of use.
We’ve also added a set of shortcuts within the Profiles page to open and navigate the main window directly to the currently applied profile's page or layout page. These changes make adjusting profiles and layouts much faster during gameplay.
Bugfixes and Miscellaneous Improvements
- Fixed: process detection on QuickApplicationsPage
- Fixed: silenced key chords not being caught during hotkey listening
- Fixed: race condition within controller manager
- Fixed: Race condition on controller manager that may cause a crash on rare occasions
- Fixed: Quicktools Acrylic and Tabbed backdrops not applying properly
- Fixed: Crash on corrupted profiles
- Fixed: Framerate limit settings not available due to RTSS detection
- Fixed: Incorrect inputs mapping when using desktop layout
- Fixed: Restored MSI Claw dynamic lighting capacities (also added Ambilight capacity)
- Prevented critical system processes from appearing in Quick Applications
Miscellaneous Improvements
- Improved: Library management executables filtering
- Improved: New Quicktools backdrop setting to turn Noise on/off
- Improved: Process detection when starting application from Library or Profiles page
- Improved: Reduced CPU and Garbage Collector pressure from Layout manager
- Improved controller management (event logic, robustness, add/remove status, startup behavior)
- Improved input management (threading logic, prevents UI from hanging)
- Improved Fan math and coding logic
- Improved Intel microarchitecture detection
- Improved executable startup (Run / RunAs option from profile page)
- Improved LibraryPage tiles layout and page loading logic
- Improved FanProfile logic (restore, handling, UI)
- Improved HID device detection, hiding/unhiding
- Updated SDL3 to 3.2.20
- Updated LibreHardwareMonitorLib
- Updated gamecontrollerdb.txt with new entries
- Miscellaneous UI cleanups, refactoring, and minor fixes across the application
New Contributors
Full Changelog: 0.26.0.2...0.27.0.6