SkillAgentSearch skills...

Nvibrant

🟢 Nvidia Digital Vibrance on Wayland

Install / Use

/learn @Tremeschin/Nvibrant
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

[!NOTE] This project is complete and stable, no actions are needed unless a driver update breaks it!

<div align="center"> <h1>nvibrant</h1> <p>Configure Nvidia's Digital Vibrance on Wayland</p> <a href="https://pypi.org/project/nvibrant/"><img src="https://img.shields.io/pypi/v/nvibrant?label=PyPI&color=blue"></a> <a href="https://pypi.org/project/nvibrant/"><img src="https://img.shields.io/pypi/dw/nvibrant?label=Installs&color=blue"></a> <a href="https://github.com/Tremeschin/nvibrant/"><img src="https://img.shields.io/github/v/tag/Tremeschin/nvibrant?label=GitHub&color=orange"></a> <a href="https://github.com/Tremeschin/nvibrant/stargazers/"><img src="https://img.shields.io/github/stars/Tremeschin/nvibrant?label=Stars&style=flat&color=orange"></a> <a href="https://github.com/Tremeschin/nvibrant/releases/"><img src="https://img.shields.io/github/v/release/Tremeschin/nvibrant?label=Release&color=light-green"></a> <a href="https://github.com/Tremeschin/nvibrant/releases/"><img src="https://img.shields.io/github/downloads/Tremeschin/nvibrant/total?label=Downloads&color=light-green"></a> <a href="https://discord.gg/KjqvcYwRHm"><img src="https://img.shields.io/discord/1184696441298485370?label=Discord&style=flat&color=purple"></a> <br> <br> </div> <img src="https://github.com/user-attachments/assets/962a3f4d-6022-402f-a47b-27aeba595a19"/>

šŸ”„ Description

NVIDIA GPUs have a nice feature called Digital Vibrance that increases the colors saturation of the display. The option is readily available on nvidia-settings in Linux, but is too coupled with libxnvctrl, making it softly "exclusive" to the X11 display server over wayland; but I paid for my pixels to glow :^)

An interesting observation is that the setting persists after modifying it on X11 and then switching to Wayland. I theorized (1) (2) it was possible to call some shared library or interface to configure it directly in their driver, independently of the display server, and indeed, it is possible!

This repository uses nvidia-modeset and nvkms headers found at nvidia/open-gpu-kernel-modules to make ioctl calls in the /dev/nvidia-modeset device for configuring display attributes. These headers are synced with the proprietary releases, should work fine if you're on any of nvidia-dkms, nvidia-open or nvidia.

Note: A future, and intended way, will be through NVML, as evident by some nvidia-settings comments

<sup><b>ā¤ļø Consider</b> supporting my work, this took 26 hours to figure out, implement, write a readme, make it convenient 🫠</sup>

šŸ“¦ Installation

There's multiple ways to get nvibrant, do check the usage and autostarting sections afterwards!

šŸ”“ Python package

This utility finds the best nvibrant binary for your driver, already bundled in the package for all known tags at release time. Simply install the pypi/nvibrant package, where uvx • tools usage is recommended:

# With standard python tooling
$ python3 -m pip install nvibrant
$ python3 -m nvibrant 512 512

# Always latest, simpler
$ uvx nvibrant 512 512

For more stability, pin to a specific version and only update for new features or newer drivers support:

$ python3 -m pip install nvibrant==1.2.0
$ uvx nvibrant==1.2.0 (args)

<sup><b>Note:</b> This package is an official release channel for nvibrant</sup>

🟔 Package manager

Install from your distro's package manager, it may use the python package at system level:

<table align="center"> <tr> <th></th> <th>Distro</th> <th>Installation</th> <th>Maintainer</th> </tr> <!-- Arch Linux --> <tr> <td><img src="https://raw.githubusercontent.com/edent/SuperTinyIcons/refs/heads/master/images/svg/arch_linux.svg" width="64"></td> <td>Arch Linux</td> <td> Install the <a href="https://aur.archlinux.org/packages/nvibrant-bin"><code>nvibrant-bin</code></a> AUR package: <ul> <li><code><a href="https://github.com/Morganamilo/paru">paru</a> -S nvibrant-bin</code></li> <li><code><a href="https://github.com/Jguer/yay">yay</a> -S nvibrant-bin</code></li> </ul> </td> <td> <a href="https://github.com/Incognitux">@Incognitux</a> </td> </tr> <!-- Nix Flakes --> <tr> <td><img src="https://raw.githubusercontent.com/edent/SuperTinyIcons/refs/heads/master/images/svg/nixos.svg" width="64"></td> <td>Nix Flakes</td> <td> Use the <a href="https://github.com/mikaeladev/nix-nvibrant"><code>nix-nvibrant</code></a> flake. <br /> See repo for instructions. </td> <td> <a href="https://github.com/mikaeladev">@mikaeladev</a> </td> </tr> <!-- Fedora --> <tr> <td><img src="https://raw.githubusercontent.com/edent/SuperTinyIcons/refs/heads/master/images/svg/fedora.svg" width="64"></td> <td>Fedora</td> <td> Install the <a href="https://copr.fedorainfracloud.org/coprs/starfish/nvibrant"><code>nvibrant</code></a> rpm. <br /> See repo for instructions. </td> <td> <a href="https://github.com/ykshek">@ykshek</a> </td> </tr> <!-- Add yours via PR --> <tr> <td>...</td> <td>...</td> <td> <div align="center"> <i>Help me by packaging for your distro!</i> <br><sup>ā¤ļø Thanks to all maintainers for your work! ā¤ļø</sup> </div> </div> </td> <td>You šŸ™‚</td> </tr> </table>

<sup><b>Obligatory:</b> Community packages are often safe, but not always checked by me</sup>

🟢 Prebuilt binaries

You can download all builds made by GitHub Actions in the releases page as .whl zips, eg. extract with:

# Selective unzip and ensure executable files
unzip -j "nvibrant-*.whl" "nvibrant/resources/*" -d bin
chmod +x "bin/*"

Run them directly as ./bin/nvibrant-$driver (...)

[!NOTE] There is some level of compatibility across different nvibrant and driver versions, as the related code is mostly stable on nvidia's side. Always prefer using the closest, but not newer, version to your driver!

  • Example: Running nvibrant-575.51.03 on driver v575.64.03 works
  • This is automatically handled by the python utility, hence the strong recommendation :)

šŸ”µ Build it yourself

Requirements: Have git, gcc compilers; meson and ninja are included on python dependencies

# Clone the code alongside open-gpu-kernel-modules
git clone https://github.com/Tremeschin/nvibrant && cd nvibrant
git submodule update --init

From here, you can either build only the C++ part for a target driver:

# Any tag from https://github.com/NVIDIA/open-gpu-kernel-modules/tags
$ cd open-gpu && git checkout 575.64.03 && cd ..

# Configure and compile project, final binary at 'build' directory
$ meson setup --buildtype release ./build && ninja -C ./build
$ ./build/nvibrant 512 512

Or make a wheel for all drivers at dist/* for your host platform:

$ uv build --wheel

šŸš€ Usage

Inputs: Vibrance Levels are numbers from -1024 to 1023 that determines the intensity of the effect. Zero being the "no effect" (default at boot), -1024 grayscale, and 1023 max saturation (200%)

The values are passed as arguments to nvibrant's binary, matching the order of physical ports in your GPU (not the index of the video server). For example, I have two monitors on HDMI and DisplayPort in an RTX 3060 first two outputs, to set vibrance to 512 and 1023, respectively, I would run:

$ nvibrant 512 1023

Display 0:
• (0, HDMI) • Set Vibrance (  512) • Success
• (1, DP  ) • Set Vibrance ( 1023) • Success
• (2, DP  ) • Set Vibrance (    0) • None
...

<sup><b>Note:</b> You might need to set nvidia_drm.modeset=1 kernel parameter, but I think it's enabled by default on recent drivers.</sup>

If a value is not passed for the Nth physical output, nvibrant will default to zero. When no argument is passed, it will effectively clear the vibrance for all outputs. None means the output is disconnected.

āœ… You might have a display at the later ports, in which case use as:

$ nvibrant 0 0 0 1023

Display 0:
• (0, HDMI) • Set Vibrance (    0) • None
• (1, DP  ) • Set Vibrance (    0) • None
• (2, DP  ) • Set Vibrance (    0) • None
• (3, DP  ) • Set Vibrance ( 1023) • Success
• (4, DP  ) • Set Vibrance (    0) • None

šŸ”“ Autostarting

For simplicity, a Systemd user service running either uvx for the latest releases (in case of driver updates), or a prebuilt binary directly should cover most users, plus it integrates well with dotfiles repositories!

Create a file at ~/.config/systemd/user/nvibrant.service with the content:

[Unit]
Description=Apply nvibrant
After=graphical.target

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 5
ExecStart=uvx nvibrant 1023 1023

[Install]
WantedBy=default.target

Enable the service with `systemctl --user

View on GitHub
GitHub Stars193
CategoryDevelopment
Updated8h ago
Forks8

Languages

C++

Security Score

100/100

Audited on Apr 5, 2026

No findings