What was broken
Most display utilities either fight Night Shift and f.lux silently, claim medical outcomes they cannot prove, or hide what actually changed your screen. I wanted something honest: a schedule that survives time zones and DST, rules that do not discard half the state, and language that admits when macOS did not take the write.
Product decision
Ship a menu-bar app that runs the same schedule engine its website demonstrates. Put every source of control on one printed ladder of six layers, and decide warmth and brightness separately so a rule that only dims cannot discard the schedule’s warmth. Distinguish asked, accepted, and confirmed. Notice competing color-table writers instead of fighting them. Never ask for location, network, or analytics.
Flow
- 01ScheduleThrough the day
Anchors on the clock. Fades in mired. Survives DST and midnight.
- 02ExplainName the cause
Every state has a sentence. Precedence is printed, not implied.
- 03ConfirmTrust the readback
Success from an API is not evidence. Competition is reported.
What it does
- Shifts warmth and brightness gradually on a schedule you set, from presets Balanced, Subtle, Extra Warm, and Follow the sun
- Follow the sun uses real sunrise and sunset, computed on your Mac from a place you choose: 101 cities built in, or coordinates
- Lives in the menu bar: warmth and brightness, every mode, a pause with a duration, and restore, all one click from the icon
- A pause lasts fifteen minutes, an hour, until the next scheduled change, or until you say otherwise, and tells you when it ends
- The icon fills in proportion to how warm the setting is, and shows paused and off as distinct shapes rather than colors
- Schedules travel: Daylight imports the file its website writes, and a link carries a whole schedule to anyone else
Six layers, one fixed order
- Restored
Restore normal output. Top of the ladder, overrules everything below.
- Paused
Paused until you resume.
- Manual override
You reached for the slider.
- App rule
An app that needs true color.
- Workspace
Where you are working.
- Schedule
A schedule, warm by evening. The base layer, if nothing above it speaks.
The highest layer that speaks about a control wins it, and warmth and brightness are decided separately, so a rule that only dims cannot quietly discard your schedule’s warmth. There are no user-assignable priorities: a rules system you can predict beats one you can fully rewire.
It tells you what it is doing
- Every state has a sentence
Plain language naming whatever is responsible, written by the same resolver the app runs and checked against it across every combination of the six layers.
- Three levels of certainty
What it asked for, what macOS accepted, and what it could read back and confirm. Each display reports which applies. An API returning success is not evidence that anything changed.
- It notices the competition
f.lux and Night Shift write to the same color table. Daylight reads back after every write and says so when something else has overwritten it. It will not fight another app, or disable one behind your back.
“Your display is neutral because Colour Work is active for this app. Dimming comes from Balanced.” The app writes sentences like that one for every state.
The details that took the longest
- Schedules that survive real life
Daylight-saving changes, time-zone moves, clocks corrected by hand, schedules that cross midnight, night shifts, non-Western weeks, polar day and night. Anchors follow the clock and fades follow elapsed time; a test pins the 23-hour day that once put a schedule an hour out.
- Fades paced by perception
Interpolation runs in mired rather than kelvin, because 2000 to 3000 K is a large visible change and 8000 to 9000 K is nearly invisible. A 90-minute ramp writes about once a minute instead of once a frame.
- Displays remembered properly
Settings key to a durable display identity, never an index that is reassigned on every dock and wake. Identical monitors that cannot be told apart are reported as ambiguous instead of guessed at.
- It refuses a suspicious baseline
Before adjusting anything it validates what normal means for a display. With f.lux running, the table once read back R 1.00 / G 0.36 / B 0.10; a test is pinned to those exact numbers.
- Getting out of the way
⇧⌥⌘R restores normal output from anywhere with no permissions. Quitting restores your displays, and after a crash macOS restores the color table itself, verified under SIGKILL, which is why there is no watchdog helper.
- Sunrise without a permission prompt
Solar times are computed on your Mac from a place you choose. It can suggest a starting point from your time zone, never asks macOS where you are, and makes no network requests.
What it does not claim
- A comfort and routine tool, not a medical one: it does not prevent eye damage, treat eye strain, or improve your sleep
- No invented circadian, eye-health, or melatonin scores. There is no score of any kind
- Temperature values are approximate display targets, not measurements of emitted light
- Brightness is software dimming, not backlight control, and the app says so wherever the word appears
- It does not calibrate your display or make its color accurate, including in Colour Work mode
It stays on your Mac
- Account
- None
- Network requests
- None, ever
- Location permission
- Never asked
- Analytics or telemetry
- None
- Screen contents, keystrokes, camera
- Never touched
- Settings
- One readable file to export, import, or delete
- History
- Off by default; switching it off deletes what was kept
If you turn on app rules, Daylight reads the identifier of the frontmost application while deciding what to do, and keeps no record of it.
Two things that are not finished
- Multi-display on real hardware
Every path is written and covered against simulated devices, but only one display was attached during development. Daylight --diagnose shows what your own displays report.
- Backlight over DDC
External-monitor backlight control has unit-tested packet framing, but the hardware path has never exchanged a byte with a monitor, so it is off by default.
Both are stated on the product’s own site, next to the download.
Why I built it
- I wanted display comfort without medical theater, scores, or melatonin claims
- Existing tools either hide failures or overwrite each other quietly. I wanted the opposite
- The interesting work was the control model: one printed ladder, durable display identity, and honest certainty
How it was built
- Directed product, design, and implementation in Cursor; ownership and quality judgment are mine
- Native macOS with no third-party dependencies; it builds with Command Line Tools alone, no Xcode required
- 263 tests ship with the source, and the website runs the app’s own schedule engine and color math rather than a picture of it
- Solar position follows the published NOAA algorithm and the color-temperature approximation follows Kim et al. (2002), both implemented from their descriptions
- Signed v1.0.0, 2.1 MB, for Apple Silicon and Intel on macOS 14 or later. Not notarized yet, so Gatekeeper needs one extra step on first open
Role & tags
Product, design, and build. Designed the schedule model, the six-layer precedence ladder, certainty reporting, and the menu-bar product that stays out of the way.
- Schedule fades
- Explainable state
- Readback certainty
- No location permission
Impact
A signed macOS app (v1.0.0) with four schedule presets, app rules, pause and restore, durable display identity, and a website that runs the same schedule engine. Built end-to-end with no third-party dependencies. Not notarized yet, so Gatekeeper needs one extra step on first open, and the site says so.
See the product
Daylight is a signed macOS menu-bar app. Its site runs the real schedule engine in the browser, explains Gatekeeper and certainty, and carries the download and the source.
1-9 beats · j / k · ← → adjacent · y link · b brief
