Skip to content

genereda/scrnr

Repository files navigation

scrnr

A fast, free, open-source screen resolution switcher for macOS. Lives in your menu bar, stays out of your way.

scrnr menu bar and All Resolutions panel

Why scrnr?

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.

Features

  • 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.

Confirmation dialog with countdown

Install

Download

  1. Grab the latest .dmg from Releases.
  2. Open the DMG and drag scrnr to Applications.
  3. 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.

Build from source

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 build

The 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.

Usage

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.

Requirements

  • macOS 13 (Ventura) or later
  • Works on both Apple Silicon and Intel Macs

How It Works

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.

Known Limitations

  • 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 SLSSetDisplayRotation or change its behavior. scrnr detects failures and disables the feature at runtime rather than crashing.

A note on private API usage

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.

Contributing

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

License

Apache License 2.0

About

macOS menu bar utility for display resolution, refresh rate, rotation, and color format

Resources

License

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors