alternative to BetterDisplay、Lunar
Every display control macOS hides, in one menu bar app: sharp HiDPI/Retina scaling (no more blurry or tiny text), DDC brightness and volume, Extra Brightness past 100%, presets, virtual displays. Free and open source, a no-cost alternative to BetterDisplay and Lunar.
↓ Download
All releases →Crisp
Every display control macOS hides, in one menu bar panel.
Free, open-source external monitor control for macOS.
Sharp HiDPI scaling, DDC brightness, presets and virtual displays.
Website · Crisp vs BetterDisplay & Lunar · Fix a blurry external monitor · 中文
Crisp is a lightweight, native menu bar app for controlling external monitors on macOS, and a free, open-source alternative to BetterDisplay and Lunar. It adds what macOS leaves out: sharp HiDPI scaling on any monitor (no more blurry or tiny text), real brightness and volume control over DDC, presets, display arrangement, and virtual displays. Every feature is free, with no Pro tier and no license key.
Fully localized in English and Simplified Chinese (简体中文).
https://github.com/user-attachments/assets/90a62808-84d2-40d6-8563-0b282b9b4b6d
Install
brew install --cask crisp
Or download Crisp.dmg and drag Crisp to Applications. Every release is signed and notarized by Apple, so it opens with a normal double-click.
Installed from didriksg/tap earlier? brew upgrade moves you to the main cask by itself; brew untap didriksg/tap afterwards is optional cleanup.
Features
- Sharp, Retina-quality scaling on any display: HiDPI scaled resolutions that make external monitors crisp instead of blurry or undersized, set up automatically for 1440p and larger displays, and always at the panel's full refresh rate (no more 1080p stuck at 50Hz on a 144Hz monitor)
- Smooth scaling: fine-tune how large everything looks in small steps, well beyond the handful of scaled sizes macOS offers; the flexible scaling people install BetterDisplay for
- Brightness everywhere: controls the real backlight of external monitors (DDC), dims via software on monitors that don't support that, and can keep dimming below the hardware minimum. Smooth fades, and brightness keys that follow the pointer, target all displays, or a chosen subset
- Extra Brightness: push XDR MacBook panels and HDR monitors past 100% by unlocking their HDR brightness reserve, up to the panel's full headroom (the feature BetterDisplay sells as brightness upscaling). One toggle per display, then the normal slider and brightness keys simply reach further. Sustained maximum brightness increases power draw, and real HDR video can look overblown while boosted
- Volume: control the built-in speaker volume of external monitors over DDC, with a slider per display and the keyboard volume/mute keys mapped to the monitor when it's your audio output. Shows only for monitors that support it, and can be hidden entirely from Settings
- Presets: save named display configurations (resolution, brightness, arrangement) with custom icons and colors, apply with one click, update in place. Image adjustment (gamma, color temperature, contrast) is per-display and not stored in presets
- Display arrangement: drag-to-arrange canvas, main display switching
- Disconnect displays: turn physical displays off and back on from the menu, remembered across sleep/wake (Apple Silicon)
- System toggles: Dark Mode, Night Shift, and True Tone, one click from the menu bar
- Color: ICC profile switching, XDR reference presets, HDR on/off per display, and image adjustment (gamma, contrast, gain, invert colors)
- Virtual displays: create HiDPI virtual screens
- Extras: combined brightness slider, auto brightness following the built-in display, a toggle for macOS's own ambient auto-brightness, keep awake, notch hiding, launch at login
How does it compare?
BetterDisplay and Lunar are excellent, deeper tools. Crisp keeps the everyday essentials free: flexible HiDPI scaling, hardware brightness, presets, disconnecting displays, color adjustments, and auto-brightness sync. See the full side-by-side: Crisp vs BetterDisplay, Lunar & MonitorControl.
Support
Crisp is and will stay completely free. Its main running cost is the $99/year Apple Developer Program, Apple's fee for signing and notarizing the app so it installs cleanly. If you've found Crisp useful, or it saved you a BetterDisplay or Lunar license, and you'd like to chip in toward keeping Crisp signed and notarized, there's:
Completely optional, but you'll have my heartfelt thanks.
Sponsors
Thank you to the people chipping in toward keeping Crisp signed and notarized:
- Arnor Ingthorsson (@arnor-ingthorsson)
- Barry (@BarryBarrywu)
- @kuldipmaharjan
- Volodymyr Dombrovskyi (@rebelvg)
Requirements
- macOS 14 (Sonoma) or later; on macOS 26 the panel uses the native Liquid Glass backdrop
Permissions
- Administrator password (one time, per monitor): needed only when you turn on smooth scaling, which installs a display override file into
/Library/Displays/Contents/Resources/Overridesthat macOS protects. Regular HiDPI scaling and everything else are password-free. - Accessibility (System Settings > Privacy & Security > Accessibility): needed only if you turn on Brightness Keys, which routes the keyboard brightness keys to other displays (follow the pointer, all connected, or a chosen subset). Without it, everything else still works; the keys just control the built-in display as usual.
Managed Macs
To keep Keep Awake off on company Macs, push a configuration profile for the com.crisp.app domain with crisp.disableKeepAwake set to true. Crisp reads it at launch and leaves the row out of Tools. A managed value outranks the user's own preferences, so it cannot be switched back on with defaults write.
Automation
Crisp ships with crispctl, a command line tool for the same controls. It lives inside the app at Crisp.app/Contents/MacOS/crispctl; the Command Line Tool switch in Settings links it into /usr/local/bin after one admin prompt (off removes the link), and the Homebrew cask makes the same link on install. Source builds get it with:
xcodegen generate && xcodebuild -scheme crispctl -configuration Release
crispctl help prints the commands, and crispctl display, crispctl brightness or crispctl hdr one group with --help on any command for its details; point an agent at them before it does anything else.
Display commands:
display list List displays as JSON
display connect <display> Put a disconnected display back
display disconnect <display> Take a display out of the layout
display toggle <display> Disconnect if connected, connect if not
Brightness commands:
brightness get <display> Read brightness and its live maximum
brightness set <display> <percent> Set brightness
brightness boost get <display> Read Extra Brightness state
brightness boost set <display> on|off Switch Extra Brightness
HDR commands:
hdr get <display> Read HDR state
hdr set <display> on|off Switch HDR on an eligible external
Other commands:
help Show this help (also -h, --help)
version Show the Crisp version this tool ships with (also --version)
<display> is a runtime id or a uuid from display list. Ids can change after an unplug or a wake; uuids do not, so scripts should prefer them.
display list reports each display's uuid, current resolution, logical brightness, logical maxBrightness, and brightness backend. The backend is Crisp's current route (builtin, ddc, software, or unknown while external DDC availability is undetermined); HDR software dimming reports software. Output is one JSON object per call.
Crisp must already be running; crispctl never launches it. brightness set accepts 0...100 normally. Values above 100 require Extra Brightness to be enabled and currently eligible for that display, and must not exceed its live maxBrightness; invalid boosted values are refused rather than clamped. A set is a manual change like using the slider and clears the active preset. The reply means Crisp accepted the request, not that the panel was read back; it is not retried automatically.
For example, brightness boost get returns {"ok":true,"brightnessBoost":{"displayID":7,"eligible":true,"enabled":false}}. eligible is the running Extra Brightness service's current eligibility result; enabled is its persisted per-display toggle state, so the two can differ while capability has collapsed and cleanup or auto-disable is pending. brightness boost set uses that existing service: on is refused when currently ineligible or when enabling fails, while off remains available for a connected display regardless of current eligibility. Enabling an external display may wait while the service settles HDR mode. Success means the service returned true, not that hardware, EDR headroom, or luminance was independently verified. A transport timeout does not prove the change was not applied; do not retry automatically—run brightness boost get first.
display disconnect, connect and toggle are the menu's Disconnect Display and Reconnect from a script, for a KVM desk or a button: Apple Silicon only, and a disconnect is refused when it would leave no active display. A display Crisp is holding disconnected is absent from every macOS display list, so display list still shows it with connected:false and its last-known id; use the uuid for it. Asking for the state a display is already in succeeds and changes nothing, and the reply comes after the window server has answered, which can take a few seconds.
hdr get and hdr set work on the external displays Crisp shows its HDR toggle for; the built-in panel and externals without HDR modes are refused. get reads the live state. set writes once through the same path as the toggle and reports success only when the read-back agrees; when it cannot tell (a timeout, or the display going away mid-way) it says so and does not retry, so run hdr get before retrying. Exit codes are unchanged.
Building
brew install xcodegen
xcodegen generate # generates Crisp.xcodeproj from project.yml
open Crisp.xcodeproj
For a distributable DMG (Command Line Tools only, no full Xcode) and the fast edit-compile-run dev loop, see docs/BUILDING.md.
Contributing
Issues and pull requests are welcome. Found a bug, want a feature, or have a display Crisp doesn't handle well? Open an issue or start a discussion. PRs are just as welcome, whether it's a fix, a feature, or a new translation.
Origin
Crisp began as a fork of FreeDisplay and has since been substantially rewritten: a custom panel architecture, native controls throughout, a reworked brightness pipeline, and a full redesign. Thanks to FreeDisplay for the foundation and the spirit: free display management for everyone.
License
MIT. Portions derived from FreeDisplay remain available under its MIT terms, reproduced in ACKNOWLEDGMENTS.md.
