Native brightness stays native, with a clearer panel for mixed displays and warmth.
Changed
- Mixed display brightness is explicit. Adjusting one monitor now leaves All Displays at its last setting and labels it Mixed, instead of moving the master slider to an unexplained average. Touching the master makes every display agree again.
- The panel follows macOS appearance. Light and dark modes now use adaptive materials, text, borders, sliders, and controls rather than a dark-only HUD treatment.
- Warmth has one master switch. Turning Warmth on arms its selected schedule; turning it off disables warmth and its schedule. A Warm now switch temporarily overrides a custom schedule without deleting it.
- Custom times are easier to set. Hour and minute menus replace repeated 15-minute stepping, with larger click targets and five-minute precision.
Fixed
- Normal Apple and DDC brightness changes no longer rewrite the display's gamma table. Gamma is touched only for sub-zero dimming or a software-only display, so hardware-backed displays continue through their native brightness path.
- Custom warmth schedules now reconcile immediately when their mode or times change, including schedules that cross midnight.
- The panel stays anchored at the menu bar while Warmth expands or collapses; its toggle no longer slides out of place.
- Slider fills, thumbs, mixed states, and colour transitions now stay aligned at every value, including 100%.
Screen warmth, driven through macOS Night Shift.
Added
- Screen warmth. A warmth slider in the panel, backing directly onto macOS Night Shift rather than a colour tint of Luma's own. Because it's a separate stage from the sub-zero dimmer, warmth and dimming compose instead of fighting, and it survives sleep, wake and display changes for free. The slider reads out strength and colour temperature together ,
50% · 4100K. - Warmth schedule. Off, sunset-to-sunrise, or custom times, from the same card. Pick Sunset and Luma shows tonight's actual sunset and sunrise, worked out on-device from a one-time, low-accuracy location fix. Decline location and it falls back to a plain label , nothing is transmitted or stored.
- Warmth from a script. The
luma://scheme gainswarm:luma://warm?level=40sets it and turns it on,luma://warm?on=falseturns it off, a bareluma://warmtoggles. - Update checks while it runs. Luma now looks for a newer release on an hourly tick, not only at launch, so a menu bar app left running for weeks still hears about one. Still at most once a day, still silent unless there's something newer, still no telemetry.
Fixed
- Corrected the size claim in the earlier notes , the bundle is under 1 MB.
First public beta , native Swift, under 1 MB, zero dependencies.
Added
- Brightness keys for every display. Your keyboard's brightness keys , plus third-party keyboards, media keys, and QMK/VIA rotary knobs , now adjust every screen, not just the built-in. Apple displays via Apple's native path; everything else over DDC/CI, including on Apple Silicon.
- Route keys where you mean. All displays at once, or just the one under your pointer. Hold a modifier (⌥ by default, configurable) to flip routing for a single press.
- Sub-zero dimming. A "Dim below minimum" toggle takes any slider below the hardware floor with a software gamma stage , a too-bright panel can finally go dark at night. Displays with no hardware path (DisplayLink, mirrored, DDC off) become software-dimmable too, instead of uncontrollable.
- A menu bar icon that's a gauge. A half-sun whose rays track brightness , 3 dim, 7 full, a moon when a screen is blacked out. It animates as you adjust.
- Notch-style HUD. A pill on the display you're looking at , top, or vertical from an edge. On notched MacBooks it becomes the notch, sliding out from behind it.
- Menu bar control deck. Right-click for presets, per-display levels, pause, and exclusions. Scroll over the icon to adjust. Save named profiles ("Day", "Movie", "Present") and apply them anywhere.
- Automation, no CLI needed. A
luma://URL scheme (set,up/down,profile,pause) drives Luma from Shortcuts, Raycast, or any script. Hand-editsettings.jsonand it applies live. - Stays out of your way. No dock icon, launch at login, restore-on-reconnect for DDC monitors that reset on power-cycle, and a flight-recorder log in Copy Diagnostics for bug reports.
Also in this build
- A settings menu in the panel. The gear beside the Luma wordmark opens profiles, display refresh, diagnostics, update checks, and quit , everything that doesn't earn a permanent row, without hunting for a right-click.
- Updates that explain themselves. Luma checks GitHub once a day and, when there's something newer, shows the release notes inline with a Download button. No Sparkle, no background daemon, no telemetry , and you can skip a version.
- The build you're on, in plain sight. The panel footer shows the version and links straight to this page.
- Switches you can read at a glance. A toggle that's on now carries the same warm fill as the buttons beside it, instead of the system switch's near-identical on and off states.
Fixed before release
- DDC reads never worked. The I2C read passed the write sub-address instead of
0, so every monitor returned garbage. Cross-checked against two independent implementations. - DDC went to the wrong monitor. External display ports were paired to displays by enumeration order, so on a Mac with an Apple external plus a third-party one, the third-party monitor's brightness was sent to the Apple display's bus. Ports are now matched by the panel's own EDID identity.
- Read requests carried a bad checksum, which stricter monitors reject outright. Packets are also sent twice now, as every other implementation does , I2C acknowledges a packet the monitor then ignores, so a dropped first packet is invisible to a retry.
- Mirrored displays were unreachable. Mirror a laptop to a TV and the TV's brightness couldn't be adjusted at all. Every member of a mirror set is controllable now.
- Sliders that did nothing. Displays that refuse a gamma table , AirPlay, Sidecar, DisplayLink , were still given a software-dimming slider. Luma now checks whether the display accepts it and says so honestly when it doesn't.
- Waking from sleep lost the restore. The DDC bus is unresponsive for seconds after wake, so the restore burned its retries into a dead channel and flagged healthy monitors as failed.
- The menu bar icon froze while dragging a slider. Two separate causes: the animation timer was restarted faster than it could tick, and it ran in a mode that AppKit suspends during a drag.
Notes
- Apple Silicon, macOS 13+. Free forever, MIT-licensed, no telemetry, no accounts, no caps.
- Ships unsigned , first launch, right-click → Open → Open, or
xattr -dr com.apple.quarantine /Applications/Luma.app. - This is a beta. DDC behaviour varies a lot between monitors. If yours misbehaves, open an issue and paste ⚙ → Copy Diagnostics.