Flow brightness seamlessly from your MacBook's built-in screen to external displays · Native macOS Menu Bar App
English | 中文说明
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.
- 🌊 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.
| 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. |
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.appRequires Xcode 15+ and xcodegen (brew install xcodegen):
xcodegen generate
xcodebuild -project BrightnessFlow.xcodeproj -scheme BrightnessFlow -configuration Release buildUnit tests (DDC protocol framing/checksum, EDID parsing, sync math):
xcodebuild -project BrightnessFlow.xcodeproj -scheme BrightnessFlow test- 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.
MIT © 2026 Fan Yu


