Open-source project
dmitry-s93/MControlCenter avatar
dmitry-s93/MControlCenter

MControlCenter: switching an MSI laptop's power modes on Linux

An application that allows you to change the settings of MSI laptops running Linux

720 stars100 forksC++GPL-3.0

At a glance

What is it?
MControlCenter is a Qt application that reads and writes the embedded controller of an MSI laptop from Linux, so the performance modes, the battery charge limit and the fan curve are adjustable without going back to the manufacturer's Windows software. It depends on the msi-ec kernel driver, and the driver, not the app, decides which laptops work.
Who is it for?
Adopt MControlCenter if you own an MSI laptop on Linux and you want the performance modes and the battery charge limit under your control rather than baked into the firmware defaults, since the app writes the same embedded controller the manufacturer's own utility does. Keep away if your machine is not in the msi-ec supported list, because the app cannot add support by itself, and stay away on immutable distributions, where the necessary drivers cannot be installed.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 47 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A Qt app that talks to the laptop's embedded controller

MControlCenter is a free and open source GNU/Linux application that allows you to change the settings of MSI laptops. The primary language is C++ with a Qt interface, the licence is GPL-3.0, and the default branch is main.

The feature list is what a laptop control centre does. There is CPU and GPU temperature display and fan speed display. There is switching between modes, which has been there since version 0.2: High Performance, Balanced, Silent and Super Battery. There is automatic mode switching based on charger status and the system power profile, so plugging in changes the mode without you asking. There is a setting for the maximum battery level limit, which is the feature most people want from a Linux laptop utility. And since version 0.4 there is advanced fan speed control, along with other settings such as keyboard backlight mode and USB Power Share.

The interesting part is what it is not. It does offer fan curve control, but it is not a tool for undervolting. It is a front end onto the settings an MSI laptop's embedded controller already exposes, which is why it works on Linux at all when the manufacturer's own utility does not.

The repository layout matches that: a CMakeLists.txt at the top, a src/ directory for the application, a resources/ directory, a scripts/ directory with the build and install scripts, a docs/ directory, and a CHANGELOG.md. There are no GitHub releases beyond the tagged ones, with 0.5.1 published on 2025-07-18, 0.5.0 on 2025-01-12 and 0.4.1 on 2023-08-09, and the last push was on 2026-09-06.

There is also a TODO list with one item on it, saving multiple fan speed profiles, which tells you how the fan control is currently shaped.

The driver is the real dependency

Since version 0.5.0 the app uses the msi-ec driver that comes with the Linux kernel, and you need to reinstall the driver. The consequence is stated plainly: device support depends on whether the kernel driver supports your device or not.

So the list of supported laptops is not the maintainer's list, it is the msi-ec list, and the README links a discussion on the msi-ec project with the tested devices. If your device is not on it, the instructions are to follow the steps on the msi-ec GitHub page and open an issue there to add support.

That is the right structure for the problem. The embedded controller protocol differs between laptop models, and the work of reverse engineering and writing a kernel driver for each family is a much larger project than the GUI on top of it. Splitting it that way means a model that gets kernel support gains the whole application for free.

There is a pre-installation check that tells you where you stand. You look at the output of cat /sys/devices/platform/msi-ec/shift_mode, and if it says No such file or directory, you need to install or reinstall the msi-ec driver, uninstalling first and then installing. The README's warning about this is that the application will open but will have limited functionality.

Two other prerequisites are stated. If you are not installing from packages you need libqt6widgets6 or its equivalent on your distribution, qt6-base for example, and the application will fail to open without it. And for temperature and fan curve support you need ec_sys, which comes installed on most distributions, or acpi_sys on Fedora with write_support=1, though the app can still work with only msi-ec installed.

Packages, and the distributions where it will not work

The installation section is organised by distribution, and the distributions where it does not work are documented as carefully as the ones where it does.

For Ubuntu, Mint and openSUSE without Debian, you download the package for your distribution from the releases page, double click it to open it in the software manager such as Discover or GNOME Software, and install it.

For Arch there is an officially maintained package named mcontrolcenter-bin in the AUR, installable with any AUR helper, and the README gives the command as yay mcontrolcenter-bin. The generic installer from the releases page is the fallback.

For Fedora there is an official COPR repository, and the README gives the two commands to enable it and install the package. There is a catch, though. If you did not use that method, because you built from source or used the generic installer, some extra steps are needed since Fedora does not come with the ec_sys module by default. Those steps are to install dkms and make, and specifically the kernel-devel, dkms and make packages, clone a separate repository, change into it, run its install script with sudo, and reboot.

And then the list of unsupported distributions, which is the most useful part of the installation section for anyone deciding whether to try. Debian is listed because for some reason they did something weird with ec_sys and the related functions do not work. NixOS has the app packaged in the repos, but the maintainer does not look after the package, so do not report bugs. And all immutable distributions, meaning SteamOS, Bazzite, Fedora Silverblue and others, because the necessary drivers cannot be installed.

