microsoft / microsoft/PowerToys

Power Display: ambient-light (ALS) adaptive brightness for external monitors

Open
#49,038 8 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Product-LightSwitch Product-PowerDisplay
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, VCP 0x10); 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.