Ryzen Control Center is a GUI frontend for RyzenAdj on Linux (and maybe Windows, eventually).
The app is focused on being friendly and beautiful before being lean and mean. Thus, it is written in Electron. Yeah, sue me. I'm a web developer. All I have is this TypeScript-shaped hammer.
As I am likely to continue owning my Ryzen 5000 series laptop for quite some time, I do have loose long-term plans for a D-Bus daemon, ryzend (written in Go), which could be controlled by a small python ayatana tray client instead of a colossal hulking Electron app (that you have to admit, is at least pretty)
Inspired by the now-deprecated Ryzen Controller, whose successor "Universal x86 Tuning Utility" is so universal that it does not run on Linux, and whose website commits the mortal sin of autoplaying a video with sound below the fold, and thus will not be mentioned again.
Built with Electron, Vite, React, Tailwind, and DaisyUI.
Development is focused on compatibility with latest Ubuntu, but the code is mostly platform-independent so a Windows version would be very little work (CI builds Windows binaries that run but are not actually wired to ryzenadj binaries)
Generate custom themes with the DaisyUI Theme Generator and simply paste them into the app. Use any DaisyUI theme you can find on the internet just as easily. Or, pick from any of the dozens of built-in themes.
more features probably coming eventually.
- per-interaction admin authentication (sudo/UAC) for getting and setting
ryzenadj - tray icon for showing current config and setting values*
- main window for editing current config and setting tray options**
- app runs with only tray icon after main window is closed
- settings persistence
- snap and AppImage packaging
*Tray only allows setting PowerSave/MaxPerformance.
**Tray does not actually expose any options for the main window to set, so, technically accurate (the best kind).
- Full config presets
- In-app documentation for each parameter
- Full light and dark mode support
-
.debpackaging
-
ryzenadjsnap packaging -
ryzenadjdsystemd service to run with admin privileges (allow non-root settings adjustment) - Integration with other power monitoring (e.g. show current battery draw,
powertopinteraction) -
asusctl/ROG Control Center integration - Ubuntu PPA packaging
-
.rpmpackaging
It should be straightforward. For details on various parameters, see the RyzenAdj docs.
By default, the "production" app logs at the INFO (3) log level. In development, it defaults to SILLY (0) (all messages).
To override the defaults, there are two flags:
-
DEBUG_LOG=true- sets log level toDEBUG (2) -
LOG_LEVEL=x- sets log level tox, wherexis a number 0-6:- 0: silly, 1: trace, 2: debug, 3: info, 4: warn, 5: error, 6: fatal
-
TODO: Allow toggling
DEBUG_LOGvia the UI
Due to an incompatibility between Ubuntu 25+, Node.js, and polkit, sudo operations called from a Node process can hang for a long time.
The issue is being tracked on the polkit github: #572
This can be worked around by setting a lower ulimit -Sn or ulimit -Hn value. The app will do this automatically if it detects it is running on Ubuntu 25+, or if either the ULIMIT_S or ULIMIT_H environment variables are set. These variables set the threshold value for each limit. If the system limit is above the threshold value, it will be clamped to the provided value. If the system value is below the threshold, it is not adjusted.
My system works fine with both clamping values set to 524288, so that's the default. Values can be as low as 1024.
SETTING VERY LOW OR VERY HIGH VALUES MAY CAUSE SYSTEM PROBLEMS. I TAKE NO RESPONSIBILITY FOR YOUR SYSTEM. USE THIS SOFTWARE AT YOUR OWN RISK
$ npm install$ npm run dev# For windows
$ npm run build:win
# For Linux
$ npm run build:linuxbe nice, stay woke; be gay, do crime; live long, and prosper.
(C) 2025 queenkjuul
Distributed under the terms of the GNU General Public License Version 3 (GNU GPL v3)
AMD, Ryzen, and the AMD logo are trademarks of Advanced Micro Devices, Inc.; this project claims no rights to these trademarks.

