Skip to content

Repository files navigation

Brightness Sync

A tiny Windows tray app that mirrors the Windows brightness slider onto your external monitors over DDC/CI.

Platform Framework Version License

Why

Windows only ever adjusts the brightness of a built-in display. External monitors are left out, so changing brightness leaves you with one panel dimmed and the rest blazing. Brightness Sync watches the brightness level Windows reports and writes it out to every attached monitor that speaks DDC/CI — the same channel the monitor's own OSD buttons use — so all your displays move together.

It runs entirely from the tray. There is no main window.

Features

  • Follows the Windows brightness level automatically. Change brightness however you normally do — the keyboard keys, the Quick Settings slider, Settings > Display — and external monitors follow within a fraction of a second.
  • Per-monitor scaling. Monitors do not agree on what their brightness range means. The Odyssey G93SC reports 0–50, others report 0–100. Windows' percentage is mapped onto each monitor's own reported range rather than written through raw.
  • Per-monitor opt-out. Every detected display gets a checkbox, so you can leave a colour-critical or already-calibrated panel out of the sync.
  • Minimum brightness floor. Some panels go fully black at 0, which leaves you unable to see the screen you need in order to turn it back up. Set a floor of 5–30% to keep a readable picture.
  • Real monitor names. Windows reports most displays as "Generic PnP Monitor". The model name is read out of the display's EDID instead, so a multi-monitor list is actually distinguishable.
  • Survives sleep, unplug and re-link. Display handles go stale when a monitor sleeps or a cable is re-seated. Those events are detected, handles are rebuilt, and the brightness is re-applied so a wake-up doesn't leave a monitor out of sync.
  • Live tray icon. The icon is a sun whose disc and rays grow with the current level, so you can read roughly where brightness sits without opening the menu. It repaints for light and dark taskbars.
  • Windows 11 Fluent menu. Rounded corners, Fluent icons and theme-aware colours that follow your system light/dark setting and accent.
  • Start with Windows, toggleable from the menu.
  • Single self-contained executable. No installer, no .NET runtime to install, no files written next to the exe.

Requirements

  • Windows 10 1809 or later (64-bit); built and tested on Windows 11
  • A monitor that supports DDC/CI — nearly all desktop monitors from the last decade do, but many ship with it disabled by default. See Troubleshooting.
  • A source of Windows brightness changes, i.e. a display Windows itself exposes a brightness slider for (typically a laptop's built-in panel)

Nothing else. The published build carries its own .NET runtime.

Install

Download BrightnessSync.exe from the Releases page and run it.

That's the whole install. It's a single portable file — put it wherever you like. Use Start with Windows in the tray menu if you want it to launch at sign-in.

To remove it: untick Start with Windows, choose Exit, and delete the exe. Settings live in %AppData%\BrightnessSync\settings.json if you want those gone too.

Windows SmartScreen will likely warn on first run, since the executable isn't code-signed. More info → Run anyway, or build it yourself from source with the steps below.

Usage

Right-click the tray icon:

Item What it does
Brightness — N% The level currently being applied. Informational.
Monitors Every detected DDC/CI display, with its reported brightness range. Untick one to exclude it from syncing.
Minimum brightness Floor applied before writing: None, 5%, 10%, 20% or 30%.
Resync now Re-detect monitors and re-apply the current brightness. Reach for this if a display was plugged in and didn't pick up.
Sync brightness Master switch. When off, changes are observed but not written.
Start with Windows Registers the exe under the current user's Run key.
Exit Quits.

Double-clicking the tray icon runs Resync now.

Settings

Stored at %AppData%\BrightnessSync\settings.json, written whenever you change something in the menu. Two options are file-only and have no menu entry:

Key Default Meaning
DebounceMs 150 Quiet period before a burst of changes is written. Holding a brightness key emits steps ~200 ms apart and each DDC/CI write is slow, so replaying every step lags visibly behind the keyboard. Raise it if syncing feels like it trails; lower it if it feels sluggish.
CeilingPercent 100 Upper clamp, the counterpart to the minimum brightness floor.

Restart the app after hand-editing the file.

Build from source

Requires the .NET 8 SDK.

git clone https://github.com/<you>/BrightnessSync.git
cd BrightnessSync
dotnet build -c Release

To produce the single self-contained executable:

dotnet publish -p:PublishProfile=SingleFile

The result is one file at bin\publish\BrightnessSync.exe (~66 MB — it bundles the .NET runtime). Publish settings live in Properties/PublishProfiles/SingleFile.pubxml, kept out of the .csproj so ordinary builds stay framework-dependent and fast.

Trimming is deliberately off: WPF and WPF-UI resolve themes, controls and BAML through reflection, so the trimmer strips types that are only referenced from XAML and the breakage shows up at runtime as missing styles rather than as build errors.

How it works

Windows broadcasts GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS whenever its brightness policy changes. A hidden window subscribes to that notification — registering also delivers the current value immediately, which is what puts monitors in sync at launch.

Incoming changes are coalesced and handed to a background worker, which writes them over DDC/CI with SetMonitorBrightness (VCP code 0x10). The writes never touch the message pump: each one takes tens of milliseconds, and a burst of them on the UI thread would stall the app.

Monitors are discovered with EnumDisplayMonitors, then probed for a brightness range directly rather than gated on GetMonitorCapabilities, which fails on plenty of displays that answer VCP 0x10 perfectly well. Each display is keyed by its device instance path so per-monitor settings survive a reboot.

Troubleshooting

A monitor isn't listed under "Monitors". Almost always DDC/CI switched off in the monitor's own settings. Open the OSD with the monitor's physical buttons and look for DDC/CI, Auto Source, or occasionally Console Mode / Service — the naming varies by vendor. Turn it on, then use Resync now. Note that monitors connected over some USB-C docks and KVM switches won't pass DDC/CI through at all.

Brightness lags behind the keyboard. Expected to a degree — DDC/CI is a slow bus. Try raising DebounceMs.

Brightness doesn't change at all. Check Sync brightness is ticked, and that the monitor is ticked under Monitors.

Nothing happens when I change brightness. The app follows the level Windows reports. If your machine has no display Windows offers a brightness slider for, there's nothing for it to observe.

The app won't start / a second copy does nothing. Only one instance runs at a time; launching a second exits silently by design. Look for an existing tray icon first.

Credits

Tray icon: Brightness icons created by Magnific - Flaticon

Built with:

A note on how this was made

This application was written with Claude, Anthropic's AI assistant. The design decisions, hardware testing and review are the author's; a substantial portion of the implementation was AI-generated.

License

Released under the MIT License. Use it, fork it, ship it — just keep the copyright notice.

Two things the MIT license does not cover:

  • The tray icon (app.ico, screen.png) is from Flaticon under their Free License, not MIT. If you fork this project and keep the icon, you must keep the attribution in Credits. Flaticon's licence also does not permit redistributing the icon as a standalone asset. Swap in your own artwork if you'd rather not carry that condition.
  • Dependencies, which keep their own licences — both H.NotifyIcon and WPF-UI are MIT, and WPF-UI bundles Microsoft's Fluent System Icons (also MIT).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages