Hotkey-switchable display profiles for Windows: NVIDIA digital vibrance, plus gamma, contrast and brightness on any GPU. Per-monitor, with live preview.
The NVIDIA Control Panel's display sliders, except you can flip between named profiles instantly — mid-game, without alt-tabbing. Per-monitor, with a live-preview settings window and a watchdog that puts your profile back when a fullscreen game steals it.
No dependencies, no runtime to install, no telemetry, no network access.
If you came here looking for a vibranceGUI alternative: this does the same digital-vibrance job, and adds gamma/contrast/brightness (which work on any GPU), per-monitor profiles, and a settings window.
Installer (recommended) — grab ScreenTuner-x.y.z-setup.exe from
Releases. Per-user, so there's no
admin prompt.
winget
winget install NachoSC.ScreenTunerPortable — download ScreenTuner-x.y.z-portable.zip, unzip anywhere, run
ScreenTuner.exe. It creates profiles.json beside itself. To register it properly
later (Start Menu entry, Installed-apps entry, run at login):
.\ScreenTuner.exe --install # and --uninstall to remove every traceScreenTuner is not code-signed, so Windows will show "Windows protected your PC" on first run. Click More info → Run anyway.
This is not a judgement about the software — it means nobody has paid for a certificate.
An OV code-signing certificate costs a few hundred dollars a year and now requires a
hardware token, which is hard to justify for a free, donation-funded tool. If that
bothers you, the source is right here and build.bat reproduces the binary.
It lives in the system tray. Left-click the icon for settings, right-click for the menu. Neither changes your screen on its own — switching profiles is the hotkeys' job, or picking one from the menu.
| Hotkey | Action |
|---|---|
Ctrl+Shift+1 … Ctrl+Shift+6 |
Apply profile 1–6 |
Ctrl+Shift+0 |
Back to driver defaults |
Ctrl+Shift+V |
Cycle to the next profile |
Ctrl+Shift+= / Ctrl+Shift+- |
Nudge vibrance ±5 |
Ctrl+Shift+F5 |
Reload profiles.json |
Ctrl+Shift+Q |
Quit |
Pressing an active profile's own hotkey again returns to neutral, so every profile doubles as an on/off toggle. All bindings are editable.
If a combination is already taken by another app, ScreenTuner says so in its log rather than failing silently.
Everything in profiles.json is editable there, so you never have to touch JSON.
- Live preview — sliders apply to your actual screen as you drag. Close without saving and your display goes back exactly as it was.
- Applies to — edit All monitors, or pick one screen and choose Same as all / Custom for this monitor / Leave this monitor alone.
- Hotkey capture — click the button, press the combination. It warns on conflicts.
- Resulting curve — drawn from the same lookup table that gets written to the driver, so it's the real transfer curve rather than an illustration.
- Colour palette under the vibrance slider: top row neutral, bottom row at the current setting.
Saving writes profiles.json and tells the running app to reload — no restart.
{
"name": "Competitive FPS",
"hotkey": "ctrl+alt+2",
"vibrance": 80,
"gamma": 1.10,
"contrast": 55,
"brightness": 54
}| Field | Range | Neutral | Notes |
|---|---|---|---|
vibrance |
0–100 | 50 | Same scale as the Control Panel's Digital Vibrance. NVIDIA only |
gamma |
0.30–2.80 | 1.00 | Also accepts [r, g, b] |
contrast |
0–100 | 50 | Also accepts [r, g, b] |
brightness |
0–100 | 50 | Also accepts [r, g, b] |
Omit a field to leave that knob alone. One caveat: gamma, contrast and brightness share a single hardware lookup table, so setting any one writes all three — the omitted ones fall back to neutral. Vibrance is independent.
Top-level values are the defaults; monitors overrides individual screens, so one
hotkey can drive two monitors differently:
{
"name": "Focus",
"hotkey": "ctrl+alt+6",
"vibrance": 55,
"monitors": {
"secondary": { "vibrance": 42, "brightness": 38 }
}
}{ "skip": true } leaves a monitor untouched. Monitors match by vendor ("Dell",
"LG"), position ("primary", "secondary"), index, EDID id, or adapter name.
Prefer the first two — Windows renumbers adapter names over time.
Run ScreenTuner.exe --list to see every monitor with all of its usable keys, plus each
profile expanded per screen.
Digital vibrance works in exclusive fullscreen. It's applied by the driver downstream of what the game renders, so the game can't overwrite it.
Gamma, contrast and brightness are contested. In exclusive fullscreen the game owns the gamma ramp, and any title with its own brightness slider will overwrite yours — usually visible the moment you alt-tab.
So ScreenTuner watches for it. It re-checks every 2 seconds, and within ~0.6 s of any alt-tab, and puts your profile back when something has taken it. It never fights the settings window: enforcement pauses while that's open.
Borderless windowed avoids the conflict entirely. HDR does not — a monitor with HDR enabled ignores gamma ramps altogether, though vibrance still works.
ScreenTuner checks GitHub once a day for a newer release. When one appears you get a tray notification; clicking it — or the Update to x.y.z... item in the tray menu — asks whether to install it.
Nothing interrupts you: no dialog ever appears on its own, because this is an app you leave running inside a game. The notification is the only unprompted thing, and it goes away by itself.
Say yes and it downloads the official installer, checks its SHA-256 against the digest GitHub reports for that file, runs it silently and reopens. Your profiles and settings are kept. A portable copy cannot replace itself while running, so it opens the download page instead.
To turn it off: Settings — Options — "Check GitHub for new versions", or set
"check_for_updates": false in profiles.json.
The check is a plain unauthenticated GET to the public releases API. Nothing about you or your machine is sent, and the app has no telemetry of any kind.
The installer is unsigned, so verifying the download proves it arrived intact — not that the release is trustworthy. That needs code signing, which is on the roadmap.
| Windows 10/11, 64-bit | Required. It's Win32 throughout |
| Any GPU | Gamma, contrast, brightness — AMD, Intel, NVIDIA |
| NVIDIA GPU + driver | Digital vibrance only. Without it the app runs normally, logs vibrance disabled, and everything else still works |
On hybrid-graphics laptops, a panel wired to the integrated GPU won't get vibrance, because NVAPI doesn't enumerate it. Gamma still applies.
AMD and Intel saturation is planned, which also fixes hybrid-graphics laptops whose built-in panel is wired to the integrated GPU. So are profiles that follow the running program — launch Tarkov, get your Tarkov profile, without touching a hotkey.
See ROADMAP.md. If you have AMD or Intel hardware and want to help test, please open an issue: the main obstacle is not having the hardware to develop against.
- Digital vibrance →
NvAPI_SetDVCLevelEx, resolved at runtime throughnvapi_QueryInterface. A gamma ramp genuinely cannot do this: a ramp is a per-channel curve, and saturation requires mixing channels. - Gamma / contrast / brightness →
SetDeviceGammaRamp, a 256-entry RGB lookup table per monitor. Contrast scales around the midpoint, brightness offsets, then gamma is applied asv ** (1/g).
All three fold into that one curve, because the hardware has exactly one lookup table per channel. Each control bends it differently:
Neutral · gamma 1.60 · gamma 0.60 · contrast 80 — then contrast 25 · brightness 75 · brightness 30 · a combined profile. Gamma bows the curve, contrast pivots it around the midpoint, brightness slides it — note where the ends clip.
The original ramps and vibrance levels are captured at startup and restored on exit, including per-monitor differences.
It does not inject into games, hook APIs, read game memory, or touch the network. It calls display APIs, the same ones the NVIDIA Control Panel uses. Anti-cheat has no reason to care.
-
Windows clamps extreme gamma ramps. If an aggressive profile looks weaker than expected, run
ScreenTuner.exe --enable-full-gamma-rangefrom an admin terminal and reboot. -
HDR ignores gamma ramps entirely. Vibrance still works.
-
The tray icon starts in the
^overflow, where Windows 11 puts new icons. There's a Pin icon to taskbar toggle in the tray menu. -
AltGr is Ctrl+Alt as far as Windows is concerned. On layouts that use AltGr to type characters — Spanish, German, most non-US layouts — a
Ctrl+Alt+…binding fires while you are simply typing. On a Spanish layoutAltGr+2types@, which would otherwise triggerCtrl+Alt+2.Defaults are therefore
Ctrl+Shift+…, which has no such clash anywhere. If you do bind something toCtrl+Alt, ScreenTuner detects whether your layout has AltGr and ignores the hotkey when the key actually held is the right Alt — that is AltGr rather than a genuine Ctrl+Alt chord. It also warns you at startup and in the settings window.
ScreenTuner.exe tray + hotkeys
ScreenTuner.exe --gui settings window
ScreenTuner.exe --list monitors, current vibrance, resolved profiles
ScreenTuner.exe --apply "Movie" apply once and exit
ScreenTuner.exe --reset back to neutral
ScreenTuner.exe --install [DIR] install, with Start Menu and Installed-apps entries
ScreenTuner.exe --uninstall remove everything it registered
ScreenTuner.exe --startup on run at login (on/off/toggle/status)
ScreenTuner.exe --pin-tray pin the tray icon to the taskbar
ScreenTuner.exe --diagnostics scrubbed report for a bug report
Run from a terminal, output goes to that terminal.
Right-click the tray icon → Copy diagnostics for a bug report, and paste it into the
issue. From a terminal, ScreenTuner.exe --diagnostics prints the same thing and writes
screentuner-diagnostics.txt beside the exe.
It includes your Windows version, GPU, monitors, resolutions, current vibrance levels and
settings, plus the last 40 log lines. It deliberately excludes your username, home
folder, machine name and the contents of your profiles — profile names only, since
people put all sorts in those. Any path that does appear is reduced to %LOCALAPPDATA%
form.
The app also keeps a rolling screentuner.log next to the executable, which is where
startup problems show up if the tray icon never appears.
Needs Python 3.10+ on Windows. Nothing else — the app is pure ctypes.
build.bat -> dist\ScreenTuner\ the app
build-installer.bat -> dist\installer\ the setup wizard (needs Inno Setup 6)
build.bat creates a throwaway venv in .build\ and installs PyInstaller there, leaving
your global Python alone. The build is --onedir deliberately: --onefile unpacks 25 MB
into %TEMP% on every launch, which costs ~0.5 s of startup, trips antivirus heuristics,
and leaves the folder behind whenever the process is killed rather than closed.
tests
un.bat unit pure logic - any Windows machine, no GPU or build needed
tests
un.bat system real displays, real hotkeys, real install/uninstall
The split is by what a machine can answer rather than by test size, so someone without an NVIDIA card can still check profile resolution, hotkey parsing and the gamma maths. Details in tests/README.md.
Pull requests welcome — please read CONTRIBUTING.md first, especially the contributor terms, which exist so the project can keep its licence coherent.
PolyForm Noncommercial License 1.0.0. Free for any noncommercial use — personal, hobby, educational, charitable. Commercial rights are reserved to the maintainer. This is source-available, not OSI open source, and that's deliberate.
Third-party components are listed in THIRD-PARTY-NOTICES.md. Nothing NVIDIA-owned is bundled or redistributed: the app calls the driver you already have. NVIDIA and GeForce are trademarks of NVIDIA Corporation; this project is not affiliated with or endorsed by them.

