A small utility that supports defining your own fan-curve and changing the power-profile.
Inpired by amdgpu-fancontrol, but I wanted a UI.
My Vega56 automatic fan control under linux runs way to hot and radeon-profile for some reason segfaults on my machine, so I used amdgpu-fancontrol, which worked like a charm, but I wanted the following features:
- GUI
- SUID root for the executable so I can start it without using sudo
Also, I wanted to learn a new GUI-Framework with a simple project, that's why this one uses fyne.
| GUI | Terminal |
|---|---|
![]() |
![]() |
All relevant information about the used files comes from AMDGPU Documentation.
- Download the latest release binary or compile it yourself (see build fanmi section).
- (optional) Make the binary launch as root without sudo (
sudo chown root:root ./fanmi && sudo chmod u+s ./fanmi)
The configuration file is in JSON.
You can provide a path to a configuration file with -config [path/to/file].
The default path will be displayed when usnig the -help argument. It should be something like /home/[USERNAME]/.config/fanmi/config.json.
Here are some configuration file examples:
The configuration file may contain the following properties:
| Property | default value | |
|---|---|---|
| checkIntervalMs | 3000 | How often to measure (and update) fan speed (in milliseconds) |
| minChange | 2.0 | The minimum change that needs to bemeasured (in °C) before a different speed is set |
| powerMode | "" | The powermode ("auto", "high", "low") of the graphics card |
| curves | default* | Map of named fan curves |
| curve | "default" | The curve active at start-up |
| maxStepUp | 4.0 | The maximum upwards % change of the fan per checkIntervalMs |
| maxStepDown | 2.0 | The maximum downwards % change of the fan per checkIntervalMs |
You can have three UI-options:
--ui graphic- GUI - (Default) Shows a window with temperature, fan-speed and option to switch on/off and a power profile dropdown--ui console- Console - Prints out temperature and fan-speed on the console - press space to switch on/off, 'a', 'l', 'h' to switch power profile, 'c' to change the curve and 'q' or ctrl-c to exit--ui none- No output
If you want to change the fan-curve, you can create a configuration file in JSON.
Either provide the path to the file as CLI-argument (--config "path/to/config.json"), or put it at the default location, which you can find by invoking fanmi with --help. (Should be /home/[USERNAME]/.config/fanmi/config.json on most systems.)
You can define multiple curves in a configuration file.
The default fan curve looks like this:
| Temp | Speed |
|---|---|
| 40° | 0% |
| 60° | 20% |
| 80° | 50% |
| 85° | 70% |
| 90° | 100% |
Which corresponds to the following map in the configuration file:
"curves": {
"default": [
{
"Temp": 40,
"Speed": 0
},
{
"Temp": 60,
"Speed": 0.2
},
{
"Temp": 80,
"Speed": 0.5
},
{
"Temp": 85,
"Speed": 0.7
},
{
"Temp": 90,
"Speed": 1
}
]
}When using the console-UI, you can use the following keys:
| Key | Action |
|---|---|
| [SPACE] | Activate/deactivate |
| a | Set power-profile to "auto" |
| h | Set power-profile to "high" |
| l | Set power-profile to "low" |
| c | Switch to next curve |
| q | Quit |
In addition to printing the error message to stderr, the application exits with an exitcode describing the problem:
| Code | Description |
|---|---|
| 1 | Could not open device |
| 2 | Could not find decive |
| 3 | Could not find at least one compatible device |
| 4 | Could not determine current user |
| 5 | You do not have (effective) root permissions |
| 6 | Could not read temperature |
| 7 | Could not write to file |
| 8 | Could not write fan speed |
| 9 | Could not read fan speed |
| 10 | Could not find user config directory |
| 11 | Could not read configuration file |
| 12 | Could not parse configuration file |
| 13 | No fan curves found |
There are three ways to build fanmi:
- The normal way:
go build -o bin/fanmi app/*.go - Build and make the executable file SUID root:
util/build.sh - Build, compress and make the executable file SUID root:
util/build.sh release
See util/build.sh for the steps.
- The app sometimes hangs after pressing ctrl-c when using the GUI
- Debug output (
-v) and console-UI are not compatible
- The Configuration should be editable in the GUI
- A graphic representation (chart) of the fan curve
- Minimize to systray (this is supported by fyne, but does not work on my system)
- Autostart feature (maybe this should just be part of the documentation)


