Ultra-lightweight alternative to NitroSense for Acer Nitro laptops. System tray app, no background services. Provided as-is, use at own risk. Tested on Acer Nitro 16S AI (AN16S-61). Available for Windows and Linux.
- Power profile: quiet / balanced / performance on AC; eco / balanced on battery
- Enforces smart charge (non-configurable)
- Enforces auto fan speed (non-configurable)
- Stuck-fan auto-recovery: when the machine is cool but the CPU fan stays spinning after load, the loop re-applies the current profile (config-gated, off by default)
- CPU temperature in the tray menu and hover text (shown while the fan-recovery loop is enabled)
- Keyboard backlight off
- Auto-start at logon
- Profile cycling hotkey
Settings are applied at startup, on power transitions, on resume, and at profile change.
Optional nitro-tray.toml, read at startup (restart to apply). Copy
nitro-tray.example.toml from the repo as a starting point. File location:
see the Windows / Linux
guide. Without it, defaults apply.
| Key | Type | Default | Meaning |
|---|---|---|---|
ac_profile |
string | "balanced" |
Profile on AC: quiet | balanced | performance |
battery_profile |
string | "eco" |
Profile on battery: eco | balanced |
auto_switch |
bool | true |
Auto-apply profile on power transitions |
reapply |
bool | false |
Periodically re-assert firmware state |
reapply_interval_secs |
integer | 30 |
Reapply interval (seconds) |
fan_recovery |
bool | false |
Stuck-fan auto-recovery loop (also feeds the tray CPU temperature) |
fan_recovery_interval_secs |
integer | 10 |
Recovery sampling cadence (seconds) |
fan_recovery_threshold_c |
integer | 43 |
Fire when CPU temp is below this (°C) while the fan spins |
fan_recovery_samples |
integer | 2 |
Consecutive below-threshold samples that fire the recovery |
fan_recovery_cooldown_secs |
integer | 60 |
Minimum gap between recoveries (seconds) |
hotkey |
string | "ctrl-alt-p" |
Profile-cycle hotkey: ctrl|alt|shift|win + key (a–z, 0–9, f1–f24) |
keyboard_led_off |
bool | true |
Force keyboard backlight off on every apply |
log |
bool | true |
Write log file (see the platform guides) |
Smart charge (80% cap) is always on, not configurable. The fan-recovery
remedy is fixed (re-applies the current profile pick); the five fan_recovery*
keys only tune detection and cadence.
- Windows: Windows platform guide
- Linux: Linux platform guide
Windows 10 1809+ / Windows 11, x64. Single self-contained exe.
- Runs elevated (Acer WMI is admin-only) — UAC prompt on launch.
- "Start at logon" tray checkbox installs a silent elevated logon task (off by default).
- Single instance.
NitroSense and other Acer user-mode services can be disabled — the app talks
to the firmware directly. Disable AASSvc, Acer Care Center, Acer
Quick Access, Acer Hardware Launch App, AcerHardwareService,
AcerDeviceEnablingServiceV2 (keep wmiacpi intact).
The app creates the four Nitro plans (from Windows Balanced) if missing and detects them by name at startup. Manual edits to a plan are respected.
| Plan | CPU Min / Max | Boost |
|---|---|---|
Nitro-Quiet |
5 / 45 | off |
Nitro-Balanced |
5 / 99 | default |
Nitro-Performance |
5 / 100 | aggressive |
Nitro-Eco |
5 / 40 | off |
- Download
nitro-tray.exefrom the GitHub Releases page. - Put it in a writable folder you own (not
Program Files) — log, config, state are written beside the exe. - Launch once (accept UAC).
- Optional: add
nitro-tray.toml(see Configuration). - Tick "Start at logon" in the tray menu.
| What | Where |
|---|---|
| Config | nitro-tray.toml (optional) |
| Log | nitro-tray.log (config log, default on) |
| State | nitro-tray.state.toml |
One unprivileged process; root is needed only for one-time setup (kernel module + udev rules).
- Hardware: Acer Nitro 16S AI (AN16S-61), x86_64. Verified on Cinnamon/X11.
- Required:
nitro-wmikernel module (installed by setup; DKMS rebuilds it after kernel updates). - Tray: StatusNotifier-capable desktop (GNOME, KDE, Cinnamon, Xfce, ...).
- Hotkey: X11 only (Wayland skips it with a log warning).
- power-profiles-daemon conflicts with the app — see install step 3.
-
Download the release and put
nitro-trayon yourPATH:mkdir -p ~/.local/bin cp nitro-tray ~/.local/bin/ -
One-time root setup:
sudo ./linux/setup.shInstalls the
nitro-traygroup (and adds you), thenitro-wmimodule (DKMS + boot autoload), udev rules (device access + cpufreq group-writability), and the tray icons. -
Disable power-profiles-daemon if present — it rewrites the same governor/EPP/boost attributes the app tunes. Check:
systemctl status power-profiles-daemon # unit exists? pgrep -f power-profiles-daemon # process running?The app also logs
power-profiles-daemon is running ...at startup if it detects the daemon. Nothing found → skip the rest:sudo systemctl disable --now power-profiles-daemonIf the unit is missing but a process still runs (session-launched), mask instead:
sudo systemctl mask power-profiles-daemon. The desktop power-mode slider stops working either way. -
Log out and back in (group membership), then run
nitro-tray. Never run it as root. -
Optional: copy
nitro-tray.example.tomlto~/.config/nitro-tray/nitro-tray.toml; tick "Start at logon" for autostart.
| What | Where |
|---|---|
| Config | ~/.config/nitro-tray/nitro-tray.toml |
| Log | ~/.local/state/nitro-tray/nitro-tray.log |
| State | ~/.local/state/nitro-tray/nitro-tray.state.toml |
| Autostart | ~/.config/autostart/nitro-tray.desktop |
$XDG_CONFIG_HOME / $XDG_STATE_HOME override config/state/log paths.
Log: ~/.local/state/nitro-tray/nitro-tray.log.
nitro-wmi: chardev missing— module not loaded:modprobe nitro-wmi, check/dev/nitro-wmi,dmesg | tail. After kernel updates, checkdkms status.chardev access denied/usage-mode adapter unavailable— permissions: session in thenitro-traygroup (id), devicesroot:nitro-tray 0660.power: failed to ensure plan support/Failed: governor, ...— cpufreq attributes not group-writable:sudo udevadm control --reload-rules && sudo udevadm trigger, or reboot.power-profiles-daemon is running ...— see install step 3.
sudo dkms remove -m nitro-wmi -v 0.1 --all
sudo rm /etc/modules-load.d/nitro-wmi.conf
sudo rm /etc/udev/rules.d/90-nitro-tray.rules /usr/local/libexec/nitro-tray-cpufreq
sudo udevadm control --reload-rules
sudo groupdel nitro-tray
rm -rf ~/.config/nitro-tray ~/.config/autostart/nitro-tray.desktop ~/.local/state/nitro-tray
If you disabled power-profiles-daemon during install, re-enable it:
sudo systemctl unmask power-profiles-daemon
sudo systemctl enable --now power-profiles-daemon
Hardware opcode tables and firmware encodings: docs/firmware-notes.md.
cargo build
cargo test
Probe binaries run elevated, on-device and modify the hardware/OS state
they inspect (probe_charge_read and probe_sysinfo are read-only);
cargo test runs none of them. Hardware paths can't be verified off-device.
Prerequisites: Rust stable with the MSVC toolchain, VS Build Tools 2022 with the C++ workload + Windows 10/11 SDK.
git clone <this-repo>
cd nitro-tray
cargo build --release # debug: cargo build
Binary: target\release\nitro-tray.exe. Verify: cargo test (pure unit
tests, safe anywhere), cargo clippy.
probe_wmi— platform profile / fan / readbackprobe_hid— HID usage modeprobe_charge— smart charge toggle / readbackprobe_charge_read— smart charge read-onlyprobe_power— power plans / CPU tuningprobe_mi— rawmi.dlltransport diagnosticsprobe_sysinfo— CPU telemetry pin (read-only):GetGamingSysInfotyping, temp/RPM selectors, decodeprobe_fan_recovery— stuck-fan reproduction + remedy cycles (spin/cooldown/cycle/unstuck)
Run elevated on the target laptop only — they temporarily change firmware/OS state. Never invoked by the app, tests, or build.
Prerequisites: Rust stable, dkms (falls back to a direct module build),
C compiler + kernel headers.
git clone <this-repo>
cd nitro-tray
cargo build --release
Binary: target/release/nitro-tray. Verify: cargo test, cargo clippy.
linux_power_probe verifies the per-profile CPU tuning (governor, EPP,
boost) on-device. The Windows probes build as stubs on Linux.