- Rust 85.2%
- CSS 5.4%
- JavaScript 3.7%
- HTML 3.1%
- PowerShell 2.6%
| src | ||
| web | ||
| .gitignore | ||
| ACER_POWER_PROFILE_RUST_SPEC.md | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| HOTKEY_HELPER.md | ||
| install-hotkey-helper.ps1 | ||
| install-service.ps1 | ||
| README.md | ||
| uninstall-hotkey-helper.ps1 | ||
| uninstall-service.ps1 | ||
Acer Profile Switcher for Nitro
A small Windows service that hosts an Axum web app at
http://127.0.0.1:56789. Its four buttons select Silent, Quiet, Balanced, and
Performance modes through ROOT\WMI AcerGamingFunction and NVIDIA Whisper.
The native COM/WMI implementation follows ACER_POWER_PROFILE_RUST_SPEC.md
and the AeroForge service implementation. It sends
SetGamingMiscSetting(0x0B | profile << 8) first, validates gmOutput, and
only then falls back to SetGamingProfile(profile).
Silent and Quiet both apply Acer Quiet firmware value 0x00. Silent enables
NVIDIA Whisper / External Quiet Mode through NVAPI driver settings (DRS
0x10115C8D). The older hidden Whisper setter is kept only as a fallback
because Game Ready 616+ rejects it with NVAPI_NOT_SUPPORTED. Quiet, Balanced,
and Performance explicitly disable that NVIDIA quiet state. Synchronization is
best-effort: an absent or unsupported NVIDIA GPU does not turn a successful
Acer firmware change into a firmware failure. The service retries NVIDIA quiet
control in the logged-on desktop session when the LocalSystem session 0 call is
rejected.
Turbo (0x05) is currently disabled because this laptop reports a supported
profile mask that does not include it.
Settings
The dashboard's Settings control stores a versioned JSON document owned by the
service at %PROGRAMDATA%\\AcerProfileSwitcher\\settings.json. It controls the
helper overlay (visibility, duration, opacity, and position), whether either
cycle input is enabled, and the alternative shortcut key (P by default). The
service validates and clamps values before saving,
writes through a temporary file replacement, and quarantines a corrupt file
before restoring defaults. Settings are preferences only; the current firmware
profile is always read live and is never persisted as state.
The service reads GetGamingMiscSetting(0x0B) at startup and after every
successful write. The UI highlights only a firmware-confirmed mode; Silent and
Quiet additionally require a successfully synchronized Whisper request before
the service distinguishes them. A rejected, unknown, or unavailable readback is
not presented as a confirmed change. Because some Acer firmware updates this
value asynchronously, the service uses a short bounded confirmation sequence
rather than trusting only the first immediate response. An unconfirmed result
triggers one later UI refresh.
Per-user profile controls
The unelevated helper cycles the same mode sequence from either the physical
Nitro key or the configurable alternative Ctrl+Alt+Shift+key shortcut (P
by default):
Silent -> Quiet -> Balanced -> Performance -> Silent
It observes the Nitro key through background Win32 Raw Input and shows the firmware-confirmed active mode in a short on-screen overlay. Install or update it for the current user after a release build:
.\install-hotkey-helper.ps1
See HOTKEY_HELPER.md for its Raw Input signature, confirmation behavior,
logging, and removal instructions.
Try it in a console
cargo run -- --console
Then open http://127.0.0.1:56789. Press Ctrl+C to stop it.
Install the Windows service
Build and run the installer from an elevated PowerShell:
cargo build --release
.\install-service.ps1
Running the installer again stops and updates an existing installation. The service starts automatically with Windows and listens only on the IPv4 loopback interface. To remove it:
If the running service locks the normal Cargo release executable during an upgrade, build into the supported staging directory before running the installer:
cargo build --release --target-dir target\staging
.\install-service.ps1
The installer stops the service and promotes the newer staged executable.
.\uninstall-service.ps1
Notes
- Windows and supported Acer hardware are required.
- The known WMI instance is
AcerGamingFunction.InstanceName="ACPI\\PNP0C14\\APGe_0". - Requests are serialized, and slow COM work runs outside Axum's async workers.
- Native COM uses the method-specific Acer WMI input type. If a model rejects the native call, the service uses a hidden PowerShell/CIM fallback and caches that choice for the affected method.
- The UI uses live firmware readback. Silent versus Quiet is additionally
identified from the last Whisper state successfully synchronized during the
current service lifetime, because firmware reports
0x00for both and NVAPI exposes no matching getter here. - This project does not alter fan curves, GPU overclocking, or Windows processor policies.