Skip to content

Repository files navigation

BrightnessFlow

Flow brightness seamlessly from your MacBook's built-in screen to external displays · Native macOS Menu Bar App

English | 中文说明


What It Does

When you press the brightness keys on your MacBook (or when ambient light auto-adjustment triggers), the hardware backlight of your external displays changes instantly. It directly controls the monitors via the DDC/CI protocol, behaving exactly like pressing the physical buttons on your monitor, rather than applying a software overlay filter.

Menu Bar Panel

Features

  • 🌊 Auto Sync — Built-in screen brightness flows to all external displays in real time (100ms polling + write coalescing for smooth, lag-free dragging).
  • 🎚 Per-Display Light-Band Slider — Custom self-glowing slider with a floating brightness bubble following your drag.
  • 🔗 Smart Offset — Direct adjustment of an external slider while syncing automatically remembers its offset relative to the built-in screen (e.g., "external display is always 10% brighter"), persisted by screen UUID.
  • ⌨️ Global Shortcuts — Adjust external display brightness with default shortcuts ⌃⌥↑ / ⌃⌥↓, custom recording supported.
  • 🔊 Volume Control — A volume slider automatically appears if the display supports DDC volume control (VCP 0x62).
  • 🚀 Launch at Login — One-click toggle using SMAppService.
  • ☀️ Dynamic Menu Bar Icon — The sun rays expand and contract dynamically based on the built-in screen's brightness.
  • 🖥 Dashboard Window — Screen cards light up in real time, with an animated beam showing light flowing between screens during synchronization.

Main Window

How It Works

Stage Implementation
Read Built-in Brightness Uses the private DisplayServices framework (DisplayServicesGetBrightness, identical to system UI).
Control External Displays Uses Apple Silicon private API IOAVService to directly read/write DDC/CI over I2C (brightness VCP 0x10, volume 0x62), matching the path taken by MonitorControl and m1ddc.
Multi-Display Matching Parses the EDID from IOAVServiceCopyEDID (vendor/product/serial) and pairs it with the CGDisplay identity.
Prevent I2C Congestion Implements a serialized write queue per screen that keeps only the latest value, with a minimum write interval of 40ms.

Install

Download the latest BrightnessFlow-x.y.z.zip from the Releases page, unzip it, and drag BrightnessFlow.app into /Applications.

The app is ad-hoc signed (not notarized), so on first launch macOS Gatekeeper will block it. Either right-click the app → Open and confirm, or clear the quarantine flag:

xattr -dr com.apple.quarantine /Applications/BrightnessFlow.app

Build

Requires Xcode 15+ and xcodegen (brew install xcodegen):

xcodegen generate
xcodebuild -project BrightnessFlow.xcodeproj -scheme BrightnessFlow -configuration Release build

Unit tests (DDC protocol framing/checksum, EDID parsing, sync math):

xcodebuild -project BrightnessFlow.xcodeproj -scheme BrightnessFlow test

Known Issues

  • Do not run BrightnessFlow simultaneously with other sync tools like Lunar, MonitorControl, or BetterDisplay — multiple apps contending for the DDC bus will cause brightness to jitter. Please quit those apps (or disable their sync features) when using BrightnessFlow.
  • Depends on private APIs (IOAVService / DisplayServices) and only supports Apple Silicon. Adaptation might be required after major macOS updates. Cannot be published to the Mac App Store.
  • A few monitor firmwares may not reply to DDC read requests (a warning sign ⚠️ will be shown in the UI), but DDC writes usually still function correctly.

License

MIT © 2026 Fan Yu

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages