A lightweight, standalone RGB controller for PC hardware. Built for personal use as a replacement for SignalRGB (too bloated) and OpenRGB (conflicts with Stream Deck, buggy on some hardware).
This app was built for my specific hardware. It currently supports:
| Device | Connection | Notes |
|---|---|---|
ASRock Polychrome USB (VID 26CE, PID 01A2) |
USB HID | Tested on ASRock Z890M Riptide. Does not require admin. |
MSI Mystic Light (VID 1462, 185-byte protocol) |
USB HID | Tested on MSI MPG Z790I EDGE WIFI (PID 7E03). Does not require admin. |
Gigabyte RGB Fusion 2.0 (VID 048D, ITE IT5711/IT8297) |
USB HID | Tested on Gigabyte X870E Aorus Master X3D. Does not require admin. |
ASUS Aura USB (VID 0B05) |
USB HID | Tested on ASUS motherboards (PID 19AF). Does not require admin. |
ASUS GPU RGB (ENE controller at I2C 0x67) |
NvAPI I2C | Tested on ASUS TUF RTX 5090. Does not require admin. NVIDIA GPU only. |
ENE AUDA-series DDR5 DRAM RGB (addresses 0x70–0x77) |
SMBus (i801/PIIX4) | Tested with KLEVV DDR5 RGB. Requires admin (kernel-level SMBus access). Supports Intel (i801) and AMD (PIIX4) chipsets. |
There is a Diagnostics button in the app that collects device info, register dumps, and system details into a zip file on your Desktop. Run as admin to include SMBus/RAM data. If you'd like support for your hardware, you can open an issue and attach that zip. I'll do my best to look into it, but there's no commitment to extend support — this is a personal project.
- Static color — pick any color via the color picker, preset buttons, or manual RGB entry
- Effects — breathing, color cycle, rainbow, strobe — all with adjustable speed
- Per-zone color — every RGB zone (Logo, Accent, D_LED1, LED 1–8, etc.) is its own card with independent color and on/off control
- Per-device calibration — RGB brightness correction sliders per device to compensate for LED imbalance
- Presets — save/load/overwrite/delete named presets; saves per-zone color, enabled state, effect, and speed
- Startup preset — automatically apply a preset on launch
- System tray — minimize to tray, close to tray, load presets from tray menu
- Start minimized — launch hidden in the tray
- Start at login — when running as Administrator, creates a Windows scheduled task that launches the app at login with elevated privileges and no UAC prompt; when running without admin, creates a standard startup shortcut (note: Windows Defender may also flag the scheduled task creation — see Windows Defender note above)
--apply-quitmode — apply the startup preset and exit immediately (saves RAM for always-on setups)- Save to Hardware — write the current color/mode to the DRAM controller's non-volatile flash so it persists across power cycles (boot color). See warning below
- Diagnostics — collect system info, USB HID enumeration, SMBus scan, device register dumps, and config files into a zip for troubleshooting (run as admin to include SMBus/RAM data)
- Cross-platform — runs on Windows (PawnIO driver) and Linux (smbus2); Linux support is untested
- Single instance — prevents duplicate instances with a friendly notification
Download frugalRGB.zip from the Releases page, extract it, and run frugalRGB.exe.
- For motherboard RGB only (ASRock Polychrome USB): no admin required.
- For RAM RGB (DDR5 via SMBus): run as Administrator.
Windows Defender: Because this is an unsigned PyInstaller executable, Windows Defender may flag it as a threat. You'll need to allow it manually (Windows Security > Virus & threat protection > Protection history > Allow on device). This is a common false positive with PyInstaller-packaged apps.
On Windows, DDR5 DRAM RGB control requires kernel-level port I/O access through PawnIO:
- Install PawnIO from https://pawnio.eu/
- Download
SmbusI801.binfrom PawnIO.Modules releases - Place
SmbusI801.binin themodules/folder next to the app (or next to the exe's_internal/modules/) - Run as Administrator
git clone https://github.com/emaspa/frugalRGB.git
cd frugalRGB
pip install -r requirements.txtRun:
# For motherboard RGB only (no admin needed):
pythonw main.pyw
# For RAM RGB (needs admin):
# Run your terminal as Administrator, then:
pythonw main.pywpip install pyinstaller
python build.pyOutput: dist/frugalRGB/frugalRGB.exe
Config files are stored in your home directory:
~/.frugalrgb_config.json— calibration, UI options, startup preset~/.frugalrgb_presets.json— saved presets
For a "set and forget" setup, create a shortcut to:
frugalRGB.exe --apply-quit
This applies the configured startup preset and exits immediately — no window, no tray, minimal resource usage.
The Save to Hardware button writes the current color and mode to the device's non-volatile flash memory, so it persists across power cycles — before Windows even loads. Supported on ENE DRAM and Gigabyte RGB Fusion 2.0 controllers.
Use at your own risk. This operation is known to be unstable on some ENE firmware versions. In rare cases it can soft-lock the RGB controller, making the LEDs unresponsive. Recovery typically requires physically reseating the DIMM. OpenRGB disables this feature by default for the same reason.
The app requires a double confirmation before saving. Make sure you have already clicked Apply with the desired color/mode before saving.
If you just want your color applied at every boot without touching hardware flash, use the startup preset + Start at login approach instead — that's the safer option.
main.pyw Entry point
frugalrgb/
controllers/
base.py Abstract controller interface
detect.py Device auto-detection
asrock_polychrome.py ASRock Polychrome USB HID protocol
msi_mystic_light.py MSI Mystic Light USB HID protocol
gigabyte_rgb_fusion2.py Gigabyte RGB Fusion 2.0 USB HID protocol
asus_aura_usb.py ASUS Aura USB HID protocol
asus_gpu.py ASUS GPU RGB via ENE I2C controller
ene_dram_ddr5.py ENE AUDA DDR5 DRAM SMBus protocol
smbus/
interface.py Platform-agnostic SMBus ABC
windows.py PawnIO-backed i801/PIIX4 SMBus (Windows)
nvapi.py NvAPI I2C for GPU-connected controllers
linux.py /dev/i2c-* via smbus2 (Linux)
effects/
engine.py Threaded effect loop (hw or sw)
gui/
app.py CustomTkinter main window + tray
widgets.py Device cards, presets, calibration
diagnostics.py Diagnostics zip collector
build.py PyInstaller build script
modules/
SmbusI801.bin PawnIO kernel module (not included — download separately)
