This tool provides user-configurable hotkeys to adjust the hardware (monitor) gamma and NVIDIA color/digital vibrance settings dynamically in any application.
EXTERNAL DEPENDENCIES: ddcutil, nvibrant-bin
How to use:
-
Install external dependencies:
-
Install python dependencies in your environment of choice (
pip install -r requirements.txt) -
Run:
python3 gamergamma.py(or, use the compiled binary from the Releases) -
Select your primary gaming display/monitor from the dropdown.
-
Adjust the gamma and/or vibrance sliders to your preference, and select Apply to test it.
-
Select Save Preset to write the settings to local file (gg_presets.json)
-
Click the Preset # () title to reconfigure the preset's hotkey to your choice.
-
Use your hotkeys in any game/app of your choice.
NOTES:
- Releases are lazily packaged using
pyinstaller --onefile - Developer test environment is LIMITED. Proven on CachyOS with KDE Plasma/Wayland, using applications launched via proton (e.g. Steam games), including using gamescope in Steam game launch parameters.
DEVELOPERS/DEBUGGING:
-
The apply_presets() function is vital and is where compatibilty will absolutely break. Your pull requests are equally vital to universal support.
-
This function only supports monitors implementing MCCS (Monitor Control Command Set) over I2C, and therefore can be controlled via ddcutil.
-
The purpose of this function (and application) is to dynamically adjust the hardware gamma configuration (only using command 0x72 - Gamma) of the primary gaming monitor. Additionally, it is to adjust the digital vibrance dynamically for the color-challenged users.
Problems:
- Destructive settings - Does not store original monitor configuration
- nvibrant parameters are structured for the formatted output of (
nvibrant) using a singular GPU RTX30XX-series presence with one HDMI and 3 DP outputs. - ddcutil 0x72 value packing is tailored to Dell S2716DG (see Notes)
- FIXED 24DEC2025 -- NVIBRANT call doesn't use Monitor index (always #2)
- NVIDIA-only support for vibrance control
Development reference:
Dell S2716DGonly uses the MSByte of the gamma value.- Writing LSByte != 0x00 can cause CRC Verify errors.
- The scheme of only writing MSByte has not been tested on other monitors.
Output of nvibrant ("Normal output" upon which its usage is based):
❯ nvibrant
Driver version: (580.105.08)
Display 0:
• (0, HDMI) • Set vibrance ( 0) • None
• (1, DP ) • Set vibrance ( 0) • Success
• (2, DP ) • Set vibrance ( 0) • None
• (3, DP ) • Set vibrance ( 0) • Success
• (4, DP ) • Set vibrance ( 0) • None
• (5, DP ) • Set vibrance ( 0) • Success
• (6, DP ) • Set vibrance ( 0) • None
busno=4. Monitor apparently returns -EIO for unsupported features. This cannot be relied on.
THEREFORE:
- the command structure is:
nvibrant 0 <vibrance_monitor1> 0 <vibrance_monitor2> 0 <vibrance_monitor3> - Vibrance value for the respective monitor index shall be inserted at position 2*index-1 in the command parameters.
- quality: non-destructive settings (save monitor's settings)
- polish: minimize to tray
- flair: preset pane title reactions to global hotkey recognition
- quality: better compatibility (need users)
