Restore the monitor layout macOS keeps scrambling.
LayoutRecall is the open-source macOS menu bar app for MacBook + dock + 2+ display desks. Save a known-good layout once, then bring it back after sleep, wake, or reconnect — automatically when the match is confident, manually when it is not.
- Download the signed app: GitHub Releases
- Install with Homebrew:
brew install --cask aroido/layoutrecall/layoutrecall - See the short product story: demo GIF · demo MP4
Quick reasons people install it:
- Save a desk once: keep a known-good layout ready for the next reconnect.
- Restore only when safe: automatic recovery is limited to strong profile matches.
- Stay in control when it is not safe:
Restore Now,Apply Layout,Show Numbers, and diagnostics stay available.
LayoutRecall is aimed first at people who already know the exact monitor layout they want back:
- MacBook + dock + 2+ external display users
- developers, creators, analysts, and operators with left/right monitor muscle memory
- anyone tired of identical displays returning in the wrong order after sleep, wake, or reconnect
If you want a full display-management suite or magical support for every complex four-plus-display rearrangement, this repo is intentionally narrower than that.
- It is conservative by design. Automatic restore only runs when the connected display set strongly matches a saved profile.
- It stays transparent when it refuses to act. If the match is weak or a dependency is missing, the app keeps recovery manual and shows why.
- It gives you direct recovery controls.
Restore Now,Apply Layout,Show Numbers, andSwap Positionsare available when you want control. - It exposes real diagnostics. Confidence, dependency state, and recent restore evidence stay visible instead of being buried.
- It is easy to evaluate honestly. Signed downloads, a Homebrew cask, and the open-source codebase make the install path lower-friction than a random display script.
| When macOS forgets your setup | What LayoutRecall does |
|---|---|
| Identical monitors come back in the wrong order after sleep or wake | Restores a saved profile when the live display snapshot is a confident match |
| Dock reconnect changes the main display or origin unexpectedly | Brings back the known-good arrangement you already saved |
| Auto-restore would be risky | Stops short, shows diagnostics, and leaves recovery manual on purpose |
| You want to recover immediately yourself | Gives you Restore Now, Apply Layout, Show Numbers, and Swap Positions |
The demo follows the real product story: a desk layout drifts, a saved profile is recognized, restore stays confidence-aware, and diagnostics/manual fallback remain visible.
LayoutRecall keeps the matched profile, dependency status, confidence signals, and recent restore evidence close to the action so users can tell what happened — or why the app refused to guess.
Save more than one desk profile, tune how restore behaves on startup, and keep manual recovery actions within reach when you want a predictable fallback.
- Saves and manages one or more display layout profiles from the current live monitor arrangement
- Watches for real display reconfiguration events and attempts automatic restore when confidence is high
- Falls back to manual recovery with
Restore Now, directApply Layout,Show Numbers, andSwap Positions - Shows profile, confidence, dependency, and diagnostic context directly from the menu bar
- Persists diagnostics history and keeps recovery controls inside three primary settings sections: Restore, Profiles, and App
- Supports launch at login, keyboard shortcuts, in-app update checks, and explicit
System/English/Koreanlanguage choice - Can install
displayplacerthrough the app flow when the dependency is missing
- Download the latest
DMGfrom GitHub Releases - Drag
LayoutRecall.appinto/Applications - Launch the app and save a baseline layout from the menu bar
brew install --cask aroido/layoutrecall/layoutrecallIf displayplacer is missing, LayoutRecall can guide installation from the app flow. You can evaluate the UI and save a baseline profile first, then enable actual restore commands once the dependency is available.
- macOS 14 or later
- Apple Silicon is currently the primary tested target
displayplaceris required for actual restore commands
LayoutRecall can build and run tests without displayplacer, but restoring a saved layout depends on it being available on PATH.
The app runs without it, but actual layout restore requires displayplacer to be available. LayoutRecall surfaces missing dependency state and can guide the install flow.
No. It only auto-restores when the saved profile match is strong enough. Lower-confidence cases stay manual on purpose.
Not as a fully automatic promise yet. More complex layouts remain manual/review-heavy until the app can expose a predictable repositioning model.
git clone https://github.com/aroido/layoutrecall.git
cd layoutrecall
make build
make testUseful commands:
make run
./scripts/run-ai-verify --mode fullThe repository uses a scratch build path in ~/Library/Caches to avoid Swift index-store rename failures on slower or externally mounted volumes.
Open Package.swift in Xcode if you want an IDE workflow.
Sources/LayoutRecallApp: SwiftUI menu bar application shellSources/LayoutRecallKit: matching, persistence, restore execution, localization, and diagnostics logicTests/LayoutRecallAppTests: app-level state, UI harness, and end-to-end coverageTests/LayoutRecallKitTests: matcher, localization, restore, and persistence coveragedocs/PRD.md: product summarydocs/SPEC.md: detailed current behavior, architecture, and 2.0 priorities
Tagged releases are published through GitHub Actions.
Relevant pieces:
./scripts/release-preflight.sh <tag>validates version and required secrets./scripts/build-release-archivebuilds signed and notarizedZIPandDMGartifacts.github/workflows/release.ymlpublishes release assets and syncs the Homebrew tap
Example local release build:
VERSION=<version> BUILD_NUMBER=$(date +%Y%m%d%H%M%S) ./scripts/build-release-archiveThe app checks GitHub Releases for aroido/layoutrecall. Automatic update checks can be controlled from App > Updates.
Issues and pull requests are welcome. If you are changing restore behavior, matching logic, localization, release packaging, or repo-visible marketing surfaces, run:
./scripts/run-ai-verify --mode fullMIT. See LICENSE.



