Acer Nitro Perfect Fan — Linux + systemd fan control for Acer Nitro 5.
systemd daemon → shared JSON → Python stdio bridge → Electron dashboard.
Supported models (same EC map, upstream acer-nitro-ec):
- Acer Nitro 5 AN515-44
- Acer Nitro 5 AN515-46
- Acer Nitro 5 AN515-54 — fully tested (development machine)
- Acer Nitro 5 AN515-56
- Acer Nitro 5 AN515-57
- Acer Nitro 5 AN515-58
- Acer Nitro 5 AN517-55
Other laptops: install nbfc-linux and a matching profile — see Other laptops (NBFC).
Nitro theme (default):
OutRun theme (Settings → Theme):
| Start here | |
|---|---|
| Never used a terminal? | INSTALL.md (copy-paste) |
| Po polsku | INSTALL_PL.md · README_PL.md |
| Compatible models | COMPATIBLE-MODELS.md |
| Diagnose a machine | ./check-system.sh (read-only) |
Safety. Manual fan control can overheat and damage hardware. CPU PWM is hard-clamped to 30% (daemon + API + GUI). GPU may still use Zero-RPM when cool. Use at your own risk.
Windows and macOS are not supported.
Fans (daemon — starts at boot, GUI not required afterwards)
- Cooling profiles: Silent / Balanced / Turbo with independent CPU & GPU curves
- Custom curve editor: temperature (°C) → speed (%) with live preview
- Manual PWM: master + per-fan sliders (CPU floor 30%, GPU may go to 0% in dynamic mode)
- GPU Zero-RPM hysteresis: stop below ~40°C, restart above ~48°C
- EMA smoothing: fast ramp-up, slow spin-down
CPU power profile (sidebar — Eco / Quiet / Balanced / Sport / Max)
- Changes CPU turbo and power caps through a separately installed DAMX daemon, independent of fan curves
- Pick it once. DAMX stores it and reapplies it at login/boot — you do not need to leave this window open
- Without DAMX the rest of the panel still works; those five buttons stay offline
Keyboard backlight (Settings, AN515-54 + acer-nitro-ec)
- Levels Off / 25 / 50 / 75 / 100, plus optional “turn off after 30 s”
- Written straight to the Embedded Controller. Set it once; it stays after reboot with this program closed
- On stock Linux the firmware only offered BIOS-off or a 30 s timeout, and every boot came back at 100%. This panel is the missing “keep my level” control
Interface
- Two color themes: Nitro (default) and OutRun — Settings → Theme, remembered after restart
- System tray, i18n (PL / EN / ES / DE / CS)
- Optional CSV telemetry — Statistics: temperature summary, daily report (one local calendar day at a time), view logs, delete logs (with confirmation)
- Connection badge: online / offline when the Python bridge is silent
The daemon picks a backend at start (backend in /etc/nitro-fan/config.json, default auto):
acer_nitro_ec— hwmonpwm1/pwm2(preferred when the module is loaded)nbfc— nbfc-linux socket, if the kernel module is missing
auto will not drive NBFC while acer_nitro_ec exists. That avoids two writers on the same EC.
| Model | Status |
|---|---|
| Acer Nitro 5 AN515-54 | Fully tested (development machine) |
Upstream DKMS only loads on:
| Model |
|---|
| Acer Nitro 5 AN515-44 |
| Acer Nitro 5 AN515-46 |
| Acer Nitro 5 AN515-54 |
| Acer Nitro 5 AN515-56 |
| Acer Nitro 5 AN515-57 |
| Acer Nitro 5 AN515-58 |
| Acer Nitro 5 AN517-55 |
This repo can add these extra models (regs_an515_46 — not fully verified):
| Model |
|---|
| Acer Nitro 5 AN515-51 |
| Acer Nitro 5 AN515-55 |
| Acer Nitro 5 AN517-51 |
| Acer Nitro 5 AN517-54 |
sudo ./acer-nitro-ec/apply.sh
./check-system.shOther laptops can use this program too — same GUI, same fan curves. You must install nbfc-linux yourself, and your model must already have a working NBFC profile. This app does not invent fan control for unknown hardware.
| Your machine | What you need |
|---|---|
| Acer Nitro 5 AN515-54 (and the list above) | acer_nitro_ec is enough. NBFC is optional. |
Another laptop listed in nbfc config -l |
Install nbfc-linux, start nbfc_service, select your profile, set "backend": "nbfc". nbfc-linux ships ~180 configs. |
| Laptop not on that list, desktop, Windows, macOS | Not supported. |
Do not install this repo’s Acer Nitro AN515-54.json on a different model. Pick the profile that matches your DMI name (nbfc config -l).
Not claimed for the kernel module: Predator, Helios, Nitro V (different EC or WMI). They work here only if nbfc-linux already has a config for that exact model.
See NBFC for commands.
grep -H . /sys/class/hwmon/hwmon*/name | grep acer_nitro_ec
ls -l /run/nbfc_service.socketThis dashboard started as a fork of keizenx/nitro-fan-control (MIT). That app is a GUI in front of NBFC. This repo keeps a similar Electron UI; the daemon prefers acer_nitro_ec and can drive nbfc-linux when the kernel module is missing.
File names nbfc_control_api.py and nbfc_config.json are historical. They are this project's JSON/stdio bridge and default curves, not NBFC service files. The real NBFC laptop profile lives in nbfc/.
| This project | keizenx/nitro-fan-control | |
|---|---|---|
| Role | Daemon + GUI | GUI only |
| Fan backend | acer_nitro_ec or nbfc-linux (auto) |
NBFC / hirschmann/nbfc |
| Who writes the EC | daemon → hwmon, or daemon → nbfc_service |
nbfc_service / nbfc.exe |
| OS | Linux + systemd only | Linux and Windows |
| Extra kernel module | acer-nitro-ec (DKMS) for the hwmon path |
ec_sys / acpi_ec (write_support=1) |
| Curves | Interpolated °C→% editor, EMA, 30% CPU floor, GPU Zero-RPM | NBFC step thresholds; Silent/Balanced/Turbo as preset targets |
| Model coverage | patched AN515/AN517 list, plus any nbfc-linux config | Any laptop with an NBFC config (~180 models) |
| Packaged GUI | AppImage / .deb — daemon still required |
AppImage / .deb / Windows installer |
Use this project on Linux. Use keizenx + NBFC when you need Windows.
┌─────────────────────────────────────────────────────────────┐
│ Electron Dashboard (GUI) │
│ preload.js bridge · contextIsolation · Chart.js │
└──────────────────────────────┬──────────────────────────────┘
│ IPC + Python stdio JSON
┌──────────────────────────────▼──────────────────────────────┐
│ Python API (nbfc_control_api.py) │
└──────────────────────────────┬──────────────────────────────┘
│ /etc/nitro-fan/config.json
┌──────────────────────────────▼──────────────────────────────┐
│ Daemon (nitro_fan_daemon.py / acer-nitro-perfect-fan) │
│ fan_backend.py (auto detect) │
└───────────────┬─────────────────────────────┬───────────────┘
│ hwmon pwm1/pwm2 │ UNIX socket
┌───────────────▼───────────────┐ ┌─────────▼──────────────┐
│ Kernel: acer_nitro_ec │ │ nbfc_service (EC) │
└───────────────────────────────┘ └────────────────────────┘
Full copy-paste walkthrough: INSTALL.md.
git clone https://github.com/Kaspral1/Acer-Nitro-Perfect-Fan.git
cd Acer-Nitro-Perfect-Fan
./check-system.sh
# need a backend first: acer_nitro_ec or nbfc_service
sudo ./install.sh
cd gui-app && npm install && npm startinstall.sh copies the daemon to /usr/local/lib/acer-nitro-perfect-fan/, writes /etc/nitro-fan/, installs udev 99-acer-nitro-ec.rules, and enables acer-nitro-perfect-fan.service.
Optional AppImage / .deb: cd gui-app && npm run dist. The packaged GUI still needs the system daemon.
sudo ./uninstall.shStops the service, restores EC auto, removes unit/files/udev/config and the service user. The clone and node_modules stay.
Emergency: ./restore-auto.sh or sudo systemctl stop acer-nitro-perfect-fan.service.
{
"mode": "dynamic",
"backend": "auto",
"profile": "Silent",
"auto_logging": true,
"curves": {
"cpu": [[45.0, 30.0], [65.0, 30.0], [72.0, 40.0], [80.0, 60.0], [88.0, 100.0]],
"gpu": [[50.0, 30.0], [58.0, 30.0], [68.0, 35.0], [75.0, 55.0], [85.0, 100.0]]
},
"manual_speeds": {
"0": 30.0,
"1": 30.0
}
}backend:auto(default),acer_nitro_ec, ornbfcmode:dynamic(curves) ormanual(fixed PWM frommanual_speeds)- Fan
0= CPU, fan1= GPU - Curve points and manual speeds below 30% are raised to 30% (GUI, API, daemon)
speed_offset(optional, default0): permanent CPU vs GPU boost (−50…+50). Positive adds to CPU; negative adds to GPU.
NoteBook FanControl talks to the laptop Embedded Controller directly. That is how this program can drive other laptops, not only Acer Nitro 5: this app computes the curves, nbfc_service writes the EC.
On another laptop (not AN515-54):
- Install nbfc-linux.
- Check that your model exists:
nbfc config -l(about 180 profiles). If it is missing, stop — this program cannot help. - Select your profile (
nbfc config -a "Exact Name From The List"), thensudo systemctl enable --now nbfc_service. - Set
"backend": "nbfc"in/etc/nitro-fan/config.jsonand runsudo ./install.sh.
The sibling GUI keizenx/nitro-fan-control uses that same NBFC path (and also works on Windows).
This repo ships a tested Acer Nitro 5 AN515-54 profile (use it only on that model):
nbfc/Acer Nitro AN515-54.json— laptop profilenbfc/nbfc.json—SelectedConfigIdfor/etc/nbfc/nbfc.jsonnbfc/README.md— EC map and apply steps
With this daemon on Acer Nitro 5 AN515-54 (curves stay here, NBFC only writes the EC):
sudo systemctl disable --now acer-nitro-perfect-fan.service
sudo ./nbfc/install-nbfc-config.sh
sudo systemctl enable --now nbfc_service
# optional: "backend": "nbfc" in /etc/nitro-fan/config.json
sudo ./install.shIf acer_nitro_ec is also loaded, auto prefers hwmon. Force NBFC with "backend": "nbfc" only when you really want that path.
NBFC alone (keizenx GUI or nbfc set) — stop this daemon first.
| Fan | RPM read | Duty write | Manual unlock |
|---|---|---|---|
| CPU | 19 (0x13) |
55 (0x37) |
34 (0x22) = 12 |
| GPU | 21 (0x15) |
58 (0x3A) |
33 (0x21) = 48 |
| Both | — | — | 151 (0x97) = 1 |
- Fans ignore sliders —
systemctl status acer-nitro-perfect-fan.service,./check-system.sh - GUI offline — Python bridge not running; read the terminal where you ran
npm start - Stock EC auto —
./restore-auto.shor reboot after stopping the service - Missing charts —
npm installingui-app - Fans oscillate — two writers.
systemctl is-active acer-nitro-perfect-fan.service nbfc_service
More: INSTALL.md.
cd gui-app && npm test
python3 -m py_compile fan_backend.py nbfc_control_api.py nitro_fan_daemon.py nitro_log_summary.py
python3 test_fan_backend.pySee CONTRIBUTING.md.
MIT — LICENSE.
Copyright (c) 2024 keizenx
Copyright (c) 2026 Kaspral1
GUI lineage: keizenx/nitro-fan-control.
NBFC profile based on the AN515-54 EC map by Chandradeep Dey / alex-fl.
Developed by Kaspral1 with assistance from AI coding tools. All design decisions and the published code are the maintainer’s responsibility.
This project stays MIT when power-profile buttons are used. Those buttons talk to a separately installed Div Acer Manager Max (DAMX) daemon (and Linuwu-Sense) over a Unix socket. DAMX is GPL-3.0 and is not bundled here. The optional acer-nitro-ec kernel module in this repo is GPL-2.0. Details: THIRD_PARTY.md.