didriksg/Crisp

Swiftcrispmac.app
macOS

alternative to BetterDisplayLunar

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.

brightnessddcdisplay-managerhidpimacosmenu-bar4kapple-silicondisplaymonitorretinascaling
Star Growth
Stars
1.6k
Forks
66
Weekly Growth
+112
Issues
2
1.2k1.4k1.6k
Jul 26Jul 26Aug 26Sep 26
README
Crisp icon

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.

Download Crisp for macOS

Downloads Platform License

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:

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/Overrides that 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.

Related repositories
MonitorControl/MonitorControl

🖥 Control your display's brightness & volume on your Mac as if it was a native Apple Display. Use Apple Keyboard keys or custom shortcuts. Shows the native macOS OSDs.

SwiftMIT Licensemacoskeyboard
monitorcontrol.app
34.1k1k
waydabber/BetterDisplay

Unlock your displays on your Mac! Flexible HiDPI scaling, XDR/HDR extra brightness, virtual screens, DDC control, extra dimming, PIP/streaming, EDID override and lots more!

apphdmimac
betterdisplay.pro
33.6k638
xanderfrangos/twinkle-tray

Easily manage the brightness of your monitors in Windows from the system tray

JavaScriptnpmMIT Licensebrightnessbrightness-control
twinkletray.com
9k320
disintegration/imaging

Imaging is a simple image processing package for Go

GoGo ModuleslibraryMIT Licenseimageresize
5.8k482
alin23/Lunar

Intelligent adaptive brightness for your external monitors

SwiftMIT Licensemacosmacbook
lunar.fyi
5.7k145
emoacht/Monitorian

A Windows desktop tool to adjust the brightness of multiple monitors with ease

C#appMIT Licensemonitordisplay
microsoft.com/store/apps/9nw33j738bl0
4.7k220
ModernFlyouts-Community/ModernFlyouts

A modern Fluent Design replacement for the old Metro themed flyouts present in Windows.

C#appMIT Licensemetroflyouts
modernflyouts-community.github.io
4.1k214
Tyrrrz/LightBulb

Reduces eye strain by adjusting screen gamma based on the current time

C#appMIT Licensedisplaybrightness
github.com/Tyrrrz/LightBulb/releases
2.8k169
cyb3rko/flashdim

Modern flashlight app with dim functionality on Android 13+

KotlinappApache License 2.0androidandroid-app
1.4k68
Hummer12007/brightnessctl

A program to read and control device brightness

CcliOtherbrightnessbacklight
1.3k64