Recover the menu bar items your MacBook notch swallowed.
When status items overflow into the notch — or get parked off-screen by a menu bar manager — macOS just stops showing them, with no hint they exist. NotchTray finds those hidden items and presents them in a Dynamic Island-style panel that drops down from under the notch. Click an entry to activate the real status item.
Download the latest NotchTray-<version>.dmg from
Releases, open it and
drag NotchTray into Applications. The app is signed with a Developer ID and
notarized by Apple, so it opens without a Gatekeeper warning.
On first launch it asks for Accessibility access, which it needs to read and activate menu bar items. Screen Recording is optional and only used to draw each item's real icon instead of its app icon.
Requires macOS 14 or later on a MacBook with a notch (Apple Silicon).
NotchTray updates itself through Sparkle. Two tracks are available in Settings → Updates:
| Channel | What you get |
|---|---|
| Stable | Released versions only. |
| Beta | Prereleases as well — earlier features, rougher edges. |
Both tracks share one feed; beta subscribers also receive stable releases, so switching back never strands you on a prerelease.
- Notch geometry comes from
NSScreen.auxiliaryTopLeftArea/auxiliaryTopRightArea— the exact pixel band covered by the hardware notch. - Item discovery uses the Accessibility API. On macOS 26 all status items are rendered by the Control Center process, so the classic
CGWindowListCopyWindowInfoattribution (owner PID per item window) no longer works. Each app still exposes its items through theAXExtrasMenuBarAX attribute with global position and size, which keeps per-app attribution intact. - An item is hidden when its frame intersects the notch band or lies outside the visible right-hand menu bar region.
- Activation performs
AXPresson the item's AX element, which opens its menu even while the item itself is occluded.
- Hover the notch with the cursor to expand the island; move away to close it.
- Left-click the NotchTray status icon or press ⌃⌥N to toggle it manually.
- The island shows hidden items as their real menu bar icons (with Screen Recording permission) and includes a settings gear and a quit switch.
- The status icon shows a count badge while items are hidden.
- Settings: launch at login, hover behavior, auto-close delay, permission status (right-click the status icon → Settings…).
- Requires Accessibility access (System Settings → Privacy & Security → Accessibility). The app prompts on first launch.
Pure SwiftPM — no Xcode project.
swift build # compile
./Scripts/compile_and_run.sh # package NotchTray.app (ad-hoc signed) + launch
./Scripts/package_app.sh release # package onlyNote: with ad-hoc signing the code signature changes on every rebuild, so macOS drops the Accessibility grant each time. For iterative development, create a stable self-signed identity and pass it via
APP_IDENTITY.
The island's edit mode (pencil) can move items across an invisible separator status item; expanding the separator's length pushes everything left of it off-screen. Moves are performed with a synthetic ⌘-drag — the automated version of the gesture users perform by hand, since macOS has no API for repositioning other apps' items. Two behaviors follow from the mechanism:
- Newly launched apps insert their status items at the far left, i.e. into the hidden section. They show up in the island rather than the bar.
- Restoring an item on a completely full menu bar can only bring it back as far as physics allow; the leftmost item may sit behind the notch, where the island still shows and activates it.
- Built-in display only; external-display menu bars are not scanned.
- Items are listed, not visually reordered — macOS offers no public API to move other apps' status items (managers like Ice simulate ⌘-drags).
- Menu bar managers that park items off-screen (Ice, Bartender) make those items appear in NotchTray's "hidden" list as well; that is by design.
NOTCHTRAY_SIGN_IDENTITY="Developer ID Application: … (TEAMID)" \
./Scripts/package_dmg.sh # build, sign, styled DMG -> dist/
NOTCHTRAY_NOTARY_ENABLED=true \
NOTCHTRAY_NOTARY_KEYCHAIN_PROFILE=notchtray-notary \
./Scripts/notarize_release.sh # notarize + staplePushing a v* tag runs the same pipeline on CI and publishes the release.
See .github/workflows/release.yml for the required repository secrets.
MIT — see LICENSE.