Under the hood
Four decisions that made it work.
Chroma.GG is a .NET 8 WPF app, x64-only, with no MVVM framework and no DI container. These are the problems that actually shaped it.
Problem 01 · flicker
Overlays kept strobing the screen
Discord notifications, the Steam overlay and RTSS's OSD all steal foreground focus for a frame. Reacting to every focus event meant the display snapped back to the desktop profile and instantly returned. You would see it flash, several times a match.
Every focus change now passes through a single DispatcherTimer. Each event overwrites a pending profile and restarts a 300 ms countdown, so only a focus state that stays current ever reaches the display. A flick away and back never lands at all, and a real alt-tab still feels instant.
Problem 02 · no public API
NVIDIA doesn't expose those sliders
Digital Vibrance has a real, public NVAPI call. Gamma, contrast, brightness and hue don't. NVIDIA has confirmed on its own developer forum that the Control Panel's colour sliders sit behind a private, NDA-only API. No wrapper library can reach them.
So they don't go through NVAPI at all. Chroma.GG writes the Windows GDI gamma ramp directly, which is the same per-channel lookup table the driver ends up painting with. It's public, documented, works on any vendor's card, and it lands in captures too. It does have a real limit. Three independent channel curves can't do true hue rotation, so temperature and hue are scaled approximations.
Problem 03 · bad numbers
Measuring FPS from outside the game lies
ETW and DWM frame events sit downstream of the Windows compositor, which is documented to throttle a high-refresh display's frame delivery while a slower monitor is attached. That corrupts the reading on exactly the multi-monitor setups most PC players run.
RTSS avoids it by hooking Present() inside the game process, upstream of the compositor. Rather than reinvent that and take on an injection surface of its own, Chroma.GG reads RTSS's shared memory block. It's the same source Afterburner's OSD uses.
Problem 04 · capture cost
Recording that doesn't cost you frames
Capture runs on DXGI Desktop Duplication rather than Windows.Graphics.Capture, because it draws no capture-indicator border and needs no package identity grant. Frames stay on the GPU through HLSL colour-correction and cursor compositing, then go straight into NVENC.
Audio is a parallel WASAPI pipeline: desktop loopback, microphone and per-process capture, resampled and mixed against a QPC clock, then muxed to MP4 through Media Foundation.