Lidopen is a personal macOS menu bar utility that watches display changes and can disable the built-in display when selected external monitors are connected.
This tool was built for a very specific setup: using an ultrawide external monitor while still keeping the MacBook open so the built-in camera, microphone, and speakers remain available.
It exists because that single behavior was the only feature needed, and building a small dedicated utility was preferable to relying on a larger commercial display-management app just for that one capability.
- Product: menu bar app for macOS
- Purpose: automate built-in display behavior based on connected monitor rules
- Architecture: Swift Package with a small app target (
Lidopen) and a core module (LidopenCore) - UI: AppKit menu bar app with a SwiftUI settings window
- Display control approach: private CoreGraphics / CGS display APIs
This is a personal sideloaded utility. It is not designed as an App Store distribution target.
- Hardware: Apple Silicon (
arm64) - macOS: 26.5.2
- Xcode: 26.5
- Minimum deployment target: macOS 13
Because the app depends on private display APIs, behavior may vary across macOS releases and hardware.
Download the DMG from the GitHub Releases page, open it, and drag Lidopen.app to Applications.
Published DMG files are currently unsigned and not notarized. macOS may require approving the app in System Settings before first launch. If you prefer not to use the published DMG, build the app locally from source with the commands below.
Build the package:
swift buildBuild the app bundle:
./Scripts/build_app.shThe app version is read from VERSION. The generated bundle is written to dist/Lidopen.app.
Build a downloadable DMG:
./Scripts/build_app.sh --dmgIf SwiftPM cache or manifest sandboxing is restricted in your environment:
CLANG_MODULE_CACHE_PATH=/private/tmp/clang-mod \
SWIFT_MODULE_CACHE_PATH=/private/tmp/swift-mod \
swift buildThe same override works for app bundle packaging:
CLANG_MODULE_CACHE_PATH=/private/tmp/clang-mod \
SWIFT_MODULE_CACHE_PATH=/private/tmp/swift-mod \
./Scripts/build_app.shTo build and install into /Applications:
./Scripts/build_app.sh --installThe local install command replaces /Applications/Lidopen.app. It first asks the running app to quit and refuses to replace the app while the process is still active.
Run the app target directly:
swift run LidopenOr open the packaged app:
open "dist/Lidopen.app"Run the test suite:
swift testManualmode never changes display state automatically.Automode evaluates active external monitors against saved rules.- Unknown external monitors default to safe behavior and keep the built-in display active until a rule is saved.
- The built-in display toggle is attempted through the private
CGSConfigureDisplayEnabledsymbol inside a CoreGraphics display configuration transaction.
- Uses private APIs, so it is not App Store-safe.
- May break across macOS updates.
- Should be treated as a local utility, not a broadly portable product.
This app was built with substantial help from LLM tooling. The code, structure, and documentation were iterated through human-directed AI-assisted development.
Sources/
LidopenCore/
Lidopen/
Tests/
LidopenCoreTests/
Package.swift
Scripts/
build_app.sh
generate_icon.swift
.github/workflows/
release.yml