Vol.01 01 Rel.0.1.0 macOS13+ · Apple Silicon

Adaptive Screen

— pro lumine ambientis —

A menu bar instrument for keeping your display honest at every hour of the day.

Your eyes adapt to ambient light in seconds; your monitor does not. Adaptive Screen watches the room through your webcam in seven-hundred-millisecond glimpses — brief enough that the camera LED flickers and goes dark — and drives your external display's hardware brightness across the curve it learns from your adjustments.

Room-light analysis happens locally on your Mac. The webcam is powered on briefly and only the Y-plane is read. Frames are never stored; only derived luma readings and the observations needed to learn your brightness preferences are retained.

Download AdaptiveScreen.dmg·2.1 MB·v0.3.6
Signed with a Developer ID certificate Notarized by Apple·No App Store
01

Method

camera → luma → curve → DDC/CI

Snapshot

Every 5 to 15 minutes the app opens the camera, waits ~700 ms for exposure to settle, captures one frame, stops the camera. Dark rooms and sunrise/sunset use the faster cadence. The LED blinks briefly.

Compute

The Y-plane of the pixel buffer is averaged into a single luminance scalar 0–255. The pixel buffer is never copied or decoded into an image format.

Curve

The luma is looked up against the anchors learned from your brightness choices. Until you have taught it a preference, the app uses a conservative default brightness map.

DDC/CI

The target brightness rides over DDC/CI to the monitor — the same bus its OSD buttons speak on. No software tint, no framebuffer overlay, no GPU color manipulation.

02

Calibration

your curve, or one it learns

Define your own ambient-light-to-brightness mapping by dragging control points on a grid. Click empty space to add; -click a point to remove. A purple marker tracks the live luminance reading against your curve so you can see the target brightness move in real time.

Each deliberate brightness choice becomes a learned anchor at the room luma the camera measured. Day and night anchors are kept distinct and blended around the transition, so a comfortable dark-room choice does not get overwritten by your daytime preference. You can refine those anchors directly or seed them again from your local adjustment history.

live luma 128 dark bright 0% 100%
03

Responsive cadence

denser samples when light moves fastest

Morning and evening demand denser samples — the light changes fastest then. The snapshot scheduler uses your stored latitude and longitude to compute local sunrise and sunset from NOAA's solar algorithm, then switches automatically: 5-minute intervals in dark rooms or within an hour of either event, 15 minutes otherwise. Set your location by clicking the embedded MapKit view, or let the app infer it from your time zone.

00:00 06:00 12:00 18:00 24:00
responsive ·  5 min normal ·  15 min sun event
04

Instruments

what's in the menu
  1. 01

    Per-monitor profiles

    Brightness anchors, mode, and friendly name are keyed on the monitor's EDID (vendor × model × serial). The Dell at the office and the LG at home each keep their own adjustments on this Mac.

  2. 02

    Idle on built-in

    When only the MacBook display is attached, the app sits quietly. macOS handles that one better than any third-party tool could.

  3. 03

    Native controls, indexed

    Color preset, picture mode, and input source are populated by parsing the monitor's DDC/CI capabilities string — not a hard-coded list. Your monitor's Low-Blue-Light mode shows up where it exposes it.

  4. 04

    Local processing

    Room-light analysis, learned brightness anchors, and sample history stay on this Mac. No account or cloud service is needed for adaptation.

  5. 05

    Brightness, without tinting

    Adaptation changes the monitor's hardware brightness only. It does not add a software overlay, alter the framebuffer, or shift the display's color temperature.

  6. 06

    Debug API

    A JSON snapshot of every monitor read, camera transition, and scheduler decision is written to Application Support every three seconds — because it doesn't work on mine should be a solvable problem, not a shrug.

05

On the camera

the only part that matters

Adaptive Screen never stores an image.

The webcam is powered on for roughly 700 ms per snapshot — just long enough for exposure to settle and one frame to arrive. The pixel buffer is locked, the Y-plane (luminance only, no chroma) is read into an average, and the buffer is unlocked. The frame is discarded after that local calculation. Derived luma readings and brightness-learning observations may be stored, but frames and pixel data are neither retained nor sent by the brightness system.

Camera sampling lives in LightSensor.swift, with camera selection handled by small policy and menu-controller types.

0 128 ← mean luma 255
One scalar per frame. That's the whole signal surface.
06

Specifications

what you'll need to run it
Operating systemmacOS 13 Ventura or later
ArchitectureApple Silicon (M-series)
DisplayExternal monitor with DDC/CI over DisplayPort, HDMI, or Thunderbolt
CameraChoose Automatic or any camera macOS exposes; Automatic prefers an external USB webcam
DistributionDeveloper ID Application, notarized by Apple·not sandboxed
Private SPIIOAVService — same interface used by Lunar, BetterDisplay, and m1ddc
Bundled codeSwift app with a small C DDC bridge·Sparkle updater
Size2.1 MB .dmg·~3.6 MB installed
07

Distribution

one download, two formats
.dmg 2.1 MB · v0.3.6

AdaptiveScreen.dmg

Disk image for macOS 13 or later, Apple Silicon. Signed with a Developer ID certificate and notarized by Apple.

Download

After launch, choose Enable camera access… from the menu-bar app; macOS will then ask for permission. If access was previously denied, that same action opens Camera privacy settings, and the menu also provides a reset action for troubleshooting.