microsoft / microsoft/PowerToys
Power Display: ambient-light (ALS) adaptive brightness for external monitors
Nobody has claimed this yet.
- Dominant language
- C
- Stars
- 139k
- Forks
- 8.6k
- PR merge metrics
- PR metrics pending
Description
Description of the new feature / enhancement
Add an ambient-light-driven adaptive brightness mode to Power Display: continuously adjust each external monitor's brightness (via DDC/CI) from the device's ambient light sensor (ALS) — the same sensor Light Switch already reads — so external monitors behave like a laptop panel with "Change brightness automatically when lighting changes."
This is the sensor-driven, continuous counterpart to the scheduling request in #47480. On #47480, a maintainer noted that Light Switch can already link to a Power Display profile on a scheduler; this proposal extends that linkage from time-based to ambient-light-based, which is what most users mean by "auto-brightness" and which no Windows tool (Twinkle Tray = schedule only) currently offers for external monitors.
Scenario when this would be used?
- A laptop docked to one or more external monitors in a room whose lighting changes through the day: the externals dim/brighten automatically to match ambient light, reducing eye strain — today only the built-in panel does this.
- Users with light sensitivity who want external monitors to track the room without manual sliders or rigid time schedules.
Supporting information
Both halves already exist in-repo — this is integration, not a new module:
- Read: Light Switch already consumes the ALS (
Windows.Devices.Sensors.LightSensor->IlluminanceInLux); ambient precedent in #42566. - Write: Power Display already sets external-monitor brightness over DDC/CI (
SetMonitorBrightness, VCP0x10); manual multi-monitor control in #35564.
Proposed design:
- Per-monitor opt-in "Adaptive (ambient light)" mode.
- User-editable lux -> brightness % curve, per monitor (the ALS sits on the chassis, not the panel, and each panel's nits/response differ, so a calibration curve is needed).
- Hysteresis + EMA smoothing + a minimum update interval to avoid flicker and reduce DDC/CI write wear.
- Reuse Power Display profiles as curve anchors; this also helps the limitation raised on #47480 about applying a Power Display profile without forcing a theme change.
Prior art: Lunar (macOS) implements exactly this (sensor/sync modes). Related issues: #47480 (time/schedule-based auto-brightness), #42566 (ALS -> theme), #35564 (manual multi-monitor brightness), #1052 (Quick Display adjustment umbrella, completed).
I'd be glad to work on this. Filing per the contributor guide (issue -> discussion -> agreement) before any code, and happy to write a spec for the curve model, calibration, hysteresis parameters, and settings UI if the approach looks good.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the existing Light Switch path using Windows.Devices.Sensors.LightSensor and IlluminanceInLux, then the Power Display path using SetMonitorBrightness and DDC/CI VCP 0x10. Compare the ambient-light precedent in #42566 and monitor-control work in #35564; done requires agreement on per-monitor opt-in, calibration curves, smoothing, update limits, and profile integration.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c
- Domain
- desktop, operating-systems
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100