A fast, free, open-source screen resolution switcher for macOS. Lives in your menu bar, stays out of your way.
Changing your Mac's resolution shouldn't require six clicks through System Settings. scrnr puts every available resolution one click away in your menu bar — including modes macOS hides from you.
- One click to switch. Recent resolutions are pinned at the top. Everything else is in the full list.
- No account, no subscription, no tracking. Download it, run it, done.
- ~20 MB memory at idle. No Electron. No web views. Native Swift and AppKit.
- Switch resolution from the menu bar
- Recent resolutions remembered (up to 4) for quick access
- Browse all available modes with filters (Retina, Popular, Aspect Ratio)
- Change refresh rate and color format (RGB, YCbCr 4:4:4/4:2:2/4:2:0, 8/10/12-bit)
- Rotate display 90°
- 10-second confirmation with automatic revert — you won't get stuck on a black screen
- Launch at Login
- HiDPI badge and common name tags (e.g. "4K", "1080p", "MacBook Pro 15"")
Safe by default: Every change triggers a 10-second countdown. If you don't click "Looks good" (like if the mode change causes your screen to go blank), it automatically reverts to your previous settings. Under the hood, changes are applied temporarily first and only written permanently when you confirm — so even if scrnr crashes mid-countdown, the mode reverts on logout.
- Grab the latest
.dmgfrom Releases. - Open the DMG and drag scrnr to Applications.
- Launch scrnr — it appears as a monitor icon () in your menu bar.
The app is signed and notarized with Apple, so it opens without Gatekeeper warnings.
Note: scrnr is not on the Mac App Store because it uses private macOS APIs for rotation and color format detection. See A note on private API usage below.
Requires Xcode 15+ and macOS 13 (Ventura) or later.
git clone https://github.com/err2x/scrnr.git
cd scrnr
xcodebuild -project scrnr.xcodeproj -scheme scrnr -configuration Release buildThe built app lands in ~/Library/Developer/Xcode/DerivedData/scrnr-*/Build/Products/Release/scrnr.app. Move it to /Applications or wherever you like.
No code signing or entitlements are required. No external dependencies.
| Action | How |
|---|---|
| Switch resolution | Click the menu bar icon → pick a resolution |
| See all resolutions | Click More resolutions... or press ⌘, |
| Change refresh rate | Menu bar → Refresh Rate submenu |
| Change color format | Menu bar → Color Format submenu |
| Rotate display | Menu bar → Rotate 90° (toggles) |
| Start at login | Menu bar → Launch at Login |
After every change, a confirmation panel appears with a 10-second countdown. If the new mode looks wrong (or your monitor goes dark), just wait — it reverts automatically. Press Looks good to keep the change.
- macOS 13 (Ventura) or later
- Works on both Apple Silicon and Intel Macs
scrnr is ~800 lines of Swift across 6 files:
- DisplayManager — CoreGraphics/IOKit wrapper. Enumerates and caches display modes on launch and after display changes. Handles all mode switching.
- AppDelegate — Owns the menu bar icon. Rebuilds the menu reactively via Combine subscriptions.
- RecentsStore — Persists your 4 most recent resolutions to UserDefaults.
- SettingsView — SwiftUI "All Resolutions" panel with Retina/Popular/Aspect Ratio filters.
- ConfirmationView — The 10-second revert countdown.
- scrnrApp — Entry point. Wires up the Settings scene.
Mode enumeration (CGDisplayCopyAllDisplayModes) only runs on launch and after display changes — never during menu interaction. Menu rebuilds read from cache.
- Primary display only. Multi-monitor support is not implemented.
- YCbCr detection on Apple Silicon is best-effort. The DCP display subsystem on AS doesn't expose the same IOKit interfaces as Intel.
- Private APIs may break. A future macOS update could remove
SLSSetDisplayRotationor change its behavior. scrnr detects failures and disables the feature at runtime rather than crashing.
scrnr uses two private macOS APIs that aren't available through the public SDK:
| API | Framework | Purpose |
|---|---|---|
SLSSetDisplayRotation |
SkyLight | Set display rotation (0°, 90°, 180°, 270°) |
IOFBGetDisplayModeInformation |
IOKit | Query per-mode pixel format and bit depth (Intel only) |
Both are loaded at runtime via dlopen/dlsym. If they're unavailable (removed in a future macOS version), the corresponding features degrade gracefully — rotation hides itself, and color format falls back to parsing CGDisplayMode.pixelEncoding.
Why private APIs? Apple removed CGConfigureDisplayOrientation from the public SDK and provides no public alternative. The only public API for pixel format (pixelEncoding) is deprecated and reports incorrect values on external monitors.
Apple Silicon vs. Intel: On Apple Silicon, the traditional IOKit framebuffer stack (IODisplayConnect / IOFramebuffer) doesn't exist. scrnr detects this and falls back to parsing the deprecated pixelEncoding string for color format information. Rotation works on both architectures via SkyLight.
Contributions are welcome. If you're fixing a bug or adding a feature, open an issue first to discuss it.
# Build debug
xcodebuild -project scrnr.xcodeproj -scheme scrnr -configuration Debug build
# Run
open ~/Library/Developer/Xcode/DerivedData/scrnr-*/Build/Products/Debug/scrnr.app
# Kill and relaunch after changes
pkill -x scrnr; open ~/Library/Developer/Xcode/DerivedData/scrnr-*/Build/Products/Debug/scrnr.app
