A macOS menu bar app for adjusting color temperature (2500K–6500K) and brightness on a per-display basis. Built on a black-body radiation model, it rewrites each display's CoreGraphics gamma lookup table so every monitor gets its own white point. Lives in the menu bar — right-click the icon to quit.
- Per-display color temperature — each screen gets its own 2500K–6500K slider
- Live temperature readout — the current Kelvin value updates as you drag
- Quick presets —
Sun(6500K) /Dusk(4500K) /Moon(3000K) - Brightness control — a brightness slider with percentage readout when the display supports it (internal panels); hidden automatically otherwise
- Multi-monitor layout — single column for one display, two-column grid for two or more
- Hot-plug aware — relaunches itself when displays are reconfigured
- No kernel extension — uses CoreGraphics gamma tables and the private
DisplayServicesframework only
- macOS 10.11 or later
- Rust (stable) for building from source
| Command | Output |
|---|---|
make binary |
Build a binary for the current arch |
make binary-universal |
Build a universal (x86_64 + aarch64) binary |
make app |
Build target/release-lto/macos/Iris.app |
make app-universal |
Build a universal Iris.app |
make dmg |
Build target/release-lto/macos/Iris.dmg |
make dmg-universal |
Build a universal Iris.dmg |
cargo run --profile release-lto # Run directly without packaging
make app # Package as .app
make dmg-universal # Package a universal .dmg installerUniversal binaries require both targets installed:
rustup target add x86_64-apple-darwin aarch64-apple-darwinCode signing relies on a developer certificate present in the keychain (see the Makefile); all commands use MACOSX_DEPLOYMENT_TARGET=10.11.
- Run Iris — a sun icon appears in the menu bar.
- Click the icon to open the panel; drag a display's slider to shift its color temperature.
- Use the preset buttons for one-tap switching.
- Adjust brightness with the brightness slider (when available).
- Right-click the menu bar icon → Quit Iris to exit.
Color temperature is mapped to an RGB white point via a precomputed black-body radiation table (1000K–10100K, sourced from the gammastep project). The white point is written into each display's 256-entry gamma lookup table through CGSetDisplayTransferByTable; brightness is read and written through the private DisplayServices framework.
make clean # equivalent to cargo clean