If AeroForge breaks, behaves oddly, or you want to report a bug or leave feedback, go here first:
This GitHub repository is not monitored for support, bug reports, or pull requests. Please do not open pull requests; use the Discord above for feedback and issue reports.
Premium-feeling frontend prototype for a laptop fan control and battery or power management application. The project now includes a Tauri desktop shell around the React UI and a Windows service for hardware-facing control paths.
- Custom fan curves with draggable CPU and GPU thermal nodes
- Power profile switching
- Fan profile switching
- Smart charging toggle with an 80% charge cap preview
- Boot splash image swapping with preset art and custom upload preview
- React 19
- TypeScript
- Vite
- Tauri 2
npm.cmd install
npm.cmd run devnpm.cmd run buildnpm.cmd run tauri:dev- Rust toolchain via
rustup - Visual Studio Build Tools with MSVC and Windows SDK components
- WebView2 runtime
npm.cmd run tauri:buildnpm.cmd run portable:buildThis creates:
portable\AeroForge Control Portable\portable\AeroForge-Control-Portable-0.16.3.zip
npm.cmd run startup:installThis registers aeroforge-hotkey-helper.exe --daemon in the logged-in user session so the physical Nitro key can open or focus AeroForge without keeping the WebView UI resident. To remove it:
npm.cmd run startup:uninstallFor users who cannot get AeroForge working, send them:
scripts\AeroForge-Debug-Collector.cmd
The portable ZIP also includes the same AeroForge-Debug-Collector.cmd beside
aeroforge-control.exe. They can double-click it or run it from Command Prompt. It creates an
AeroForge-Debug-YYYYMMDD-HHMMSS.zip on their Desktop with service status,
named-pipe read-only probes, AeroForge logs and state snapshots, filtered Acer /
Nitro / NVIDIA / WebView diagnostics, Windows event logs, power/display state,
driver inventory, Defender status, startup entries, shortcut targets, update
reachability, NVIDIA power-limit readback, AMD/CPU power diagnostics, read-only
Acer WMI probes, app/service version facts, installer logs, UI performance logs,
dxdiag output, filtered Windows Error Reporting crash inventories, and a root
summary.json.
The collector is read-only. It skips binaries, images, staged update payloads,
WebView cache/storage folders, and token-like filenames, then redacts common
token/password/secret strings in copied text files. Launch it with
-Quick -PollSeconds 60 for a low-noise service/CPU/power/fan timeline, or
-Deep -PollSeconds 120 -PollIntervalMs 1000 for the full support timeline.
Focused polling is also available, for example
-Poll fans pipe performance -PollSeconds 45 -PollIntervalMs 500 for custom fan
or mode-switch lag, and -Poll nvidia gpu-counters processes -PollSeconds 90
for dGPU idle or power-limit reports. Add -NoNvidiaSmi when testing whether
NVIDIA command-line polling itself is waking the dGPU. Maintainers can add
-OutputRoot "C:\Temp\AeroForgeDebug" to place the bundle somewhere other than
the Desktop, or run -ListOptions to print every supported switch.
src/App.tsxcentralizes the mock state for all primary controls.- Fan curves are represented as temperature and speed points for both CPU and GPU zones.
- Boot image upload uses
URL.createObjectURL()for local preview only. - Charge-limit controls are safe UI state changes only.
src-tauri/src/backend/now contains the typed backend contract, capability snapshot, control snapshot, telemetry snapshot, and persistence-backed desktop state models exposed through Tauri commands.- The backend now persists AeroForge-owned control state to disk and routes power, GPU tuning, and fan writes through the AeroForge service.
The repo now includes a separate barebones Windows service host under aeroforge-service/.
Current shape:
- one AeroForge-owned Windows service process
- a thin supervisor that owns lifecycle and worker health only
- parallel worker threads for capability, persistence, telemetry, and named-pipe IPC
- worker snapshot files under
ProgramData\\AeroForge\\Service\\state - a supervisor snapshot at
ProgramData\\AeroForge\\Service\\state\\supervisor.json - local IPC over
\\.\pipe\AeroForgeServiceinstead of localhost ports - no dependency on Acer localhost services or other vendor IPC
Current fan control path:
- fan profile and custom-curve apply requests flow through the AeroForge service
- the service calls
ROOT\\WMIAcerGamingFunctiondirectly on supported Acer Nitro hardware SetGamingFanBehaviorreceives Acer behavior inputs for auto, max, and mixed custom fan profilesSetGamingFanSpeedreceives per-fan target inputs for CPU and GPU fan percentages- when Custom is active, the service re-reads telemetry and reapplies the curve-derived CPU/GPU speed targets every 5 seconds
- RPM movement is verified separately through direct Acer sensor telemetry rather than trusting the write call alone
- no NitroSense websocket, AcerAgentService PSSDK socket, or PredatorSense pipe dependency is used for AeroForge fan writes
Current power control path:
- Balanced, Performance, Turbo, and Custom base profiles prefer
AcerGamingFunction.SetGamingMiscSetting(0x0B, profile)platform-profile writes and fall back to legacySetGamingProfileonly if the misc-setting path is unavailable - Custom layers the requested Windows processor-state policy over the selected firmware base
- Quiet uses Acer platform profile value
0x00plus the direct NVIDIA NVAPI Whisper path when available - Windows processor-state policy is still applied through
powercfgand read back afterward for AC/DC verification - CPU package power and PL1/PL2 readback use the PawnIO MSR/RAPL path when PawnIO is installed. The AeroForge installer can install the bundled open-source PawnIO setup on request, stages the
IntelMSR.binmodule, detectsPawnIOLib.dll, and configures the service-levelAEROFORGE_PAWNIO_DLL,AEROFORGE_PAWNIO_MODULE, andAEROFORGE_ENABLE_PAWNIOenvironment variables automatically. If PawnIO is not installed, the CPU watt/PL panel intentionally reports that the CPU power driver is missing. - The legacy WinRing0 CPU MSR/RAPL path is not bundled or enabled in release builds because Windows Defender commonly flags that driver. For diagnostics only, maintainers can set
AEROFORGE_ENABLE_WINRING0=1and provide a trusted external driver throughAEROFORGE_WINRING0_DRIVER.
Bundled PawnIO runtime:
third_party/pawnio/PawnIO_setup.exeis the open-source PawnIO setup fromnamazso/PawnIO.Setuprelease2.2.0.- SHA256:
1F519A22E47187F70A1379A48CA604981C4FCF694F4E65B734AAA74A9FBA3032. - Setup is invoked only when the user opts into CPU wattage and PL1/PL2 support during AeroForge setup; silent installs configure an existing PawnIO install but do not force-install PawnIO.
Current read-only telemetry coverage:
- Windows power status for battery percentage and AC state
- Windows system CPU time sampling for CPU usage
- standard Windows processor queries for current CPU clock
- NVIDIA GPU temperature, utilization, clocks, and VRAM are read through NVML only while Windows reports active dedicated-GPU memory use, plus a short cooldown window. Windows counters are used only as the wake gate, not as displayed utilization. NVIDIA power draw and power-limit readback remain disabled by default to avoid the more aggressive polling path; maintainers can opt into that diagnostic power telemetry with
AEROFORGE_ENABLE_NVIDIA_TELEMETRY=1. - direct
AcerGamingFunction.GetGamingSysInforeads for CPU/GPU/system temperatures and CPU/GPU fan RPMs when available - direct HID status reads for CPU and GPU fan speed on supported Nitro hardware
- ACPI thermal-zone data as fallback platform thermals on supported systems
- independent CPU-package and system-board thermal separation is still incomplete until AeroForge adds deeper EC or ACPI decoding
Clean-room boundary:
- AeroForge source does not include Acer source code, decompiled Acer code, or Acer binary string-analysis artifacts
- Vendor names, WMI class names, method names, and numeric inputs are treated as runtime-observed interface facts
Useful commands:
npm.cmd run service:build
npm.cmd run service:consoleInstall and uninstall scripts:
powershell -ExecutionPolicy Bypass -File scripts/Install-AeroForgeService.ps1
powershell -ExecutionPolicy Bypass -File scripts/Uninstall-AeroForgeService.ps1The install script registers AeroForgeService with delayed automatic startup so the service does not race early-boot NVIDIA initialization.