That last point is architectural rather than a packaging gap. An immutable system is designed so that you cannot change the kernel, and this application needs a kernel module that is not in the stock image, so the two are incompatible in principle.

The current packages are built using the Open Build Service, which is the same infrastructure the openSUSE packages come from.

The generic installer, and what it takes to build from source

If your distribution is not listed, the README says to try the generic installer, which is a four step process. You download the tar.gz from the releases page, unpack the archive with the program, open a terminal in the unpacked directory, and run the script with sudo ./install. There is an optional sudo ./uninstall step to remove it later, and the README notes that in some cases building from source can be a good option too.

Building from source has its own dependency list. After installing the main Qt package, you need the development tools: qt6-base-dev and/or qt6-tools-dev plus build-essential on Ubuntu and Linux Mint, qt6-tools on Arch, and qt6-qttools on Fedora.

Then the build is a set of scripts in a scripts/ folder inside the source archive, run in order, first the build script and then the create installer script. If that worked you get a compressed file, which you extract, and inside the new folder you run the INSTALL script as sudo, with the last line confirming the install worked. The README is careful about the order here: run the UNINSTALL script first, which might fail if you do not already have the app installed, and that failure is fine.

One practical warning before you start. Make sure the app is completely closed if it was installed before, and the check is to look for a system tray icon and close it.

And the diagnostic step at the end. If the installation succeeded but the app fails to run, open a terminal, type mcontrolcenter, copy the output and open an issue, unless there is already one.

The extra tweaks, and where other tools take over

Several things this app does not cover are documented as workarounds involving other projects, and the reasons are usually hardware wiring rather than omissions.

For laptops with a dedicated Nvidia graphics card, the power limits do not react to performance mode changes. The fix is to use the Nvidia proprietary driver and to enable and start the nvidia-powerd service with systemctl enable --now, then reboot. Laptops with AMD discrete GPUs, usually the AMD Advantage models, need no steps at all, because power limits and smartshift functionality work correctly with each performance mode.

For RGB keyboards the answer is OpenRGB, with the advice to use the latest version if your distribution ships an old one. The reason is given: regular laptops with only one colour can be controlled directly by the app, but RGB keyboards are wired over USB, which is why openRGB is needed.

For MUX switching, on laptops with a discrete GPU and a mux switch, the workaround is to install supergfxctl and pair it with a widget, the plasmoid for KDE or the GNOME extension. Note the tooling comes from the Asus Linux project, even though the laptop may be an MSI.

So the division of labour is clear. MControlCenter owns what the embedded controller exposes, and other projects own what the GPU driver, a USB keyboard controller or a vendor-specific switch owns. The app does not try to be a single settings surface for the whole laptop, and the README is honest about where its responsibility stops.

Editorial conclusion

Adopt MControlCenter if you own an MSI laptop on Linux and you want the performance modes and the battery charge limit under your control rather than baked into the firmware defaults, since the app writes the same embedded controller the manufacturer's own utility does. Keep away if your machine is not in the msi-ec supported list, because the app cannot add support by itself, and stay away on immutable distributions, where the necessary drivers cannot be installed. Before you install, check that the msi-ec shift_mode file exists on your system, and note the last push was on 2026-09-06 with the newest release 0.5.1 from 2025-07-18.

Frequently asked questions

What can MControlCenter change on an MSI laptop running Linux?

It shows CPU and GPU temperature and fan speed, switches between High Performance, Balanced, Silent and Super Battery modes, can switch modes automatically on charger status or system power profile, sets the maximum battery charge limit, and since version 0.4 offers advanced fan speed control plus settings such as keyboard backlight mode and USB Power Share.

Why does MControlCenter not work on my laptop?

Since version 0.5.0 the app relies on the msi-ec kernel driver, so support depends on whether that driver covers your device. The README links the tested device list on the msi-ec project and asks you to open an issue there for a new model, and it also notes that the app will open with limited functionality if the driver is missing.

How do I install MControlCenter on my distribution?

Ubuntu, Mint and openSUSE use the package from the releases page opened in your software manager, Arch has an officially maintained AUR package called mcontrolcenter-bin, and Fedora has an official COPR repository you enable with dnf copr enable before installing. Otherwise there is a generic installer in the releases page that you unpack and run with sudo ./install.

Which distributions are known not to work with MControlCenter?

Debian, because the ec_sys related functions do not work there, NixOS, where the app is packaged but the maintainer does not look after the package, and all immutable distributions including SteamOS, Bazzite and Fedora Silverblue, because the necessary drivers cannot be installed.

Official sources

  1. dmitry-s93/MControlCenter on GitHub
  2. Issues
  3. License: GPL-3.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/dmitry-s93-mcontrolcenter.svg)](https://hysenlabs.com/projects/dmitry-s93-mcontrolcenter)

Was this useful?