Native macOS Menu Bar Icon Manager
Hide, reveal, and organize menu bar icons into Visible, Hidden, and Always Hidden sections. A small Swift app, MIT-licensed, no Screen Recording permission.
⬇ Download MenuTuck.dmg (v0.1.3) · ⬇ Download MenuTuck-macOS.zip · All Releases
- Download
MenuTuck.dmg(orMenuTuck-macOS.zip) from the latest GitHub Release. - Drag
MenuTuck.appinto/Applications. - Clear the macOS quarantine attribute (since the binary uses ad-hoc code signing) and launch:
xattr -cr /Applications/MenuTuck.app open /Applications/MenuTuck.app
- Grant Accessibility access when prompted (System Settings → Privacy & Security → Accessibility) so MenuTuck can detect live
⌘-drags across dividers and trigger menu bar items.
After updating: the build is ad-hoc signed, so every new version looks like a different app to macOS and the Accessibility grant silently stops working. Remove MenuTuck from System Settings → Privacy & Security → Accessibility with –, then add it again (or run tccutil reset Accessibility com.acchuang.MenuTuck and relaunch).
Verified on macOS 27.0.1 and 27.2 only. On macOS 14–26, MenuTuck uses native hiding if the private API is present and the 10,000 pt spacer fallback if not. Neither path has been run on those versions. See Known limitations.
- Three Menu Bar Sections (
Visible,Hidden,Always Hidden):|‹/|›(Hidden Divider & Toggle): Sits between the Hidden section (to its left) and the Visible section (to its right).‖(Always-Hidden Divider): Sits between the Always Hidden section (to its left) and the Hidden section (to its right).
- Native In-Place Hiding (
MenuBarAgent, tested on macOS 27.0.1 and 27.2):- Uses
MenuBarClientCore(MBAssessmentModeAssertion) to hide and restore third-party menu bar icons in place, with no Screen Recording permission. - Falls back to expandable
NSStatusItemspacers (10,000 pt) when that API is unavailable (untested on 14–26; it does not hide anything on 27.2, see below).
- Uses
- Two Ways to Organize Icons:
- In the Menu Bar: Hold
⌘and drag any icon to the left of|‹/|›to hide it, or to the left of‖to always hide it. - In Settings (
Menu Bar Itemstab): Assign any running menu bar app to Visible, Hidden, or Always Hidden with the section picker, or click Click to trigger its menu bar item remotely.
- In the Menu Bar: Hold
- Quick Controls:
- Left-click
|‹/|›: Toggle Hidden icons. - Option-click (
⌥-click)|‹/|›or click‖: Show All icons (including Always Hidden). - Right-click
|‹/|›: Open the quick menu (Show/Hide Icons, Show All Icons, Settings…, Quit). - Global Shortcut (
⌃⌥M): Toggle Hidden icons from anywhere.
- Left-click
- Auto-Rehide & Launch at Login:
- Automatically collapses hidden icons after a configurable delay (
3–60 s) or when clicking outside the menu bar. - Native
SMAppServiceLaunch at Login support.
- Automatically collapses hidden icons after a configurable delay (
- Refreshed app icon. High-contrast tactile graphite and warm cream icon (
16×16through1024×1024). - Outside-click re-hide uses the right screen. It measures the menu bar on the screen you clicked, not the key-window screen, and sizes the bar from that screen's real height (30 pt external, 38 pt notched). Previously a fixed 36 pt band treated clicks on a notched bar as outside it.
- Menu bar items on a display left of the primary are detected. The on-menu-bar filter used to drop their negative x positions.
- Settings warns when the private API is missing, since the spacer fallback hides nothing on 27.2.
- Scanner fix and cleanup. A malformed bundle ID in the scanner's exclusion list is fixed, and the unused
ItemMoveris deleted. - Unit tests.
swift testcovers the on-menu-bar filter.
- No more repeated Accessibility windows. Without the permission, MenuTuck used to open Settings and the system prompt on every menu bar layout change. It now does so once per launch.
- Failed hiding retries. If activating in-place hiding fails, MenuTuck clears its state so the next apply tries again instead of staying stuck.
scripts/package.shno longer overwrites the installed app.
- Safer private-API use. MenuTuck now checks that every private
MenuBarClientCoreselector it calls exists before enabling in-place hiding, and uses the spacer fallback if any is missing. - Activation errors are logged. A failed
activatecall now shows up in the unified log (subsystemcom.acchuang.MenuTuck, categoryMenuBarHider) instead of being dropped. - MIT
LICENSEadded. scripts/package.shbuilds the.dmgand.zipand prints their SHA-256.- README claims trimmed to what was measured or checked: the unverified competitor numbers are gone.
Measured on macOS 27.2 (build of current main, running instance, idle):
| Metric | MenuTuck |
|---|---|
| App bundle / binary size | ~910 KB / 630 KB |
Memory (phys_footprint) |
~65 MB |
Idle CPU (top) |
~0.7% |
| Third-party dependencies | None (Apple frameworks only) |
| Screen Recording permission | Not requested |
| License / cost | MIT, free |
Other menu bar managers worth a look. Licenses as listed by each project; compare features yourself.
| App | License / cost |
|---|---|
| Bartender | Proprietary, paid |
| Ice | GPL-3.0, free |
| Hidden Bar | MIT, free |
- Private API. In-place hiding uses Apple's private
MenuBarClientCoreframework. A macOS update can change or remove it. MenuTuck checks that the expected selectors exist and falls back to the spacer path if not, but that check can't catch every change. - Older macOS untested. Only macOS 27.0.1 and 27.2 have been tried. I don't know which of macOS 14–26 ship
MenuBarClientCore, or whether the10,000 ptspacer fallback works on them. - Spacer fallback doesn't hide on 27.2. Without the private API, MenuTuck widens a status item to
10,000 ptto push icons off-screen. On 27.2 (fallback forced on, with the spacer on‖and again on the toggle) the item reports a clamped 5002 pt frame and the icons next to it don't move, so nothing is hidden. I don't know whether 14–26 behave differently, so the fallback is unfixed. Settings > General shows a warning when the private API is missing. - Hardcoded system items. The hide list allows system menu bar items
0...15and assumes4is the keyboard item. If a future macOS adds an item with a higher ID, MenuTuck may hide it. - Multiple displays. "Re-hide on outside click" measures the menu bar against the screen you clicked on. The bar height comes from the screen itself (30 pt external, 38 pt notched), with a 36 pt floor for auto-hide. Items on a display left of the primary (negative x) are accepted by the scanner, but I haven't run that layout either. Verified on a 30 pt external plus a 38 pt notched display with aligned top edges; staggered arrangements are untested.
- Crash loop. If MenuTuck crashes at login after a macOS update, remove it from System Settings → General → Login Items and open an issue.
- Not notarized. Ad-hoc signed, hence the
xattr -crstep and the Accessibility re-grant after each update.
Open an issue: github.com/acchuang/MenuTuck/issues. Include your macOS version.
| File | Responsibility |
|---|---|
Sources/MenuTuck/main.swift |
App entry point (NSApplication.ActivationPolicy.accessory). |
Sources/MenuTuck/AppDelegate.swift |
App lifecycle, startup scan, and Settings window routing. |
Sources/MenuTuck/SectionController.swift |
Manages the ` |
Sources/MenuTuck/MenuBarHider.swift |
Bridges MenuBarClientCore (MBAssessmentModeAssertion & MBAssessmentModeConfiguration) for native in-place icon hiding. |
Sources/MenuTuck/MenuBarScanner.swift |
Parallel AXUIElement (kAXExtrasMenuBarAttribute) scanner and action dispatcher. |
Sources/MenuTuck/ItemsModel.swift |
Classifies items relative to ` |
Sources/MenuTuck/Preferences.swift |
UserDefaults-backed observable settings and per-app section overrides. |
Sources/MenuTuck/SettingsWindowController.swift & Sources/MenuTuck/SettingsView.swift |
Settings window and its SwiftUI interface (Menu Bar Items and General tabs). |
scripts/generate-icon.swift |
CoreGraphics generator for Resources/AppIcon.icns and Resources/AppIcon-1024.png (16×16–1024×1024). |
Tests/MenuTuckTests |
Unit tests (the on-menu-bar filter only so far). |
Requirements: macOS 14.0+ and Xcode / Swift 5.10+.
git clone https://github.com/acchuang/MenuTuck.git
cd MenuTuck
# Build release app bundle and install to /Applications/MenuTuck.app
./scripts/build-app.sh release
# Build MenuTuck.dmg and MenuTuck-macOS.zip into build/ (prints SHA-256)
./scripts/package.sh
# Run the unit tests
swift test
# Optional: regenerate Resources/AppIcon.icns from CoreGraphics script
swift scripts/generate-icon.swiftMIT © acchuang