Releases: theantipopau/omencore
OmenCore v2.2.2
OmenCore v2.2.2 - Temperature Monitoring Fixes
Release Date: January 2026
Type: Patch Release
Summary
This release addresses critical temperature monitoring issues reported after v2.2.1, including temperatures getting stuck/frozen and causing fans to stay at high RPM or not respond to heat changes.
🐛 Bug Fixes
Quick Access White Line Visual Bug
- Fixed: Removed errant white line appearing in the Quick Access popup
- Cause: Grid row conflict - two elements assigned to same row, plus unnecessary separator border
- Solution: Fixed Grid row definitions and removed the 1px white separator element
AMD Ryzen Undervolt Detection (Phoenix/7040 Series)
- Fixed: Ryzen 5 7640HS and other Phoenix APUs failing to apply undervolt
- Cause: CPU family detection matched "Model 1" in "Model 116" causing Phoenix CPUs to be misdetected as Zen1+
- Solution: Reordered family detection to check Family 25/26 models first; added fallback SMU commands for unknown families
- Affected CPUs: Ryzen 7040 series (7640HS, 7840HS, etc.)
Critical: Temperature Monitoring Freezes (#39, #40)
Issue: CPU/GPU temperatures would freeze at a fixed value (e.g., 55°C, 93°C) causing:
- Fans stuck at high RPM because the fan curve sees a constant high temperature
- Fans not responding to actual temperature increases, leading to thermal throttling
- Temperature display showing incorrect values (e.g., shows 93°C when actual is 80°C)
Affected Models: OMEN 16, OMEN Max 16, OMEN 17 (multiple users)
Root Cause: The HardwareWorker would copy previous sample values when starting a new reading cycle. If CPU sensor readings failed silently or returned identical values due to LibreHardwareMonitor caching issues, the stale temperature persisted indefinitely. The client side had no way to detect this staleness.
Fix:
- Added
IsFreshandStaleCountfields to HardwareSample for staleness detection - HardwareWorker now tracks if CPU temperature actually changed between readings
- After 20+ consecutive identical readings (~30 seconds), sample is marked as stale
- Client-side LibreHardwareMonitorImpl detects stale data and auto-restarts the worker
- Worker logs warnings when staleness is detected and attempts sensor reinitialization
- Added stuck temperature detection in the main app that tries alternative sensors
Technical Details:
// Worker now tracks staleness
if (!cpuTempUpdated && sample.CpuTemperature > 0)
{
sample.StaleCount = _lastSample.StaleCount + 1;
if (sample.StaleCount >= 20)
{
sample.IsFresh = false;
// Log and attempt sensor reinit
}
}
// Client detects stale worker data
if (!workerSample.IsFresh || workerSample.StaleCount > 30)
{
// Restart worker to get fresh sensors
await _workerClient.StopAsync();
await _workerClient.StartAsync();
}📋 Known Issues from Community Reports
OMEN 14 Transcend Compatibility
- Power mode changes may not work properly
- Fan behavior can be erratic
- Some users report OmenCore interfering with OGH
- Status: Under investigation - need more logs from affected users
2023 XF Model - Keyboard Lights Require OGH
- Keyboard lighting only works with OMEN Gaming Hub installed
- Status: This may be a WMI BIOS limitation on this model
RDP Window Pop-up (#37)
- OmenCore window randomly appears when opening Remote Desktop
- Status: Previously fixed but may still occur in edge cases
OMEN Key Quick Access
- OMEN key opens main app instead of quick access toolbar regardless of setting
- Status: Under investigation
Windows Defender False Positive
- Some users see
Win32/Sonbokli.A!cl(ML heuristic detection) - Status: This is a common false positive for GitHub projects. The
!mlsuffix indicates machine-learning flagged it due to behaviors that "could be concerning if malicious" (e.g., hardware access, driver loading). OmenCore is open source and safe.
Visual: White Line in Quick Access
- ✅ FIXED in this release
🔧 Technical Details
Files Changed
-
OmenCoreApp/Hardware/RyzenControl.cs- Fixed CPU family detection order (check Family 25/26 before generic patterns)
- Phoenix/HawkPoint now correctly detected instead of falling back to Zen1Plus
- Made Zen1Plus detection more strict (requires Family 17)
-
OmenCoreApp/Hardware/AmdUndervoltProvider.cs- Added fallback SMU command (0x5D) for unknown CPU families
- Added explicit handling for older architectures that don't support Curve Optimizer
-
OmenCoreApp/Views/QuickPopupWindow.xaml- Fixed Grid row definitions (added 7th row)
- Moved Quick Actions to correct row
- Removed white separator border causing visual artifact
-
OmenCore.HardwareWorker/Program.cs- Added
IsFreshandStaleCountto HardwareSample class - Track consecutive identical CPU temperature readings
- Log and attempt recovery when staleness detected
- Always update CpuTemperature (even if 0) to prevent stale caching
- Added
-
OmenCoreApp/Hardware/HardwareWorkerClient.cs- Added
IsFreshandStaleCountproperties to match worker
- Added
-
OmenCoreApp/Hardware/LibreHardwareMonitorImpl.cs- Detect stale data from worker
- Auto-restart worker when staleness threshold exceeded
- Added stuck temperature detection with alternative sensor fallback
Staleness Detection Thresholds
- Worker-side: 20 cycles (~30 seconds) of identical readings = mark as not fresh
- Client-side: StaleCount > 30 or IsFresh=false triggers worker restart
- In-process: 10 identical readings triggers alternative sensor search
📥 Downloads
| File | SHA256 |
|---|---|
| OmenCoreSetup-2.2.2.exe | B692F15A4B0C1D1F5643A2A4BCA9B8B41C995F8B54C87FD6D8A70729EAEE2D87 |
| OmenCore-2.2.2-win-x64.zip | F8FAFDD4D63341E29632D1CEE22AFC9000F022AF7C8540DB7501E3D4FDC8A2F1 |
| OmenCore-2.2.2-linux-x64.zip | 83CC57C4B53C195F4B0E436F60DAD438C5DAD638EB5B0B18583C5B8C0A8DF40E |
🙏 Acknowledgments
Thanks to the community members who reported these issues:
- @its-urbi - Fans stuck at 4600RPM issue (#39)
- @xenon205 - Temperature stuck display, false positive report (#40)
- @h4Zzzy - Temperature freeze on OMEN Max 16
- Discord community - OMEN 14 Transcend reports, keyboard lighting, RDP issues
Full Changelog: v2.2.1...v2.2.2
OmenCore v2.2.1
OmenCore v2.2.1 - Bug Fixes & EC Reset Feature
Release Date: January 2026
Type: Patch Release
Summary
This release addresses several bugs reported by the community after v2.2.0, and adds a new EC Reset feature by user request.
✨ New Features
EC Reset to Defaults
Request: User requested an option to reset the EC (Embedded Controller) to factory defaults so BIOS displays return to normal values.
Implementation:
- Added "Reset EC to Defaults" button in Settings → Hardware Driver section
- Performs comprehensive EC reset sequence:
- Clears all manual fan speed overrides
- Disables fan boost mode
- Restores BIOS control of fans
- Resets thermal policy timers
- Sets performance mode to Balanced
- Shows confirmation dialog explaining what will be reset
- Success/failure feedback with troubleshooting tips
Use this if:
- BIOS shows stuck or incorrect fan speed values
- Fan behavior doesn't match expected after using OmenCore
- You want to completely restore factory fan behavior
🐛 Bug Fixes
Thermal Protection Logic (#32)
Issue: Thermal protection was reducing fan speed instead of boosting it when temperatures reached warning threshold (82°C). After thermal event, fan preset was incorrectly restored to "Quiet" instead of the user's selected mode.
Root Cause: The thermal protection system was applying a hardcoded percentage (77%) instead of boosting to maximum, and incorrectly restoring the saved preset regardless of the active performance mode.
Fix:
- Thermal protection now correctly boosts fan speed to maximum when triggered
- System now remembers and restores the actual active preset/performance mode after thermal event
- When in Performance mode with max fans, thermal protection no longer interferes
System Tray Max/Auto Mode Not Working (#33)
Issue: Selecting "Max" or "Auto" from the system tray menu didn't actually set the correct fan mode. The button state also wasn't persisting between menu opens.
Root Cause: The tray menu was applying "Performance" preset instead of true max fan mode when "Max" was selected. Auto mode logic was also not being properly applied.
Fix:
- "Max" option in tray now correctly enables SetFanMax for 100% fan speed
- "Auto" option properly enables auto fan curve mode
- Button states correctly reflect the current mode on menu open
OMEN Max 16 Light Bar Zone Order Inverted
Issue: On OMEN Max 16 (Intel 255HX with RTX 5080), the RGB zones control the front light bar but the zone order is inverted (right-to-left instead of left-to-right).
Root Cause: The OMEN Max 16 has a different zone mapping for its front light bar compared to older models.
Fix:
- Added OMEN Max 16 detection for light bar zone mapping
- Zones now correctly map from left-to-right (Zone 1 = Left, Zone 4 = Right)
- Added setting to manually invert zone order for edge cases
OMEN Max 16 Keyboard Lighting Not Working
Issue: On OMEN Max 16, the "Keyboard Lighting" section only controls the front light bar, not the actual keyboard backlight. The keyboard has single-color white/amber lighting that isn't controllable via OmenCore.
Status: This is a hardware limitation, not a bug. The OMEN Max 16 keyboard does not support per-zone RGB control - it has a simple single-color backlight controlled by the Fn+F4 key. The RGB section in OmenCore controls the 4-zone front light bar which is the only RGB lighting on this model.
Improvement:
- UI now clarifies that RGB controls are for "Light Bar" on OMEN Max 16 models
- Added detection for single-color keyboard backlight vs RGB keyboards
Monitor Tab CPU Temperature Stuck at 0°C (#35)
Issue: On OMEN 16-n0xxx models, the CPU temperature in the Monitor tab shows 0°C constantly while the General tab shows correct temperature.
Root Cause: Different temperature source being used for the detailed monitor vs quick status display.
Fix:
- Unified temperature source across all UI elements
- Monitor tab now uses the same reliable temperature provider as General tab
CPU Temperature Always Shows 96°C (#36)
Issue: CPU temperature displays a constant 96°C regardless of actual temperature, even on cold boot.
Root Cause: Some models report TjMax (96°C) instead of current temperature through certain WMI paths.
Fix:
- Added fallback temperature reading from LibreHardwareMonitor
- Cross-validates WMI temperature with hardware sensor data
- Displays accurate temperature from the most reliable source
Temperature Monitoring Freezes When Drives Sleep
Issue: CPU/GPU temperatures would freeze and stop updating after the error "Cannot access a disposed object. Object name: 'SafeFileHandle'" appears in HardwareWorker.log.
Root Cause: When a storage drive goes to sleep (power saving), LibreHardwareMonitor's UpdateVisitor throws a SafeFileHandle disposed exception. This exception was thrown before entering the per-hardware try/catch block, causing the entire update cycle to abort without updating any sensor values.
Fix:
- Wrapped
UpdateVisitor.Accept()call in try/catch to handle disposed storage devices - Made
UpdateVisitor.VisitHardware()itself resilient to disposed object exceptions - Storage devices going to sleep no longer affect CPU/GPU temperature monitoring
- Other hardware sensors continue updating even when one device fails
Technical Details:
// Before: Entire update aborted if any hardware threw
_computer.Accept(new UpdateVisitor());
// After: Catch at visitor level + individual hardware level
try { _computer.Accept(new UpdateVisitor()); }
catch (ObjectDisposedException) { /* Continue with individual updates */ }
// Plus: UpdateVisitor now catches disposed errors per-hardware
public void VisitHardware(IHardware hardware)
{
try { hardware.Update(); ... }
catch (ObjectDisposedException) { /* Skip this hardware */ }
}📋 Known Issues
OMEN Max 16 Specific
- Keyboard backlight is single-color only (hardware limitation) - use Fn+F4 for brightness
- RGB controls only affect the front light bar
- Some users may need to use EC backend for lighting on certain configurations
Linux (Fedora 43+)
- ec_sys module not available - Fedora 43+ kernels don't include the
ec_sysmodule by default- Workaround 1: Use
hp-wmidriver instead:sudo modprobe hp-wmi(for OMEN 2023+ models) - Workaround 2: Build
ec_sysmodule from kernel source - Workaround 3: Some systems have EC access via
/sys/kernel/debug/ec/ec0/iowithout needingec_sys - This affects fan speed reading on affected systems
- Workaround 1: Use
General
- Secure Boot blocks WinRing0 MSR access (undervolt unavailable)
- Some BIOS versions may not support all WMI commands
📝 Feature Requests (For Future Releases)
No pending requests - EC Reset feature implemented in this release!
🔧 Technical Details
EC Reset Implementation
The EC Reset feature writes to the following registers (OMEN EC register map):
0x34,0x35- Fan 1/2 speed set (clears manual speeds)0x2E,0x2F- Fan 1/2 PWM percent (clears manual PWM)0xEC- Fan boost mode (disables boost)0xF4- Fan state (returns to BIOS control)0x62- BIOS control flag (restores BIOS authority)0x63- Timer register (clears countdown)
WMI-based reset sequence:
- SetFanMax(false) - Disable max fan mode
- SetFanMode(0xFF) - Default mode
- SetFanLevel(0,0) + SetFanLevel(1,0) - Clear fan levels
- ExtendFanCountdown(0) - Clear timer
- SetFanMode(0x0) - Balanced mode
- SetFanMode(0xFF) - Final reset
Models Affected
- OMEN MAX Gaming Laptop 16t-ah000 (Intel Core Ultra 7 255HX, RTX 5080)
- OMEN 16-n0xxx series
- Various models with thermal protection edge cases
- Linux: Fedora 43+ users affected by ec_sys removal
Fixes Applied
FanService.cs- Thermal protection logic overhaul, EC Reset wrapperMainViewModel.cs- Tray menu Max/Auto/Quiet mode handlingKeyboardLightingService.cs- Light bar zone mapping for OMEN Max 16LibreHardwareMonitorImpl.cs- Temperature stuck-at-TjMax detectionAppConfig.cs- Added InvertRgbZoneOrder settingSettingsViewModel.cs/SettingsView.xaml- Zone inversion toggle, EC Reset buttonFanControllerFactory.cs- IFanController.ResetEcToDefaults() interfaceWmiFanController.cs,FanController.cs- EC Reset implementationsOmenCore.HardwareWorker/Program.cs- Temperature freeze fixStatusCommand.cs(Linux) - Improved error messages for missing ec_sys/hp-wmi
📥 Downloads
| File | SHA256 |
|---|---|
| OmenCoreSetup-2.2.1.exe | A1A641C00A9BCF4A496E6A60AA3D7083B234C0B9CB954EA5D6563B6DE1B9DE6A |
| OmenCore-2.2.1-win-x64.zip | B9E00DAEDC895C2EDDE07E10D68A324B8C42BFDCB526D9DD49440E8EC05CF75A |
| OmenCore-2.2.1-linux-x64.zip | 27BECB535FE39B691E4E95D7B3F18F4107134E78F66AED407CF6FCC54C3A66D3 |
🙏 Acknowledgments
Thanks to the community members who reported these issues:
- @kg290 - Thermal protection and tray menu bugs (#32, #33, #34)
- @its-urbi - Monitor tab temperature bug (#35)
- @yongzhouwangbowen - CPU temperature stuck at 96°C (#36)
- @dfshsu - Fedora 43 ec_sys module issue (Discord)
- Reddit user - OMEN Max 16 light bar zone order and keyboard lighting clarification
Full Changelog: v2.2.0...v2.2.1
OmenCore v2.2.0
OmenCore v2.2.0 Release Notes
Release Date: January 7, 2026
This release focuses on bug fixes reported by the community, security hardening from a code audit, UI improvements, and new features including GPU OC profiles and fan profile persistence.
📦 Downloads
| File | Size | SHA256 |
|---|---|---|
| OmenCoreSetup-2.2.0.exe | 80 MB | B4982315E979D8DE38471032A7FE07D80165F522372F5EFA43095DE2D42FF56B |
| OmenCore-2.2.0-win-x64.zip | 104 MB | 542D65C5FD18D03774B14BD0C376914D0A7EE486F8B12D841A195823A0503288 |
| OmenCore-2.2.0-linux-x64.zip | 6 MB | ADBF700F1DA0741D2EE47061EE2194A031B519C5618491526BC380FE0370F179 |
All builds are self-contained - .NET 8 runtime is bundled, no separate installation required.
✨ New Features
GPU Overclock Profiles
Save and load GPU overclock configurations with named profiles.
Features:
- Create named profiles with core clock, memory clock, and power limit settings
- Quick profile switching via dropdown selector
- Profiles persist to config file across app restarts
- Delete unwanted profiles with one click
- Auto-loads last used profile on startup (optional)
Files:
src/OmenCoreApp/Models/AppConfig.cs- AddedGpuOcProfileclass andGpuOcProfilescollectionsrc/OmenCoreApp/ViewModels/SystemControlViewModel.cs- Profile management methodssrc/OmenCoreApp/Views/SystemControlView.xaml- Profile selector UI
Fan Profile Persistence
Custom fan curves now save automatically and restore on app startup.
Features:
- Custom curves persist to config file when applied
- Restored on app startup with "Custom" or "Independent" presets
- Works with both unified and independent fan modes
Files:
src/OmenCoreApp/Models/AppConfig.cs- AddedCustomFanCurvepropertysrc/OmenCoreApp/ViewModels/FanControlViewModel.cs-SaveCustomCurveToConfig()methodsrc/OmenCoreApp/Services/SettingsRestorationService.cs- "Custom" preset restoration handling
Linux Auto Mode Restoration (Improved)
Better automatic fan control restoration for Linux users.
Improvements:
- Full EC register reset sequence for proper BIOS handoff
- HP-WMI driver support as fallback for newer models (2023+)
- Proper cleanup of manual speed registers
- Timer register reset for complete state cleanup
Technical Details:
public bool RestoreAutoMode()
{
WriteByte(REG_BIOS_CONTROL, 0x00); // Re-enable BIOS control
WriteByte(REG_FAN_STATE, 0x00); // Enable auto state
WriteByte(REG_FAN_BOOST, 0x00); // Disable boost
WriteByte(REG_TIMER, 0x78); // Reset timer to 120 seconds
WriteByte(REG_FAN1_SPEED_SET, 0x00); // Clear manual speeds
WriteByte(REG_FAN2_SPEED_SET, 0x00);
return true;
}File: src/OmenCore.Linux/Hardware/LinuxEcController.cs
Lazy-Load Peripheral SDKs (Startup Performance)
Corsair, Logitech, and Razer SDKs now only initialize when explicitly enabled in settings.
Benefits:
- Faster app startup for users without these peripherals
- Reduced memory footprint when peripherals are disabled
- No more unnecessary SDK initialization logs/errors
How it works:
- SDKs check
Features.CorsairIntegrationEnabled,Features.LogitechIntegrationEnabled,Features.RazerIntegrationEnabled - All three default to
false- user must enable in Settings → Features - When enabled, SDKs initialize on startup; when disabled, they're skipped entirely
Files:
src/OmenCoreApp/ViewModels/MainViewModel.cs- Conditional SDK initializationsrc/OmenCoreApp/ViewModels/LightingViewModel.cs- Nullable service handlingsrc/OmenCoreApp/Models/FeaturePreferences.cs- Feature toggles (already existed)
Dashboard UI Enhancements
The Monitoring dashboard has been improved with at-a-glance status information.
New Quick Status Bar:
- 🌀 Fans - Real-time CPU/GPU fan RPMs displayed in the status bar
- ⚡ Performance Mode - Current active performance mode
- 💨 Fan Mode - Current fan preset (Gaming, Auto, etc.)
- 🔌 Power - AC or Battery status
Session Tracking:
- Session Uptime - Shows how long OmenCore has been running (updates every second)
- Peak Temperatures - Tracks highest CPU/GPU temps seen this session
- Automatically resets when app is restarted
Files:
src/OmenCoreApp/ViewModels/DashboardViewModel.cs- Added session tracking and fan summary propertiessrc/OmenCoreApp/Views/DashboardView.xaml- Added Quick Status Bar and session info headersrc/OmenCoreApp/Services/FanService.cs- Initial fan telemetry population on Start()src/OmenCoreApp/Utils/BoolConverters.cs- Enhanced converter with ConverterParameter support
🐛 Bug Fixes
Fan Always On Bug (Reddit Report)
Problem: OMEN 17 13700HX fans never stopped even at idle/low temperatures (25°C). User had "fan always on" disabled in BIOS but fans kept running constantly.
Root Cause: OmenCore's Auto/Default fan mode was continuously applying a fan curve that started at 30% speed at 40°C. Even in "Auto" mode, OmenCore was managing fans instead of letting the BIOS control them, which prevented fans from spinning down to 0% at idle.
Fix: Auto/Default mode now truly restores BIOS control:
- Calls
DisableCurve()to stop OmenCore's continuous curve monitoring - Calls
RestoreAutoControl()which resets fan levels to 0 and sets FanMode.Default - This allows BIOS to control fans and stop them at idle temperatures
// New Auto mode handling in FanService.ApplyPreset()
else if (nameLower.Contains("auto") || nameLower.Contains("default"))
{
// Let BIOS control fans completely - allows fans to stop at idle
DisableCurve();
_fanController.RestoreAutoControl();
_logging.Info($"✓ Preset '{preset.Name}' using BIOS auto control (fans can stop at idle)");
}Files:
src/OmenCoreApp/Services/FanService.cs- Added Auto mode special case in ApplyPreset()src/OmenCoreApp/Hardware/WmiFanController.cs- RestoreAutoControl() already properly resets fans
Fan Curve Editor Crash (Issue #30)
Problem: Dragging fan curve points beyond chart bounds caused an ArgumentException:
System.ArgumentException: '90' cannot be greater than 87.
at System.Math.ThrowMinMaxException[T](T min, T max)
at OmenCore.Controls.FanCurveEditor.Point_MouseMove
Fix: Added safety check when neighbor temperature constraints conflict. When minTemp > maxTemp (edge case when points are too close together), the point now stays at its current position instead of crashing.
File: src/OmenCoreApp/Controls/FanCurveEditor.xaml.cs
Fan Curve Mouse Release Bug (Issue #30)
Problem: The cursor kept holding the drag point even after:
- Releasing the mouse button
- Moving outside the chart area
- The control losing mouse capture
Fix: Added global mouse handlers to properly release drag state:
ChartCanvas_MouseLeave- Releases on mouse exitChartCanvas_MouseLeftButtonUp- Releases on any mouse up in canvasChartCanvas_LostMouseCapture- Releases when capture is lost- Shared
ReleaseDrag()method ensures consistent cleanup
File: src/OmenCoreApp/Controls/FanCurveEditor.xaml.cs
Per-Core Undervolt Crash (Issue #31)
Problem: Opening the Per-Core Undervolt section caused a XAML parse exception:
System.Windows.Markup.XamlParseException: Operacja podawania wartości
elementu „System.Windows.Markup.StaticResourceHolder" wywołała wyjątek.
Root Cause: The PerCoreOffsets ItemTemplate referenced a non-existent SurfaceBrush resource.
Fix: Changed {StaticResource SurfaceBrush} to {StaticResource SurfaceMediumBrush} (the correct resource name).
File: src/OmenCoreApp/Views/AdvancedView.xaml (line 257)
Animation Parse Error on Startup
Problem: Invalid FanSpinStoryboard animation caused XAML parse errors during application startup.
Root Cause: LinearDoubleKeyFrame was incorrectly used as an EasingFunction (it's not an easing function, it's a keyframe type).
Fix: Simplified the animation to use a plain linear DoubleAnimation without easing.
File: src/OmenCoreApp/Styles/ModernStyles.xaml
OMEN Key False Trigger with Remote Desktop
Problem: Opening Remote Desktop Connection or other apps caused OmenCore window to appear unexpectedly. Some users reported the window popping open when launching mstsc.exe.
Root Cause: VK_LAUNCH_APP1 (0xB6) was being treated as the OMEN key unconditionally without scan code validation. Remote Desktop and media applications can send this virtual key code during startup or certain operations.
Fix: Added scan code validation for VK_LAUNCH_APP1 to match the validation already used for VK_LAUNCH_APP2. Only key presses with OMEN-specific scan codes (0xE045, 0xE046, 0x0046, 0x009D) are now treated as the OMEN key.
File: src/OmenCoreApp/Services/OmenKeyService.cs
🔐 Security & Stability Improvements
Named Pipe Security Hardening
Added PipeOptions.CurrentUserOnly flag to the named pipe server used for IPC between OmenCore and HardwareWorker. This prevents other users on the system from connecting to the pipe.
File: src/OmenCore.HardwareWorker/HardwareWorkerService.cs
Async Exception Handling
Converted async void InitializeWorker() to async Task InitializeWorker() with proper exception handling. This ensures exceptions are properly propagated and logged instead of crashing the application silently.
File: src/OmenCoreApp/Services/HardwareWorkerClient.cs
Improved Exception Logging
Added meaningful logging to previously bare catch blocks in HardwareWorkerClient. Errors ...
OmenCore v2.1.2
Changelog v2.1.2
All notable changes to OmenCore v2.1.2 will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[2.1.2] - 2026-01-06
🐛 Bug Fixes
🌡️ Temperature Freeze Fix (Windows)
- Issue: CPU/GPU temperatures would freeze and stop updating (GitHub #27)
- Cause: When a hardware component threw a SafeFileHandle disposed error (e.g., drive going to sleep), the entire sample would reset to zeros
- Fix: Hardware worker now preserves last known good values when a hardware component fails to update
- Result: Temperatures now continue displaying even if a storage drive or other component goes to sleep
🖥️ OMEN Max 2025+ Model Detection (V2 Thermal Policy)
- Issue: OMEN Max 2025+ models (like 16-ah0xxx with RTX 5080) showing 0 RPM fans constantly
- Cause: Some OMEN Max models report V1 thermal policy to BIOS but actually need V2 commands
- Fix: Added model name detection - if "OMEN" and "MAX" are in the model name, forces V2 thermal policy
- Result: OMEN Max users should now see proper fan RPM readings
🐧 Linux: Cannot Return to Auto Fan Mode (GitHub #27)
- Issue: After setting manual fan speeds,
--profile autodidn't restore BIOS control - Cause: Auto mode only reset fan state register but not BIOS control register
- Fix:
RestoreAutoMode()now properly resets:- BIOS control register (0x62) to 0x00
- Fan state register (0xF4) to 0x00
- Fan boost to disabled
- Timer register to 0x00
- Manual speed registers to 0x00 (let BIOS control)
- Result:
omencore-cli fan --profile autonow properly restores automatic fan control
🐧 Linux: HP-WMI Support for Newer Models (GitHub #28)
- Issue: OMEN 16 ae0000 and other 2023+ models had no fan control on Linux
- Cause: These models use different EC register addresses; the omen-fan register map is for older models
- Fix: Added hp-wmi driver support as alternative to EC access:
- Auto-detects
/sys/devices/platform/hp-wmi/ - Uses
thermal_profilefor performance modes (quiet/balanced/performance) - Uses
fan_always_onfor max mode - Falls back to EC registers for older models
- Auto-detects
- Result: Newer OMEN models can use
sudo modprobe hp-wmiinstead of EC access
📋 Technical Details
Temperature Freeze (HardwareWorker):
// Before: Started with empty sample each cycle
var sample = new HardwareSample();
// After: Preserves last known values if hardware fails
var sample = new HardwareSample
{
CpuTemperature = _lastSample.CpuTemperature,
GpuTemperature = _lastSample.GpuTemperature,
// ... all other values preserved
};Linux Auto Mode Fix:
public bool RestoreAutoMode()
{
WriteByte(REG_BIOS_CONTROL, 0x00); // Re-enable BIOS control
WriteByte(REG_FAN_STATE, 0x00); // Enable auto state
WriteByte(REG_FAN_BOOST, 0x00); // Disable boost
WriteByte(REG_TIMER, 0x00); // Reset timer
WriteByte(REG_FAN1_SPEED_SET, 0x00); // Clear manual speeds
WriteByte(REG_FAN2_SPEED_SET, 0x00);
return true;
}HP-WMI Support:
if (HasHpWmiAccess && File.Exists(HP_WMI_THERMAL))
{
return SetHpWmiThermalProfile(profile); // Use hp-wmi driver
}
// Fall back to EC registers for older models🔄 Changes from v2.1.1
All fixes from v2.1.1 are included:
- ✅ Desktop detection and blocking (25L/30L/35L/40L/45L)
- ✅ Reduced default polling (1500ms → 2000ms)
- ✅ G-Helper style quick popup on left-click
- ✅ Fan speed reset under load fix
- ✅ Tray minimize on close fix
- ✅ Linux tar.gz release asset fix
- ✅ Performance mode reset fix
📦 Download
- Windows Installer:
OmenCoreSetup-2.1.2.exe(recommended) - Windows Portable:
OmenCore-2.1.2-win-x64.zip - Linux (Wine):
omencore-linux-2.1.2.tar.gz
🔐 SHA256 Checksums
OmenCoreSetup-2.1.2.exe: 0A407465255879077EF8A45D4D81ABD92D8827D7C3734053058E29D3C56C4F8D
OmenCore-2.1.2-win-x64.zip: 1D7CEE56075D3975BD7CABDEDBA52FC4D6D34D14AA9E2C2403CFDBF2658D1317
omencore-linux-2.1.2.tar.gz: 34F7CFA19C0854D9318C79508AECAB0394B9778310B625D85D1228CB49A84E16
🆙 Upgrade Instructions
From v2.1.1:
- Download
OmenCoreSetup-2.1.2.exe - Run installer - it will upgrade in place
- Settings and profiles are preserved
Portable:
- Close OmenCore
- Extract new version over old
- Restart OmenCore
📝 Known Issues
- OMEN Max GPU Power: Some OMEN Max users report 175W GPU boost unavailable when CPU draws power - this appears to be a HP firmware limitation, not an OmenCore issue
- OMEN Desktop RGB: Desktop users wanting RGB-only support is on the roadmap for a future release
🙏 Thanks
Thanks to the community for reporting:
- Temperature freeze issue
- OMEN Max 16-ah0xxx fan reading issues
OmenCore v2.1.1
Changelog v2.1.1
All notable changes to OmenCore v2.1.1 will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[2.1.1] - 2026-01-05
Fixed
🆕 OMEN Max 2025 Fan RPM Showing 0% (ThermalPolicy V2)
- Issue: OMEN Max 16/17 (2025) with RTX 50-series showed 0% / 0 RPM for fans even though fans were spinning
- Root Cause: OMEN Max 2025 uses ThermalPolicy V2 which requires different WMI commands for fan level reading. The existing V1 commands (0x2D) return 0 on V2 devices.
- Fix:
- Added
ThermalPolicyVersion.V2enum for OMEN Max 2025+ detection - Added new fan commands:
CMD_FAN_GET_LEVEL_V2(0x37) andCMD_FAN_GET_RPM(0x38) - Enhanced
GetFanLevel()to try V2 commands first on V2 devices, fallback to V1 - Added logging for V2 device detection
- Added
- Files changed:
HpWmiBios.cs
🔧 Tray Icon: Minimize to Tray Not Working
- Issue: Clicking the X button (or Alt+F4) with "Minimize to tray on close" enabled would hide the window but make the app unresponsive. Clicking the tray icon wouldn't bring the window back, requiring Task Manager to kill the process.
- Root Cause:
MainWindow_Closingevent was disposing the ViewModel without checking theMinimizeToTrayOnClosesetting. The window was disposed but the process kept running without a usable UI. - Fix:
- Added
MinimizeToTrayOnClosecheck inMainWindow_Closingevent - Cancel close event and hide to tray when setting is enabled
- Added
ForceClose()method for actual app shutdown (tray menu Exit) - Restore
ShowInTaskbar = truewhen showing window from tray
- Added
- Files changed:
MainWindow.xaml.cs,App.xaml.cs
⚡ Performance Mode Resets After 5-10 Minutes
- Issue: Performance mode setting would reset after 5-10 minutes, causing TDP to drop even though the UI still showed "Performance" as active.
- Root Cause:
SetPerformanceMode()wasn't starting the countdown extension timer. HP BIOS automatically reverts fan/performance settings after ~120 seconds, but only fan presets were maintaining the countdown extension. - Fix: Added countdown extension start/stop in
SetPerformanceMode():- Performance and Cool modes now start countdown extension to maintain TDP
- Default mode stops countdown extension and lets BIOS take control
- Files changed:
WmiFanController.cs
🌡️ Stale CPU Temperature in Fan Curves
- Issue: FanService reads CPU temperature via
GetCpuTemperature()which returned cached values without checking freshness. Fan curves could respond to stale (old) temperatures when polling loops were out of sync. - Root Cause:
GetCpuTemperature()andGetGpuTemperature()directly returned cached values without verifying the cache was fresh (within_cacheLifetime). - Fix: Added
EnsureCacheFresh()method that checks_lastUpdateagainst_cacheLifetime:- In-process mode: Calls
UpdateHardwareReadings()synchronously - Worker mode: Requests fresh sample from HardwareWorker with 500ms timeout
- In-process mode: Calls
- Files changed:
LibreHardwareMonitorImpl.cs
🚫 OMEN Desktop Detection and Blocking (CRITICAL)
- Issue: OmenCore was causing severe issues on OMEN Desktop PCs (30L, 35L, 40L, 45L):
- Only one fan detected on startup
- All fans stop spinning
- Fans disappear from BIOS (listed as 'inactive' in OGH)
- Requires CMOS reset to restore functionality
- Root Cause: Desktop OMEN systems use completely different thermal management hardware than laptops. WMI commands designed for laptop EC/BIOS write to inappropriate addresses on desktop motherboards, corrupting fan controller configuration.
- Fix: Added critical desktop detection at app startup:
- Detects OMEN Desktop models by name (25L, 30L, 35L, 40L, 45L, Obelisk)
- Detects desktop chassis types via Win32_SystemEnclosure
- Shows error dialog explaining incompatibility
- Prevents app startup to protect hardware
- Files changed:
App.xaml.cs - Note: OmenCore is designed for OMEN LAPTOPS ONLY. Desktop support may come in future for RGB-only control.
Changed
⚡ Reduced Default Polling Interval (Performance)
- Change: Lowered default hardware polling from 1500ms to 2000ms
- Benefit: Reduces CPU overhead and UI sluggishness, especially on newer hardware (RTX 50-series)
- Impact: Slightly less frequent monitoring updates, but significantly smoother UI
- Files changed:
DefaultConfiguration.cs,SettingsViewModel.cs - Note: Users can still customize interval in Settings > Monitoring
🎯 Quick Popup as Default Tray Action
- Change: Left-click on tray icon now shows quick popup instead of full window
- Behavior:
- Left-click: Quick popup with temps, fan speeds, and mode buttons (G-Helper style)
- Double-click: Open full dashboard window
- Right-click: Context menu
- Benefit: Faster access to status and controls without opening full UI
- Files changed:
App.xaml.cs
🐧 Linux Release Workflow
- Improvement: GitHub release workflow now builds and includes Linux CLI
- New artifact:
omencore-linux.tar.gzin releases - Workflow: Split into separate Windows and Linux build jobs, then combined for release
- Files changed:
.github/workflows/release.yml
Known Issues
⚠️ Keyboard RGB Not Working on Some Models
- Reported: Model xd0015ax shows no keyboard RGB functionality
- Suspected Cause: Model-specific SDK support missing or different RGB API
- Status: Under investigation
- Workaround: Use OMEN Gaming Hub for keyboard RGB control
⚠️ System Stuttering on OMEN Max 16 (RTX 5080)
- Reported: Some users with OMEN Max 16 (Ryzen AI 9 370 + RTX 5080) experience system-wide stuttering (~1.2 second intervals) when OmenCore is running
- Suspected Cause: LibreHardwareMonitor polling issues with new RTX 50-series GPUs
- Workaround: Enable "Low Overhead Mode" in Settings or increase polling interval to 3000-5000ms
- Status: Under investigation
⚠️ OMEN Desktop Systems NOT SUPPORTED
- Critical: OMEN Desktop PCs (25L, 30L, 35L, 40L, 45L) are NOT compatible with OmenCore
- Risk: Running on desktops can corrupt BIOS fan controller settings, requiring CMOS reset
- Protection: App now blocks startup on detected desktop systems with error message
- Status: Desktop support may be added in future for RGB-only control (no fan control)
Download
- Windows Installer:
OmenCoreSetup-2.1.1.exe(recommended) - Windows Portable:
OmenCore-2.1.1-win-x64.zip - Linux CLI:
omencore-linux.tar.gz
Checksums (SHA256)
OmenCoreSetup-2.1.1.exe: 4AC115DF7BEF7EB8503C79C3B9C456FF844BC18BA76D92102BCA05FBC7F355B5
OmenCore-2.1.1-win-x64.zip: DC2114D3E62C9EF16F9607D5FBA78F1CE986AEBAE7F162284E3C663774922C24
omencore-linux-2.1.1.tar.gz: 8D269CBAE840C7B0D3BDB615637BE535141D8AC11CCC2097548EE2AB6581C238
OmenCore v2.1.0
Changelog v2.1.0
All notable changes to OmenCore v2.1.0 will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[2.1.0] - 2026-01-02
Added
🔀 Independent CPU/GPU Fan Curves
Separate fan control for CPU and GPU based on individual component temperatures:
- Visual curve editors - Dedicated editors for CPU and GPU fan curves
- True independent control - Uses
SetFanLevel(fan1Level, fan2Level)WMI - Temperature isolation - CPU fan responds to CPU temp, GPU fan to GPU temp
- Config persistence - Curves saved and restored on startup
- Fallback mode - Falls back to unified control if hardware unsupported
New properties in config: IndependentFanCurvesEnabled, CpuFanCurve, GpuFanCurve
🐧 Linux GUI (Avalonia UI)
Cross-platform graphical interface for Linux:
- Dashboard view - Real-time temperatures, fan speeds, CPU/GPU/RAM usage
- Fan control view - Custom fan curves with presets (Silent/Balanced/Performance/Aggressive)
- System control view - Performance modes, GPU switching, keyboard lighting
- Settings view - Startup options, polling interval, theme settings
- Linux hardware service - sysfs/hwmon temperature and fan reading
- TOML configuration -
~/.config/omencore/config.toml - Dark OMEN theme - Matching the Windows UI aesthetic
New project: src/OmenCore.Avalonia/ with full MVVM architecture
⚡ GPU Overclocking (NVAPI)
Full NVIDIA GPU overclocking via NVAPI SDK:
- Core clock offset - Adjustable from -500 to +300 MHz (laptop) / +300 MHz (desktop)
- Memory clock offset - Adjustable from -500 to +1500 MHz
- Power limit control - 50% to 125% TDP adjustment
- UI sliders - Full integration in System Control view
- Config persistence - Settings saved and reapplied on startup
- Safety limits - Conservative limits for laptop GPUs automatically detected
- Status display - Real-time GPU name and OC capability status
New files: src/OmenCoreApp/Hardware/NvapiService.cs, GpuOcSettings in AppConfig
🌈 Ambient Lighting (Screen Color Sampling)
Ambilight-style screen color sync for RGB devices:
- Edge sampling - Captures colors from screen edges (top, bottom, left, right)
- Zone-based - Configurable zones per edge (1-20)
- Saturation boost - 0.5x to 2.0x color enhancement
- Update rate control - 10-60 FPS adjustable
- Settings toggle - Enable/disable with sliders in Settings view
- Multi-provider support - Works with keyboard and all RGB peripherals
New files: ScreenColorSamplingService.cs, AmbientLightingSettings in AppConfig
⚡ CPU Power Limits (PL1/PL2)
Intel CPU power limit controls:
- PL1 (Sustained) - Long-term TDP limit (15-65W)
- PL2 (Burst) - Short-term turbo limit (25-115W)
- Integration with EC - Via PowerLimitController
🐧 Linux Daemon
Full background service support for Linux:
- Daemon mode (
omencore-cli daemon --run) - Background service with fan curve engine - systemd integration - Auto-generated service file with
daemon --install - TOML configuration -
/etc/omencore/config.tomlwith full settings - Automatic fan curves - Temperature-based fan speed control with hysteresis
- PID file & signal handling - Graceful shutdown, config reload support
- Security hardening - ProtectSystem=strict, PrivateTmp, read-only home
New files:
src/OmenCore.Linux/Config/OmenCoreConfig.cs- TOML configuration modelsrc/OmenCore.Linux/Daemon/FanCurveEngine.cs- Automatic fan curve enginesrc/OmenCore.Linux/Daemon/OmenCoreDaemon.cs- Background service implementation
📊 RTSS Integration
Real FPS monitoring via RivaTuner Statistics Server:
- Shared memory integration - Reads RTSS frame data without game hooks
- Full metrics: Instant FPS, average, min/max, 1% low, frametime
- Process detection - Automatically shows data for active game
- Graceful fallback - Works without RTSS (returns empty data)
New file: src/OmenCoreApp/Services/RtssIntegrationService.cs
🔔 Toast Notifications
Mode change notifications for better UX:
- Fan profile changes - Shows toast when switching profiles
- Performance mode changes - Notifies on mode switch
- GPU power changes - Toast for power limit adjustments
- Keyboard lighting - Notifies on color/brightness changes
- Auto-dismiss - Fades out after 2.5 seconds
- Non-intrusive - Top-center positioning, OMEN red accent theme
New file: src/OmenCoreApp/Services/ToastNotificationService.cs
🎮 Game Library
Multi-platform game discovery and profile management:
- Platform scanning - Automatic detection of games from Steam, Epic, GOG, Xbox, Ubisoft, EA
- Library parsing - Reads Steam manifests, Epic manifests, GOG registry, etc.
- Profile integration - Create/edit game profiles directly from library
- Game launching - Launch games via platform URLs (steam://, com.epicgames://)
- Search & filter - Find games by name or filter by platform
New files:
src/OmenCoreApp/Services/GameLibraryService.cssrc/OmenCoreApp/ViewModels/GameLibraryViewModel.cssrc/OmenCoreApp/Views/GameLibraryView.xaml
Changed
Configuration
- OsdSettings - Added
ShowModeChangeNotificationsoption (default: true) - OsdSettings - Added
UseRtssForFpsoption (default: true)
Linux CLI
- DaemonCommand - Complete rewrite with TOML config support
- Version - Updated to v2.1.0
- Tomlyn package added for TOML parsing
Fixed
� EC Fan Control Safety Allowlist
- Issue: Fan preset 'Max' failed with "EC write to address 0x2C is blocked for safety"
- Root Cause: Missing EC registers 0x2C/0x2D (XSS1/XSS2 - Fan 1/2 set speed %) from safety allowlist. These are used by OmenMon-style fan control on newer OMEN models (2022+)
- Fix: Added 0x2C, 0x2D, 0x2E, 0x2F to
AllowedWriteAddressesin both EC backends - Files changed:
PawnIOEcAccess.cs,WinRing0EcAccess.cs
🐧 Linux CLI Crash on Any Command
- Issue: Running any command (
battery status,fan, etc.) threwArgumentException: An item with the same key has already been added. Key: --version - Root Cause: System.CommandLine automatically adds
--versiontoRootCommand. We were manually handling--versionbefore parsing but the conflict occurred when the parser initialized. Additionally, global--jsonoption conflicted with local--jsonin StatusCommand, and-vfor verbose could conflict with-Vfor version. - Fix: Removed duplicate global
--jsonoption (StatusCommand has its own), simplified verbose to--verboseonly (no-valias), kept manual--versionhandling before parsing - Files changed:
src/OmenCore.Linux/Program.cs
🔄 HardwareWorker SafeFileHandle Error Spam
- Issue: HardwareWorker.log filled with repeated "Error updating Primary: Cannot access a disposed object. Object name: 'SafeFileHandle'" when storage devices go to sleep
- Root Cause: LibreHardwareMonitor throws ObjectDisposedException when storage devices disconnect or enter sleep mode - this is normal/benign behavior
- Fix: Added error rate-limiting to only log these errors once per hour per hardware component, filtering known benign disposed object errors
- Files changed:
src/OmenCore.HardwareWorker/Program.cs
🔄 Multiple WMI BIOS Heartbeat Timers
- Issue: Log showed "✓ WMI BIOS heartbeat started" 3 times on startup, indicating 3 separate HpWmiBios instances each starting their own heartbeat timer
- Root Cause: HpWmiBios was being instantiated in MainViewModel, WmiFanController, and CapabilityDetectionService - each starting its own 60-second heartbeat timer
- Fix: Added singleton pattern to heartbeat timer - only one heartbeat runs globally even with multiple HpWmiBios instances
- Files changed:
src/OmenCoreApp/Hardware/HpWmiBios.cs
🔒 Thread Safety Improvements
- Issue: Race conditions in tray icon updates and OMEN key debouncing could cause inconsistent behavior
- Fix:
TrayIconService._isUpdatingIconchanged frombooltointwithInterlocked.CompareExchangeTrayIconService._lastIconUpdatechanged to_lastIconUpdateTicks(long) withInterlocked.ExchangeOmenKeyService._lastKeyPresschanged to_lastKeyPressTickswithInterlockedoperations- Both keyboard hook callback and WMI handler now use thread-safe debouncing
- Files changed:
TrayIconService.cs,OmenKeyService.cs
🔧 Tray Icon Flicker During Brightness Key Presses
- Issue: Pressing brightness keys caused the tray icon to flicker/redraw rapidly
- Fix: Added 500ms minimum interval between tray icon updates to prevent flicker during system events
- Files changed:
TrayIconService.cs
🧹 Memory Leak in OMEN Key Service
- Issue: WMI event handler was not unsubscribed before disposing the watcher, causing potential memory leak
- Fix: Added
_wmiEventWatcher.EventArrived -= OnWmiEventArrivedinStopInterception()before disposal - Files changed:
OmenKeyService.cs
🎚️ Fan Smoothing UI Alignment
- Issue: Fan smoothing labels (Duration/Step) were misaligned in the Fan Control view
- Fix: Reorganized layout to use proper vertical StackPanel instead of overlapping elements with margin hacks
- Files changed:
FanControlView.xaml
💥 Startup Crash Due to Missing XAML Resources
- Issue: App crashed on startup with
XamlParseException- missing StaticResource definitions - Fix: Added missing resources to
ModernStyles.xamlandApp.xaml:Headlinetext styleBooleanToVisibilityConverter(alias fo...
Omencore v2.0.1-beta
Changelog v2.0.1-beta
All notable changes to OmenCore v2.0.1 will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[2.0.1-beta] - 2026-01-02
Added
🐧 Linux GUI (Avalonia UI)
Cross-platform graphical interface for Linux:
- Dashboard view - Real-time temperatures, fan speeds, CPU/GPU/RAM usage
- Fan control view - Custom fan curves with presets (Silent/Balanced/Performance/Aggressive)
- System control view - Performance modes, GPU switching, keyboard lighting
- Settings view - Startup options, polling interval, theme settings
- Linux hardware service - sysfs/hwmon temperature and fan reading
- TOML configuration -
~/.config/omencore/config.toml - Dark OMEN theme - Matching the Windows UI aesthetic
New project: src/OmenCore.Avalonia/ with full MVVM architecture
⚡ GPU Overclocking (NVAPI) - Placeholder
NVIDIA GPU control framework (not yet functional):
- Service stub - NvapiService.cs with NVAPI P/Invoke structure
- ViewModel properties - Core/memory clock offset bindings ready
- Note: Actual NVAPI SDK integration pending - currently logs intent only
New file: src/OmenCoreApp/Hardware/NvapiService.cs
⚡ CPU Power Limits (PL1/PL2)
Intel CPU power limit controls:
- PL1 (Sustained) - Long-term TDP limit (15-65W)
- PL2 (Burst) - Short-term turbo limit (25-115W)
- Integration with EC - Via PowerLimitController
🐧 Linux Daemon
Full background service support for Linux:
- Daemon mode (
omencore-cli daemon --run) - Background service with fan curve engine - systemd integration - Auto-generated service file with
daemon --install - TOML configuration -
/etc/omencore/config.tomlwith full settings - Automatic fan curves - Temperature-based fan speed control with hysteresis
- PID file & signal handling - Graceful shutdown, config reload support
- Security hardening - ProtectSystem=strict, PrivateTmp, read-only home
New files:
src/OmenCore.Linux/Config/OmenCoreConfig.cs- TOML configuration modelsrc/OmenCore.Linux/Daemon/FanCurveEngine.cs- Automatic fan curve enginesrc/OmenCore.Linux/Daemon/OmenCoreDaemon.cs- Background service implementation
📊 RTSS Integration
Real FPS monitoring via RivaTuner Statistics Server:
- Shared memory integration - Reads RTSS frame data without game hooks
- Full metrics: Instant FPS, average, min/max, 1% low, frametime
- Process detection - Automatically shows data for active game
- Graceful fallback - Works without RTSS (returns empty data)
New file: src/OmenCoreApp/Services/RtssIntegrationService.cs
🔔 Toast Notifications
Mode change notifications for better UX:
- Fan profile changes - Shows toast when switching profiles
- Performance mode changes - Notifies on mode switch
- GPU power changes - Toast for power limit adjustments
- Keyboard lighting - Notifies on color/brightness changes
- Auto-dismiss - Fades out after 2.5 seconds
- Non-intrusive - Top-center positioning, OMEN red accent theme
New file: src/OmenCoreApp/Services/ToastNotificationService.cs
🎮 Game Library
Multi-platform game discovery and profile management:
- Platform scanning - Automatic detection of games from Steam, Epic, GOG, Xbox, Ubisoft, EA
- Library parsing - Reads Steam manifests, Epic manifests, GOG registry, etc.
- Profile integration - Create/edit game profiles directly from library
- Game launching - Launch games via platform URLs (steam://, com.epicgames://)
- Search & filter - Find games by name or filter by platform
New files:
src/OmenCoreApp/Services/GameLibraryService.cssrc/OmenCoreApp/ViewModels/GameLibraryViewModel.cssrc/OmenCoreApp/Views/GameLibraryView.xaml
Changed
Configuration
- OsdSettings - Added
ShowModeChangeNotificationsoption (default: true) - OsdSettings - Added
UseRtssForFpsoption (default: true)
Linux CLI
- DaemonCommand - Complete rewrite with TOML config support
- Version - Updated to v2.0.1-beta
- Tomlyn package added for TOML parsing
Fixed
🔒 Thread Safety Improvements
- Issue: Race conditions in tray icon updates and OMEN key debouncing could cause inconsistent behavior
- Fix:
TrayIconService._isUpdatingIconchanged frombooltointwithInterlocked.CompareExchangeTrayIconService._lastIconUpdatechanged to_lastIconUpdateTicks(long) withInterlocked.ExchangeOmenKeyService._lastKeyPresschanged to_lastKeyPressTickswithInterlockedoperations- Both keyboard hook callback and WMI handler now use thread-safe debouncing
- Files changed:
TrayIconService.cs,OmenKeyService.cs
🔧 Tray Icon Flicker During Brightness Key Presses
- Issue: Pressing brightness keys caused the tray icon to flicker/redraw rapidly
- Fix: Added 500ms minimum interval between tray icon updates to prevent flicker during system events
- Files changed:
TrayIconService.cs
🧹 Memory Leak in OMEN Key Service
- Issue: WMI event handler was not unsubscribed before disposing the watcher, causing potential memory leak
- Fix: Added
_wmiEventWatcher.EventArrived -= OnWmiEventArrivedinStopInterception()before disposal - Files changed:
OmenKeyService.cs
🎚️ Fan Smoothing UI Alignment
- Issue: Fan smoothing labels (Duration/Step) were misaligned in the Fan Control view
- Fix: Reorganized layout to use proper vertical StackPanel instead of overlapping elements with margin hacks
- Files changed:
FanControlView.xaml
💥 Startup Crash Due to Missing XAML Resources
- Issue: App crashed on startup with
XamlParseException- missing StaticResource definitions - Fix: Added missing resources to
ModernStyles.xamlandApp.xaml:Headlinetext styleBooleanToVisibilityConverter(alias forBoolToVisibility)ModernListViewstyle for ListView controls
- Files changed:
ModernStyles.xaml,App.xaml
🐧 Cross-Platform Registry Warning
- Issue:
GameLibraryServiceused Registry calls that caused warnings on Linux builds - Fix: Added
if (!OperatingSystem.IsWindows()) return null;guard before Registry operations - Files changed:
GameLibraryService.cs
🖥️ Remote Desktop (RDP) Window Activation
- Issue: Window would unexpectedly open/activate when starting an RDP session
- Fix: Added
SessionSwitchevent handling to suppress window activation during:- Remote connect/disconnect events
- Session lock/unlock events
- Console connect/disconnect events
- Grace period: 2-second delay after session unlock before allowing activation
- Files changed:
App.xaml.cs,MainViewModel.cs
🔍 OMEN Model Detection for Replacement Motherboards
- Issue: HP laptops with replacement motherboards show codenames like "Thetiger OMN" instead of the actual model name, causing OmenCore to report "Unknown (non-OMEN device?)"
- Fix:
- Added Product ID-based detection for OMEN devices (patterns: 8Axx, 8Bxx, 8Cxx, 88xx)
- Added recognition for HP gaming codenames: THETIGER, DRAGONFIRE, SHADOWCAT, VICTUSDRAGON
- GPU mode switching now works correctly with motherboard codenames
- Files changed:
CapabilityDetectionService.cs,SystemInfoService.cs,GpuSwitchService.cs
💾 Fan/Performance Mode Settings Not Persisting After Game Exit
- Issue: When game profiles restored "default" settings after game exit, the user's fan preset and performance mode were being overwritten in the config file
- Fix:
RestoreDefaultSettingsAsync()now restores settings temporarily without saving to config- Added
SelectPerformanceModeWithoutSave()method to prevent config overwrites
- Files changed:
MainViewModel.cs,SystemControlViewModel.cs
🎨 Keyboard RGB Lighting Not Responding (EC Backend Not Used)
- Issue: Even with "Enable experimental EC keyboard control" enabled, the WMI BIOS backend was still being preferred in Auto mode, causing RGB lighting to not work on some models
- Fix:
- Modified
BackendTypeproperty to checkExperimentalEcKeyboardEnabledfirst when in Auto mode - EC backend is now properly preferred when the experimental flag is enabled
- Added runtime update of
PawnIOEcAccess.EnableExperimentalKeyboardWritesflag when setting changes
- Modified
- Files changed:
KeyboardLightingService.cs,SettingsViewModel.cs
🔋 Battery Charge Limit Not Working (80% Limit Ignored)
- Issue: Enabling the 80% battery charge limit had no effect - the battery would still charge to 100%. The implementation only logged a message but never called the HP WMI BIOS
- Fix:
ApplyBatteryChargeLimit()now properly callsHpWmiBios.SetBatteryCareMode()- Added
HpWmiBiosreference toSettingsViewModelconstructor - Added proper error handling and logging for WMI failures
- Files changed:
SettingsViewModel.cs,MainViewModel.cs
Technical
New Dependencies
Tomlyn 0.19.0(Linux only) - TOML configuration parsing
New Classes
| File | Purpose |
|---|---|
OmenCoreConfig.cs |
TOML config model with fan curves, performance, keyboard settings |
FanCurveEngine.cs |
Temperature-based fan control with hysteresis and smooth transitions |
OmenCoreDaemon.cs |
Full daemon with PID file, signal handling, config watching |
RtssIntegrationService.cs |
RTSS shared memory integration for FPS monitoring |
ToastNotificationService.cs |
WPF toast notifications for mode changes |
GameLibraryService.cs |
Multi-platform game discovery (Steam/Epic/GOG/Xbox/Ubisoft/... |
Omencore v2.0.0-beta
Changelog v2.0.0
All notable changes to OmenCore v2.0.0 will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[2.0.0-beta] - 2026-01-01
Added
🎛️ System Optimizer
Complete Windows gaming optimization suite with one-click presets:
- Power: Ultimate Performance plan, GPU scheduling, Game Mode, foreground priority
- Services: Telemetry, SysMain/Superfetch, Search Indexing, DiagTrack toggles
- Network: TCP NoDelay, ACK frequency, Nagle algorithm, P2P updates
- Input: Mouse acceleration, Game DVR, Game Bar, fullscreen optimizations
- Visual: Transparency, animations, shadows, performance presets
- Storage: TRIM, last access timestamps, 8.3 names, SSD detection
- Safety: Registry backup and system restore point creation
- Risk indicators for each optimization (Low/Medium/High)
🌈 RGB Provider Framework
Extensible multi-brand RGB control system:
IRgbProvider&RgbManager- Unified provider model for cross-brand lighting- Corsair Provider - iCUE integration + direct HID control (K70/K95/K100 keyboards, Dark Core RGB PRO mouse)
- Logitech Provider - G HUB integration with brightness (
color:#RRGGBB@<brightness>) and breathing (breathing:#RRGGBB@<speed>) effects - Razer Provider - Synapse detection (full Chroma SDK planned)
- System Generic Provider (experimental) - RGB.NET fallback for unsupported brands
- "Apply to System" action to sync colors across all connected RGB devices
- Corsair HID-only mode toggle for advanced users (Settings → Hardware)
🖱️ Corsair Mouse DPI Control
Full DPI stage management via HID:
- 5-stage DPI profiles with per-stage configuration
- DPI profile save/load/delete with overwrite confirmation
- Stage names, angle snapping, lift-off distance settings
- Tooltips explaining each DPI feature
- Extensive HID protocol documentation (HID_DPI_RESEARCH.md)
🔧 Fan Control Enhancements
- Extreme fan preset (100% at 75°C for high-power systems)
- Fan transition smoothing - Ramped increments reduce abrupt speed changes
- "Immediate Apply" option - Low-latency for user-triggered changes
- Force reapply command - Manual re-application of fan presets
� Razer Chroma SDK
Full Chroma SDK integration via REST API:
- Session management with heartbeat timer (automatic keep-alive)
- Effect types: Static, Breathing, Spectrum Cycling, Wave, Reactive, Custom
- Per-key RGB for keyboard custom effects
- Device type support: Keyboard, Mouse, Mousepad, Headset, Keypad, ChromaLink
- Event notifications for effect changes and SDK connection status
🎨 Lighting View Redesign
Complete overhaul of the RGB Lighting page:
- Brand headers with logos and connection badges
- DeviceCard styles with modern hover states
- Logitech section: Device list, per-device color picker, breathing effect controls
- Razer section: Chroma SDK status, effect picker, device enumeration
- HP OMEN section: Per-zone color picker, brightness, apply-on-startup toggle
🔌 Unified RGB Engine
Enhanced cross-brand RGB synchronization:
- IRgbProvider interface expanded with ProviderId, IsConnected, DeviceCount, SupportedEffects
- Unified effect methods: SetStaticColorAsync, SetBreathingEffectAsync, SetSpectrumEffectAsync, TurnOffAsync
- RgbEffectType enum for consistent effect naming
- RgbManager sync methods: SyncStaticColorAsync, SyncBreathingEffectAsync, SyncSpectrumEffectAsync
- Status tracking with GetStatus() for provider health monitoring
🐧 Linux CLI (Research/Prototype)
New OmenCore.Linux project for cross-platform support:
- fan command:
--mode auto|max,--custom <cpu%> <gpu%>,--status - performance command:
--mode balanced|performance|quiet - keyboard command:
--color #RRGGBB,--brightness 0-100,--zone 1-4 - status command: Display all hardware info (temps, fans, mode)
- monitor command: Real-time monitoring with
--intervaloption - LinuxEcController: EC register access via
/sys/kernel/debug/ec/ec0/io - LinuxHwMonController: hwmon sensor integration for temps/fans
- LinuxKeyboardController: HP WMI keyboard RGB via sysfs
�🎨 UI Improvements
- DarkContextMenu control - Custom context menu with no white margins
- Modern toggle switches - iOS-style toggles replace checkboxes in Settings
- GPU Voltage/Current Graph - Added GPU V/C monitoring chart to dashboard
- Per-Core Undervolt - Individual undervolt controls for each CPU core
- Keyboard Lighting Diagnostics - Device detection, test patterns, log collection
- Keyboard RGB Status Hints - Contextual tips for troubleshooting
- Sidebar width increased from 200px to 230px for better readability
Changed
📈 Performance Improvements
- LoadChart rendering improved from 10 FPS to 20 FPS
- Reduced render throttling from 100ms to 50ms intervals
- Polyline reuse to avoid object recreation overhead
- BitmapCache for better visual performance
- Fan Curve Editor UX - Improved point dragging
- Increased point size from 16px to 20px (26px on hover)
- Glowing highlight effect on hover
- Increased line thickness for better visibility
🔄 Architecture
- TrayIconService refactored to use DarkContextMenu
- MainViewModel initializes RgbManager and registers providers at startup
- Corsair SDK respects
CorsairDisableIcueFallbackconfig flag
Fixed
🐞 Critical Fixes
- Fan Preset Restoration on Startup -
SettingsRestorationServicewas never called in production- Added
RestoreSettingsOnStartupAsync()to MainViewModel with retry logic - Fan presets and GPU Power Boost now properly restored after reboot
- Added
- Auto-Start --minimized Flag - Command line args weren't being processed
- Now properly checks
--minimized,-m,/minimizedflags - Added command line argument logging for debugging
- Now properly checks
- Corsair HID Stack Overflow - Fixed recursion bug in
BuildSetColorReport- Method was calling itself instead of using product-specific switch
🔧 System Tray Fixes
- System Tray Crash - Fixed crash when right-clicking tray icon
- Bad ControlTemplate tried to put Popup inside Border
- Tray Icon Update Crash - Fixed "Specified element is already the logical child" error
- Now creates fresh UI elements instead of reusing existing ones
- Right-click Context Menu - Fixed menu not appearing
- Applied dark theme styling (dark background, white text, OMEN red accents)
- Temperature display and color changes restored
⚙️ Other Fixes
- Auto-Start Admin Error Feedback - Better error handling for Task Scheduler
- Shows clear error when attempting to enable auto-start without admin privileges
- Platform compatibility warnings - Added
[SupportedOSPlatform("windows")]attributes- Fixed 57 compilation warnings for Windows-only APIs
- Keyboard color reset on startup - Fixed unexpected auto-set to red
- Quick profile state mismatch - Fixed panel vs active profile mismatch
- Fan-profile transition latency - Improved switching speed
- CPU temperature monitoring - Better smoothing and sensor selection
- Test Parallelization Conflicts - Fixed 6 flaky tests with collection isolation
- Code Quality - Fixed 26+ analyzer warnings (IDE0052, IDE0059, IDE0060)
Technical
🧪 Testing
- 66 tests passing (up from 24)
- DPI profile tests with save/load/overwrite scenarios
- Corsair mouse PID payload tests
- RGB provider unit tests (Corsair, Logitech, RgbNetSystem)
- Test collection isolation for config-sensitive tests
📦 Build System
- Clean compilation (0 warnings, 0 errors)
- Removed obsolete methods:
CreateCpuTempIcon,TryAlternativeWmiWatcher,ApplyViaEc - Modernized C# syntax (target-typed new, pattern matching, switch expressions)
- Logging improvements with fallback files and
OMENCORE_DISABLE_FILE_LOGtoggle
Development Progress
Phase 1: Foundation & Quick Wins ✅
- System Tray Overhaul (context menu, dark theme, icons)
- Settings View Improvements (toggle switches instead of checkboxes)
- Tray Icon Update Crash fixes (WPF logical parent issues)
Phase 2: System Optimizer ✅
- Core Infrastructure (services, backup, verification)
- Power Optimizations (Ultimate Performance, GPU scheduling, Game Mode)
- Service Optimizations (telemetry, SysMain, search indexing)
- Network Optimizations (TCP settings, Nagle algorithm)
- Input & Graphics (mouse acceleration, Game DVR, fullscreen opts)
- Visual Effects (animations, transparency, presets)
- Storage Optimizations (TRIM, 8.3 names, SSD detection)
- UI Implementation (tabs, toggles, risk indicators, presets)
Phase 3: RGB Overhaul ✅
- Asset Preparation (device images, brand logos)
- Enhanced Corsair SDK (iCUE 4.0, full device enumeration)
- Corsair HID direct control (K70/K95/K100 keyboards, Dark Core RGB PRO mouse)
- Corsair Mouse DPI Control (5-stage profiles with full HID)
- Full Razer Chroma SDK (REST API, effects: static, breathing, spectrum, wave, reactive, custom)
- Enhanced Logitech SDK (G HUB integration, direct HID)
- Unified RGB Engine (enhanced IRgbProvider, sync all, cross-brand effects)
- Lighting View Redesign (brand headers, DeviceCard styles, connection badges)
Phase 4: Linux Support (Research Complete)
- OmenCore.Linux CLI project created
- Fan control command (--mode, --custom, --status)
- Performance mode command (--mode balanced/performance/quiet)
- Keyboard RGB command (--colo...
Omencore v1.5.0-beta4
OmenCore v1.5.0-beta4 Changelog
Release Date: December 18, 2025
Status: Beta 4
Previous Version: v1.5.0-beta1, beta2 and beta3
- Detailed Changelog for v1.5.0-beta1 available here: https://github.com/theantipopau/omencore/blob/main/docs/CHANGELOG_v1.5.0-beta.md
- Detailed Changelog for v1.5.0-beta2 available here: https://github.com/theantipopau/omencore/blob/main/docs/CHANGELOG_v1.5.0-beta2.md
- Detailed Changelog for v1.5.0-beta3 available here: https://github.com/theantipopau/omencore/blob/main/docs/CHANGELOG_v1.5.0-beta3.md
🔧 Critical Bug Fixes
GPU Power Boost Reset When Applying Fan Presets
Files Changed:
Hardware/WmiFanController.cs
Problem: GPU Power Boost set to Maximum (175W TGP on RTX 4090) was being silently reset to Medium (~45W) whenever a fan preset was applied. This caused ~4x GPU performance loss during gaming.
Root Cause: WmiFanController.ApplyPreset() called ApplyGpuPowerFromPreset() which set GPU power based on preset name:
- "performance", "turbo", "gaming" presets → Maximum
- "quiet", "silent", "battery" presets → Minimum
- All other presets (Auto, Max, Custom) → Medium ❌
This meant applying common presets like "Auto" or "Max" would override the user's explicitly set GPU Power Boost level.
Fix: Removed ApplyGpuPowerFromPreset() method entirely. GPU Power Boost is now controlled independently via the System tab and is not affected by fan preset changes.
User Impact:
- GPU Power Boost setting now persists correctly across fan preset changes
- RTX 4090 users report sustained 160-175W instead of being throttled to 45W
- Dramatic improvement in gaming performance for affected users
Worker Race Condition on Startup (from beta3)
Files Changed:
Hardware/LibreHardwareMonitorImpl.csHardware/HardwareWorkerClient.cs
Problem: On some systems, OmenCore would hang or show 0°C temps immediately after boot due to hardware worker not being ready.
Fix:
- Added
_workerInitializingflag to track async initialization state ReadSampleAsyncnow waits up to 2 seconds for worker initialization- Increased connection timeout from 3s to 5s
- Added 3 retry attempts for worker connection with 1s delay between retries
Tray Icon Not Appearing After Reboot (from beta3)
Files Changed:
App.xaml.cs
Problem: After Windows boot, the system tray icon sometimes failed to appear even though OmenCore was running.
Root Cause: Windows Explorer may not be fully ready to receive tray icon registrations immediately after boot.
Fix: Added EnsureTrayIconVisibleAsync() method that toggles icon visibility at 3s and 8s after startup, forcing Windows to re-register the icon.
� New Features
Preliminary Razer Chroma Support
Files Added:
Razer/RazerDevice.csRazer/RazerDeviceType.csRazer/RazerDeviceStatus.csRazer/RazerService.cs
Files Changed:
ViewModels/LightingViewModel.csViewModels/MainViewModel.csViews/LightingView.xaml
Description: Added a new Razer Devices section to the RGB Lighting tab. This is preliminary support that detects if Razer Synapse is running and provides placeholder UI for future Chroma SDK integration.
Features:
- Detects Razer Synapse process on system
- Shows "SYNAPSE DETECTED" badge when available
- Static color controls (RGB sliders)
- Breathing effect button
- Spectrum cycling effect button
- Device list placeholder for future SDK integration
Note: This is a foundation for full Razer Chroma SDK integration in a future release. Currently shows placeholder functionality only.
🔧 Bug Fixes
Corsair Device Status Display
Files Changed:
Corsair/CorsairDeviceStatus.cs
Problem: Corsair device info in the RGB tab showed "OmenCore.Corsair.CorsairDeviceStatus" instead of meaningful device information.
Root Cause: The CorsairDeviceStatus class had no ToString() override, so WPF binding displayed the class name.
Fix: Added ToString() override that shows connection type, polling rate, battery percent, and firmware version in a user-friendly format (e.g., "USB • 1000Hz • FW 1.2.3").
Corsair Dark Core RGB PRO Misidentification
Files Changed:
Services/Corsair/CorsairHidDirect.cs
Problem: Dark Core RGB PRO mouse was incorrectly identified as "Scimitar RGB Elite" on some systems.
Root Cause: HidSharp library was reporting PID 0x1BF0 for Dark Core RGB PRO, which was mapped to Scimitar RGB Elite in the device database.
Fix: Remapped PID 0x1BF0 to "Dark Core RGB PRO" since real-world testing confirmed this is the correct device for that PID.
PowerModeChanged Event Log Spam
Files Changed:
Services/PowerAutomationService.cs
Problem: The log was being spammed every ~1 second with "Power state unchanged, skipping profile application" messages, cluttering diagnostic logs.
Root Cause: SystemEvents.PowerModeChanged fires for many events (battery % changes, etc.), and each was logged at Info level even when no action was taken.
Fix: Changed unchanged power state logging from Info to Debug level. Only actual power state changes (AC plug/unplug) are now logged at Info level.
�🏗️ Code Quality Improvements
Build Warnings Eliminated
Files Changed:
ViewModels/MainViewModel.csHardware/MsrAccessFactory.csOmenCore.HardwareWorker/Program.cs
Changes:
- Fixed null reference warnings with proper null-forgiving operators
- Suppressed intentional WinRing0 obsolete warnings (kept as fallback for systems without PawnIO)
- Added
[SupportedOSPlatform("windows")]attribute to worker process - Build now completes with 0 warnings, 0 errors
Intel Arc GPU Detection Improvements
Files Changed:
Hardware/LibreHardwareMonitorImpl.csOmenCore.HardwareWorker/Program.cs
Note: LibreHardwareMonitor does not yet fully support Intel Arc GPUs. These changes improve detection and logging for future compatibility.
Changes:
- Added GPU enumeration logging on startup for diagnostics
- Intel Arc GPUs are now included in safe update check (same protection as NVIDIA/AMD)
- Added power/clock sensor reading for Intel Arc in worker process
- Better diagnostic logging when Arc sensors are unavailable
Example Log Output:
[GPU Detected] Intel Arc: Intel Arc A770
- Temp sensors: [GPU Core=45°C]
- Load sensors: [GPU Core=12%]
- Power sensors: [GPU Power=35.2W]
📋 Files Changed Summary
| File | Changes |
|---|---|
Hardware/WmiFanController.cs |
Removed ApplyGpuPowerFromPreset() - GPU power no longer overridden by fan presets |
Hardware/LibreHardwareMonitorImpl.cs |
Added LogDetectedGpus(), improved Intel Arc handling |
Hardware/MsrAccessFactory.cs |
Suppressed intentional obsolete warnings |
Hardware/HardwareWorkerClient.cs |
Increased timeouts, added retry logic (from beta3) |
OmenCore.HardwareWorker/Program.cs |
Added [SupportedOSPlatform], GPU logging, Intel Arc support |
ViewModels/MainViewModel.cs |
Fixed null reference warnings |
App.xaml.cs |
Added tray icon visibility retry (from beta3) |
installer/OmenCoreInstaller.iss |
Version bump to 1.5.0-beta4 |
VERSION.txt |
Updated to 1.5.0-beta4 |
🧪 Testing Checklist
- Build completes with 0 warnings, 0 errors
- GPU Power Boost persists when changing fan presets
- RTX 4090 sustains 160-175W during benchmarks
- Worker process starts reliably after boot
- Tray icon appears after reboot
- Intel Arc systems log GPU detection (even if sensors unavailable)
📦 Installation
Installer: OmenCoreSetup-1.5.0-beta4.exe
Upgrade Notes:
- Uninstall previous beta first (recommended) or install over existing
- GPU Power Boost settings are preserved in config
- Worker process will be updated automatically
🔍 Known Issues
-
Intel Arc GPU sensors - LibreHardwareMonitor doesn't fully support Intel Arc yet. Temperature/power readings may be unavailable on some Arc systems.
-
GPU Power Limit slider - MSI Afterburner-style power limit adjustment is not available on most laptops due to NVIDIA driver restrictions. Use the existing GPU Power Boost (Maximum) setting instead.
📝 Changelog from Beta3
This release focuses on stability and fixing the critical GPU power bug:
-
GPU Power Fix - The main improvement. Users with NVIDIA GPUs should see dramatically better gaming performance if they were affected by the preset bug.
-
Build Quality - Zero warnings builds for cleaner CI/CD.
-
Intel Arc Preparation - Groundwork for future Arc support when LibreHardwareMonitor adds it.
SHA256: 40C889605E13895901437DB8C1D4EEDF76D65BD4819FF54B5EDD8F95AF47D99F
Omencore v1.5.0-beta3
OmenCore v1.5.0-beta3 Changelog
Release Date: December 18, 2025
Status: Beta 3
Previous Version: v1.5.0-beta2
- Detailed Changelog for v1.5.0-beta1 available here: https://github.com/theantipopau/omencore/blob/main/docs/CHANGELOG_v1.5.0-beta.md
- Detailed Changelog for v1.5.0-beta2 available here: https://github.com/theantipopau/omencore/blob/main/docs/CHANGELOG_v1.5.0-beta2.md
✨ UI/UX Improvements
Fan Profile Tooltips
Files Changed: Views/FanControlView.xaml
Added descriptive tooltips to all fan profile cards explaining what each mode does:
- Max: "Forces all fans to maximum RPM. Use for heavy gaming or stress tests."
- Gaming: "Aggressive fan curve that ramps up quickly. Good for gaming sessions."
- Auto: "BIOS-controlled balanced curve. Recommended for everyday use."
- Silent: "Prioritizes quiet operation. Fans stay low until temps rise significantly."
- Custom: "Apply your custom fan curve defined in the editor below."
Curve Active Indicator
Files Changed: Views/FanControlView.xaml, ViewModels/FanControlViewModel.cs
Added a visual indicator showing when a custom fan curve is actively being applied by the FanService. Shows a green "🔄 Curve Active" badge next to the active mode.
Undervolt Preset Tooltips
Files Changed: Views/SystemControlView.xaml
Added risk-level tooltips to undervolt quick presets:
- Conservative (-60 mV): "Safe starting point for most CPUs. Low risk of instability."
- Moderate (-100 mV): "Good balance of power savings. Test with stress tests before daily use."
- Aggressive (-140 mV): "
⚠️ High risk! May cause crashes or BSODs. Only for silicon lottery winners."
Aggressive Undervolt Confirmation Dialog
Files Changed: Views/SystemControlView.xaml, ViewModels/SystemControlViewModel.cs
The "Aggressive (-140 mV)" undervolt preset now shows a confirmation dialog warning about:
- Blue screen crashes (BSOD) risk
- Application crashes or freezes
- System instability under load
- Recovery information (undervolt resets on reboot)
Users must confirm before the aggressive offset is applied.
Undervolt Slider Visual Improvements
Files Changed: Views/SystemControlView.xaml
- Added tick marks to undervolt sliders (
TickPlacement="BottomRight") - Added tick labels at key values (-200, -150, -100, -50, 0) for easier reference
TCC Slider Direction Labels
Files Changed: Views/SystemControlView.xaml
Added "← Higher Temps" and "Lower Temps →" labels below the TCC offset slider to clarify the reversed slider direction.
🔧 Bug Fixes
Critical: NVML Crash During GPU Benchmarks
Files Changed:
Hardware/LibreHardwareMonitorImpl.csApp.xaml.cs
Problem: OmenCore crashes when running GPU benchmarks (e.g., Heaven Benchmark). Windows Event Log shows:
Exception: System.AccessViolationException
at LibreHardwareMonitor.Interop.NvidiaML.NvmlDeviceGetPowerUsage(NvmlDevice)
Root Cause: NVIDIA's NVML library (nvml.dll) can crash with an access violation when querying GPU power/sensors during high GPU load. This is a driver bug in NVML, not OmenCore.
Fix:
- Added
TryUpdateGpuHardware()method that wraps GPU sensor updates in try-catch - Tracks consecutive GPU monitoring failures (
_nvmlFailures) - After 3 consecutive failures, automatically disables GPU monitoring to prevent crash loops
- Enhanced crash dialog specifically detects NVML crashes and recommends driver updates
Note: The primary fix is now the Out-of-Process Hardware Worker (see Architecture section below).
🏗️ Architecture Changes
Out-of-Process Hardware Worker
Files Changed:
- NEW:
OmenCore.HardwareWorker/- Separate worker process Hardware/HardwareWorkerClient.cs- IPC client and process managerHardware/LibreHardwareMonitorImpl.cs- Worker mode integrationViewModels/MainViewModel.cs- Enable worker by defaultbuild-installer.ps1- Build and publish workerinstaller/OmenCoreInstaller.iss- Stop worker on uninstall
Problem: NVML's AccessViolationException is a Corrupted State Exception (CSE) that cannot be caught in .NET 8. When NVML crashes, the entire OmenCore process terminates regardless of try-catch blocks.
Solution: Hardware monitoring now runs in a separate process (OmenCore.HardwareWorker.exe). If NVML crashes, only the worker process dies - the main app continues running and automatically restarts the worker.
Architecture:
OmenCore.exe (Main App - WPF UI)
│
│ Named Pipes IPC ("OmenCore_HardwareWorker")
│ Protocol: JSON over pipes
│ - PING → PONG (heartbeat)
│ - GET → HardwareSample JSON
│ - SHUTDOWN → OK (graceful exit)
▼
OmenCore.HardwareWorker.exe (Worker Process - Hidden)
│
│ LibreHardwareMonitor API calls
▼
Hardware/Drivers (NVML, etc.)
Features:
- Worker process starts automatically when OmenCore launches
- Worker runs hidden (no console window visible)
- If worker crashes, main app auto-restarts it (max 5 attempts, 5s cooldown)
- Main app continues with cached sensor values during worker restart
- Worker logs errors to
OmenCore_worker.logfor diagnostics - Worker is killed on app exit and uninstall
Impact: Users can now run GPU benchmarks without OmenCore crashing. If NVML fails, only temperature/power readings pause briefly during worker restart.
Intel Arc GPU Temperature Not Detected
Files Changed:
Hardware/LibreHardwareMonitorImpl.cs
Problem: OMEN 45L desktops with Intel Arc GPUs show 0°C for GPU temperature.
Root Cause: Intel Arc is a dedicated GPU but was being treated as integrated (fallback-only). The code only read Intel GPU temps when no other GPU was detected, but Arc should be the primary GPU.
Fix:
- Intel Arc GPUs (detected by name containing "Arc") are now treated as dedicated GPUs
- Arc GPUs get full sensor support: temperature, load, power, clock speed
- Uses
TryUpdateGpuHardware()for safe updates (same protection as NVIDIA/AMD) - Debug logging when Arc temp readings fail to help diagnose issues
Critical: GPU Power Boost Reset to Medium When Applying Fan Presets
Files Changed:
Hardware/WmiFanController.cs
Problem: GPU Power Boost set to Maximum (175W TGP on RTX 4090) was being reset to Medium (~45W) whenever a fan preset was applied. This caused significant GPU performance loss during gaming (45W instead of 175W).
Root Cause: WmiFanController.ApplyPreset() called ApplyGpuPowerFromPreset() which set GPU power based on preset name:
- "performance", "turbo", "gaming" → Maximum
- "quiet", "silent", "battery" → Minimum
- Everything else (Auto, Max, Custom) → Medium ❌
This meant applying the "Auto" or "Max" fan preset would override the user's explicitly set GPU Power Boost level.
Fix: Removed ApplyGpuPowerFromPreset() method entirely. GPU Power Boost is now controlled independently via the System tab and is not affected by fan preset changes.
User Impact: GPU Power Boost setting now persists correctly. Setting Maximum on the System tab will remain at Maximum regardless of which fan preset is active.
Critical: Version Display Fixed
Files Changed:
OmenCoreApp.csproj
Problem: About section showed "Version: 1.4.0" instead of "1.5.0".
Root Cause: Assembly version in csproj was not updated to 1.5.0.
Fix: Updated <AssemblyVersion> and <FileVersion> to 1.5.0.
Critical: Custom Fan Curves Only Applying Temporarily
Files Changed:
Services/FanService.csHardware/WmiFanController.cs
Problem: Custom fan curves would apply initially but then revert back to BIOS control. Setting 100% via curve would spin fans up then slow down again. (GitHub Issue #12)
Root Cause: Multiple issues:
- Missing countdown extension -
SetFanSpeed()didn't start the countdown extension timer. HP BIOS has a 120-second timeout that resets fan control to auto mode. - Callback condition bug - The countdown extension callback only ran when
_lastMode != Default, but custom curves don't change_lastMode- they useIsManualControlActiveinstead. - No forced re-application - Curve only re-applied when target percentage changed, but BIOS could reset it silently.
Fix:
WmiFanController.SetFanSpeed()now starts countdown extension timer- Countdown callback now extends for any manual control mode (
IsManualControlActive || non-Default mode) - Added force-refresh mechanism: curve re-applies every 60 seconds even if target percentage unchanged
- Reduced curve update interval from 15s to 10s for faster response
Critical: Custom Curve 100% Only Reaching ~5500 RPM vs Max Preset 5900 RPM
Files Changed:
Hardware/WmiFanController.cs
Problem: Max preset reaches 5900 RPM, but custom curve at 100% only reaches ~5500 RPM. (GitHub Issue #12)
Root Cause:
- Max preset uses
SetFanMax(true)- a special BIOS command that bypasses power limits - Custom curve used
SetFanLevel(55)which is subject to BIOS thermal/power limits
Fix: SetFanSpeed(100) now uses SetFanMax(true) to achieve true maximum RPM:
if (percent >= 100)
{
success = _wmiBios.SetFanMax(true);
// Fallback to SetFanLevel(55) if SetFanMax fails
}
else
{
_wmiBios.SetFanMax(false); // Disable max mode first
// Then apply normal SetFanLevel
}This ensures custom curves requesting 100% get the same max RPM as the Max preset.
Hotkey Logging Accuracy
Files Changed:
ViewModels/MainViewModel.cs
Problem: Log showed "Global hotkeys enabled" even when hotkeys were disabled in settings.
Fix: `Initi...