{"id":26743819,"url":"https://github.com/tremeschin/nvibrant","last_synced_at":"2026-03-07T00:03:29.478Z","repository":{"id":284822604,"uuid":"956020570","full_name":"Tremeschin/nvibrant","owner":"Tremeschin","description":"🟢 Nvidia Digital Vibrance on Wayland","archived":false,"fork":false,"pushed_at":"2026-02-28T17:24:46.000Z","size":138,"stargazers_count":173,"open_issues_count":1,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-01T01:17:22.839Z","etag":null,"topics":["nvidia","nvidia-gpu","nvidia-modeset","nvidia-settings","open-gpu-kernel-modules","wayland"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tremeschin.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-27T15:13:11.000Z","updated_at":"2026-02-28T17:24:50.000Z","dependencies_parsed_at":null,"dependency_job_id":"051e15fe-1037-4647-9e68-5106fec35141","html_url":"https://github.com/Tremeschin/nvibrant","commit_stats":null,"previous_names":["tremeschin/nvibrant"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/Tremeschin/nvibrant","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tremeschin%2Fnvibrant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tremeschin%2Fnvibrant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tremeschin%2Fnvibrant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tremeschin%2Fnvibrant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tremeschin","download_url":"https://codeload.github.com/Tremeschin/nvibrant/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tremeschin%2Fnvibrant/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30204113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nvidia","nvidia-gpu","nvidia-modeset","nvidia-settings","open-gpu-kernel-modules","wayland"],"created_at":"2025-03-28T07:16:21.201Z","updated_at":"2026-03-07T00:03:29.450Z","avatar_url":"https://github.com/Tremeschin.png","language":"C++","funding_links":["https://github.com/sponsors/Tremeschin/"],"categories":[],"sub_categories":[],"readme":"\u003e [!NOTE]\n\u003e This project is complete and stable, no actions are needed unless a driver update breaks it!\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003envibrant\u003c/h1\u003e\n  \u003cp\u003eConfigure Nvidia's Digital Vibrance on Wayland\u003c/p\u003e\n  \u003ca href=\"https://pypi.org/project/nvibrant/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/nvibrant?label=PyPI\u0026color=blue\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/nvibrant/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/dw/nvibrant?label=Installs\u0026color=blue\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Tremeschin/nvibrant/\"\u003e\u003cimg src=\"https://img.shields.io/github/v/tag/Tremeschin/nvibrant?label=GitHub\u0026color=orange\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Tremeschin/nvibrant/stargazers/\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/Tremeschin/nvibrant?label=Stars\u0026style=flat\u0026color=orange\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Tremeschin/nvibrant/releases/\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/Tremeschin/nvibrant?label=Release\u0026color=light-green\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/Tremeschin/nvibrant/releases/\"\u003e\u003cimg src=\"https://img.shields.io/github/downloads/Tremeschin/nvibrant/total?label=Downloads\u0026color=light-green\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://discord.gg/KjqvcYwRHm\"\u003e\u003cimg src=\"https://img.shields.io/discord/1184696441298485370?label=Discord\u0026style=flat\u0026color=purple\"\u003e\u003c/a\u003e\n  \u003cbr\u003e\n  \u003cbr\u003e\n\u003c/div\u003e\n\n\u003cimg src=\"https://github.com/user-attachments/assets/962a3f4d-6022-402f-a47b-27aeba595a19\"/\u003e\n\n## 🔥 Description\n\nNVIDIA GPUs have a nice feature called *Digital Vibrance* that increases the colors saturation of the display. The option is readily available on [nvidia-settings](https://github.com/NVIDIA/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 :^)\n\nAn interesting observation is that the setting persists after modifying it on X11 and then switching to Wayland. I theorized [(1)](https://github.com/libvibrant/vibrantLinux/issues/27#issuecomment-2729822152) [(2)](https://www.reddit.com/r/archlinux/comments/1gx1hir/comment/mhpe2pk/?context=3) 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!\n\nThis repository uses `nvidia-modeset` and `nvkms` headers found at [nvidia/open-gpu-kernel-modules](https://github.com/NVIDIA/open-gpu-kernel-modules/) to make [ioctl](https://en.wikipedia.org/wiki/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`.\n\n**Note**: A future, and intended way, will be through [NVML](https://developer.nvidia.com/management-library-nvml), as evident by some [nvidia-settings](https://github.com/NVIDIA/nvidia-settings/blob/6c755d9304bf4761f2b131f0687f0ebd1fcf7cd4/src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c#L1235) comments\n\n\u003csup\u003e\u003cb\u003e❤️ Consider\u003c/b\u003e [supporting](https://github.com/sponsors/Tremeschin/) my work, this took 26 hours to figure out, implement, write a readme, make it convenient 🫠\u003c/sup\u003e\n\n## 📦 Installation\n\nThere's multiple ways to get nvibrant, do check the [usage](#-usage) and [autostarting](#-autostarting) sections afterwards!\n\n\n### 🔴 Python package\n\nThis utility [finds the best](https://github.com/Tremeschin/nvibrant/blob/4d9cc065f13c8110e5dd22368715ff07299b8192/nvibrant/__init__.py#L73-L95) nvibrant binary for your driver, already bundled in the package for all known [tags](https://github.com/NVIDIA/open-gpu-kernel-modules/tags) at release time. Simply install the [`pypi/nvibrant`](https://pypi.org/project/nvibrant/) package, where [`uvx`](https://docs.astral.sh/uv/) • [`tools`](https://docs.astral.sh/uv/concepts/tools/) usage is recommended:\n\n```sh\n# With standard python tooling\n$ python3 -m pip install nvibrant\n$ python3 -m nvibrant 512 512\n\n# Always latest, simpler\n$ uvx nvibrant 512 512\n```\n\nFor more stability, pin to a specific version and only update for new features or newer drivers support:\n\n```sh\n$ python3 -m pip install nvibrant==1.2.0\n$ uvx nvibrant==1.2.0 (args)\n```\n\n\u003csup\u003e\u003cb\u003eNote:\u003c/b\u003e This package is an official release channel for nvibrant\u003c/sup\u003e\n\n\n### 🟡 Package manager\n\nInstall from your distro's package manager, it may use the python package at system level:\n\n\u003ctable align=\"center\"\u003e\n  \u003ctr\u003e\n    \u003cth\u003e\u003c/th\u003e\n    \u003cth\u003eDistro\u003c/th\u003e\n    \u003cth\u003eInstallation\u003c/th\u003e\n    \u003cth\u003eMaintainer\u003c/th\u003e\n  \u003c/tr\u003e\n\n  \u003c!-- Arch Linux --\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/edent/SuperTinyIcons/refs/heads/master/images/svg/arch_linux.svg\" width=\"64\"\u003e\u003c/td\u003e\n    \u003ctd\u003eArch Linux\u003c/td\u003e\n    \u003ctd\u003e\n      Install the \u003ca href=\"https://aur.archlinux.org/packages/nvibrant-bin\"\u003e\u003ccode\u003envibrant-bin\u003c/code\u003e\u003c/a\u003e AUR package:\n      \u003cul\u003e\n        \u003cli\u003e\u003ccode\u003e\u003ca href=\"https://github.com/Morganamilo/paru\"\u003eparu\u003c/a\u003e -S nvibrant-bin\u003c/code\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ccode\u003e\u003ca href=\"https://github.com/Jguer/yay\"\u003eyay\u003c/a\u003e -S nvibrant-bin\u003c/code\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/Incognitux\"\u003e@Incognitux\u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003c!-- Nix Flakes --\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/edent/SuperTinyIcons/refs/heads/master/images/svg/nixos.svg\" width=\"64\"\u003e\u003c/td\u003e\n    \u003ctd\u003eNix Flakes\u003c/td\u003e\n    \u003ctd\u003e\n      Use the \u003ca href=\"https://github.com/mikaeladev/nix-nvibrant\"\u003e\u003ccode\u003enix-nvibrant\u003c/code\u003e\u003c/a\u003e flake.\n      \u003cbr /\u003e\n      See repo for instructions.\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/mikaeladev\"\u003e@mikaeladev\u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003c!-- Fedora --\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"https://raw.githubusercontent.com/edent/SuperTinyIcons/refs/heads/master/images/svg/fedora.svg\" width=\"64\"\u003e\u003c/td\u003e\n    \u003ctd\u003eFedora\u003c/td\u003e\n    \u003ctd\u003e\n      Install the \u003ca href=\"https://copr.fedorainfracloud.org/coprs/starfish/nvibrant\"\u003e\u003ccode\u003envibrant\u003c/code\u003e\u003c/a\u003e rpm.\n      \u003cbr /\u003e\n      See repo for instructions.\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/ykshek\"\u003e@ykshek\u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003c!-- Add yours via PR --\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e...\u003c/td\u003e\n    \u003ctd\u003e...\u003c/td\u003e\n    \u003ctd\u003e\n      \u003cdiv align=\"center\"\u003e\n        \u003ci\u003eHelp me by packaging for your distro!\u003c/i\u003e\n        \u003cbr\u003e\u003csup\u003e❤️ Thanks to all maintainers for your work! ❤️\u003c/sup\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n    \u003c/td\u003e\n    \u003ctd\u003eYou 🙂\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003csup\u003e\u003cb\u003eObligatory:\u003c/b\u003e Community packages are often safe, but not always checked by me\u003c/sup\u003e\n\n### 🟢 Prebuilt binaries\n\nYou can download all builds made by GitHub Actions in the [releases](https://github.com/Tremeschin/nvibrant/releases) page as `.whl` zips, eg. extract with:\n\n```sh\n# Selective unzip and ensure executable files\nunzip -j \"nvibrant-*.whl\" \"nvibrant/resources/*\" -d bin\nchmod +x \"bin/*\"\n```\n\nRun them directly as `./bin/nvibrant-$driver (...)`\n\n\u003e [!NOTE]\n\u003e 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!\n\u003e - **Example**: Running `nvibrant-575.51.03` on driver `v575.64.03` works\n\u003e - This is automatically handled by the python utility, hence the strong recommendation :)\n\n### 🔵 Build it yourself\n\n**Requirements**: Have `git`, `gcc` compilers; `meson` and `ninja` are included on `python` dependencies\n\n```sh\n# Clone the code alongside open-gpu-kernel-modules\ngit clone https://github.com/Tremeschin/nvibrant \u0026\u0026 cd nvibrant\ngit submodule update --init\n```\n\nFrom here, you can either build only the C++ part for a target driver:\n\n```sh\n# Any tag from https://github.com/NVIDIA/open-gpu-kernel-modules/tags\n$ cd open-gpu \u0026\u0026 git checkout 575.64.03 \u0026\u0026 cd ..\n\n# Configure and compile project, final binary at 'build' directory\n$ meson setup --buildtype release ./build \u0026\u0026 ninja -C ./build\n$ ./build/nvibrant 512 512\n```\n\nOr make a wheel for all drivers at `dist/*` for your host platform:\n\n```sh\n$ uv build --wheel\n```\n\n## 🚀 Usage\n\n**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%)\n\nThe 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:\n\n```sh\n$ nvibrant 512 1023\n\nDisplay 0:\n• (0, HDMI) • Set Vibrance (  512) • Success\n• (1, DP  ) • Set Vibrance ( 1023) • Success\n• (2, DP  ) • Set Vibrance (    0) • None\n...\n```\n\n\u003csup\u003e\u003cb\u003eNote:\u003c/b\u003e You might need to set `nvidia_drm.modeset=1` kernel parameter, but I think it's enabled by default on recent drivers.\u003c/sup\u003e\n\nIf 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.\n\n✅ You might have a display at the later ports, in which case use as:\n\n```sh\n$ nvibrant 0 0 0 1023\n\nDisplay 0:\n• (0, HDMI) • Set Vibrance (    0) • None\n• (1, DP  ) • Set Vibrance (    0) • None\n• (2, DP  ) • Set Vibrance (    0) • None\n• (3, DP  ) • Set Vibrance ( 1023) • Success\n• (4, DP  ) • Set Vibrance (    0) • None\n```\n\n### 🔴 Autostarting\n\nFor simplicity, a Systemd user service running either [`uvx`](https://docs.astral.sh/uv/concepts/tools/) for the latest releases (in case of driver updates), or a [prebuilt binary](https://github.com/Tremeschin/nvibrant/releases) directly should cover most users, plus it integrates well with [dotfiles](https://github.com/Tremeschin/DotFiles/blob/main/.config/systemd/user/nvibrant.service) repositories!\n\nCreate a file at `~/.config/systemd/user/nvibrant.service` with the content:\n\n```ini\n[Unit]\nDescription=Apply nvibrant\nAfter=graphical.target\n\n[Service]\nType=oneshot\nExecStartPre=/bin/sleep 5\nExecStart=uvx nvibrant 1023 1023\n\n[Install]\nWantedBy=default.target\n```\n\nEnable the service with `systemctl --user enable --now nvibrant.service`\n- You can also pin it to a specific version with `uvx nvibrant==1.2.0 (args)` to have more control\n- Or a C++ binary at `~/.local/bin/nvibrant` and use `ExecStart=%h/.local/bin/nvibrant (args)`\n- Sleeping for a few seconds can prevent racing conditions with the display server starting up\n\nAnother option is to use [uv tools](https://docs.astral.sh/uv/concepts/tools/) for manual control and/or offline usage:\n- Run `uv tool install nvibrant` once (upgrade with `uv tool update nvibrant`)\n- Use `ExecStart=uv tool run nvibrant (args)` in the service\n\n### 🟡 Laptops, Hybrid Systems\n\nChime in https://github.com/Tremeschin/nvibrant/issues/22\n\n### 🟢 Dithering\n\nSome users have reported issues with dithering causing flickering or artifacts on their displays [(1)](https://github.com/Tremeschin/nvibrant/issues/18) [(2)](https://www.reddit.com/r/linux_gaming/comments/1jmsva0/comment/mkehyuk/), which also lacks a Wayland option to disable in `nvidia-settings`. Fear not, you can change it with nvibrant too!\n\n- **Run**: `ATTRIBUTE=dithering uvx nvibrant` to disable it on all displays (v1.1+)\n\nMinor quirk, here's the values meanings, default is 2:\n\n```cpp\nenum NvKmsDpyAttributeRequestedDitheringValue {\n    ...AUTO = 0,\n    ...ENABLED = 1,\n    ...DISABLED = 2,\n};\n```\n\n### 🔵 Multiple GPUs\n\nIf you have multiple devices, specify a `NVIDIA_GPU=N` index:\n\n```sh\n$ NVIDIA_GPU=1 nvibrant 0 100\n\nDisplay 0:\n• (0, HDMI) • Set Vibrance (    0) • Success\n• (1, DP  ) • Set Vibrance (  100) • Success\n```\n\n## Common Issues\n\nPlease [report](https://github.com/Tremeschin/nvibrant/issues) unknown or unlisted issues to be added here!\n\n- If you get a _\"Driver version mismatch\"_ or `ioctl` errors, maybe try rebooting (if you haven't) since the last driver update. Otherwise, you can force the version with `NVIDIA_DRIVER_VERSION=x.y.z`. It must match what `/dev/nvidia-modeset` expects and is currently loaded in the kernel.\n\n- Ensure you have the `nvidia-modeset` kernel module loaded, as it is required for the ioctl calls to work. You can check this with `lsmod | grep nvidia`. Else, add it to your kernel boot parameters.\n\n- It's possible that nvibrant may fail on future or older drivers due to differences between the internal structs and enums in the latest `nvkms` headers, hit me up for a patch release!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftremeschin%2Fnvibrant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftremeschin%2Fnvibrant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftremeschin%2Fnvibrant/lists"}