Version 1.5.0
A lightweight and fast macOS menu bar app for quickly switching display resolutions.
- Instant Resolution View: See current resolution for each connected monitor
- One-Click Switching: Change resolution with a single click
- Multi-Monitor Support: Independent resolution control for each display
- Clean macOS Interface: Native menu bar integration with light/dark mode support
- No Dock Icon: Runs exclusively in the menu bar
- Resolution Management: Hide/show specific resolutions through the Settings window
- System Integration: Quick access to macOS Display Settings
- Movie Mode: Black out non-main displays from the QuickRes menu while keeping your main screen visible
- Auto-Detection: Automatically detects display configuration changes
- Smart Filtering: Filters out very low resolutions (below 640×480) and intelligently displays refresh rates when multiple modes exist
- Safety Mechanism: 15-second auto-revert with confirmation dialog for resolution changes
- User Notifications: Visual feedback for resolution changes, errors, and launch at login status
- Launch QuickRes - The app will appear as a display icon in your menu bar
- Click the icon to open the resolution menu
- Select a resolution to instantly apply it to the corresponding display
- Current resolution is indicated with a checkmark (✅)
- Confirmation Required - After changing resolution, a 15-second countdown begins. Confirm to keep the change, or it will revert automatically
- Start Movie Mode - Use the Movie Mode item to black out non-main displays, then stop it from the same menu item
- Access Settings - Use the Settings menu item for resolution management and launch at login options
- Open Display Settings - Quick link to macOS System Settings for advanced display configuration
QuickRes includes a Settings window (⌘,) that allows you to:
- Launch at Login: Automatically start QuickRes when you log in
- Hide unwanted resolutions from the menu for a cleaner interface
- Show/hide resolutions organized by connected monitor
- Deselect All: Quickly hide all non-current resolutions with one click
- Protected Current Resolutions: Current active resolutions cannot be hidden
- Per-Monitor Organization: Resolutions are grouped and sorted by display
- macOS 14.0 or later
- Apple Silicon Mac (arm64)
- No elevated permissions required
make build # Build Debug configuration
make build-release # Build Release configuration
make test # Run unit tests only
make test-ui # Run UI tests (manual/nightly)
make package # Package ZIP and DMG for distributionmake bootstrap # Install SwiftLint + SwiftFormat via Homebrew
make format # Format Swift code with SwiftFormat
make lint # Run SwiftLint for code qualityBuilt with Swift and AppKit using CoreGraphics APIs:
CGGetActiveDisplayList- Display detectionCGDisplayCopyAllDisplayModes- Resolution enumerationCGConfigureDisplayWithDisplayMode- Resolution switchingNSApplication.didChangeScreenParametersNotification- Display change monitoring
StatusBarController- Primary controller managing menu, resolution switching, settings windowDisplayManager- Low-level display enumeration and mode switching via CoreGraphicsMovieModeController- AppKit shield-window controller for blacking out non-main displaysResolutionCheckbox- Custom widget for settings window resolution visibility- Safety mechanism: 15-second auto-revert timer with confirmation dialog on resolution changes
- Error handling: User notifications for resolution errors, launch at login failures
QuickRes includes comprehensive test coverage:
- DisplayManager Tests: Display enumeration, resolution filtering, refresh rate detection, error handling
- StatusBarController Tests: menu wiring, UserDefaults persistence, resolution key generation, display string formatting
- MovieModeController Tests: non-main display shielding, stopping, single-display behavior, display-refresh replacement
- QuickRes Tests: Resolution sorting, data structures, refresh rate display logic, display manager refresh
Run make test for unit tests. Run make test-ui when you explicitly want to execute UI automation.
See docs/TEST_PLAN.md for the full automated and manual QA matrix.
- Keyboard shortcuts
- Display profiles
- AppleScript/CLI support
- Preset resolution combinations
QuickRes 1.5.0 is published on GitHub as a source-only release.
The project includes a packaging workflow for distribution outside the App Store, but public .zip and .dmg
artifacts require Developer ID signing and Apple notarization.
- The
v1.5.0release is source-only. - Current public releases remain source-only by default.
- Signed and notarized macOS binaries are not published until Apple Developer signing is configured.
make packageArtifacts are written to dist/ and named like QuickRes-<version>-<build>.zip and .dmg.
make package is intended for real distribution builds and will fail unless the app is signed for public release.
For local smoke packaging without notarization:
SKIP_NOTARIZATION=1 make packageSigning (optional, if Xcode signing is already configured):
export CODESIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)"Notarization (choose one):
# Option A: keychain profile
export NOTARYTOOL_PROFILE="notarytool-profile-name"
# Option B: App Store Connect API key
export NOTARYTOOL_KEY_PATH="/path/AuthKey_XXXX.p8"
export NOTARYTOOL_KEY_ID="KEYID"
export NOTARYTOOL_ISSUER_ID="ISSUERID"
# Option C: Apple ID (app-specific password)
export NOTARYTOOL_APPLE_ID="you@example.com"
export NOTARYTOOL_PASSWORD="app-specific-password"
export NOTARYTOOL_TEAM_ID="TEAMID"Optional flags:
export SKIP_NOTARIZATION=1 # Skip notarization (local testing only)
export PACKAGE_TARGETS=zip # zip | dmg | both (default: both)
export OVERWRITE=1 # Replace existing artifactsNote: Public macOS binaries require an Apple Developer account, a Developer ID Application certificate, and notarization credentials.
Copyright 2025 Liew Cheon Fong. All rights reserved.