← Home / Imperator MenuBarFolders

Imperator MenuBarFolders

Each folder gets its own menu bar icon. Click it and a popover drops down with the apps inside.

LiveMIT Licensev1.0.0Updated 2026-09-15

README.md

// Overview

Group your apps into folders that live in the macOS menu bar. Each folder is its own menu bar icon; click it and a popover drops down with the apps inside.

// Requirements

Requires macOS 14 or later, Apple silicon. Built and tested on macOS 26 only — older versions are expected to work but have not been verified.

Install at your own risk. The app is not notarized and carries no Apple Developer signature, so macOS cannot vouch for it. It is provided as is, with no warranty, under the MIT license.

// Install

Download the latest zip from Releases, unzip, and move Imperator MenuBarFolders.app to /Applications.

The app is signed with a self-signed certificate and is not notarized, so Gatekeeper blocks the first launch. Right-click the app and choose Open, or clear the quarantine flag:

xattr -dr com.apple.quarantine "/Applications/Imperator MenuBarFolders.app"

There is no Dock icon. The app lives in the menu bar. On first launch it has no folders yet, so the settings window opens on its own.

// Permissions

None. The app requests no Accessibility, Input Monitoring, or Automation grants, and declares no NSUsage keys. It reads /Applications, /System/Applications, ~/Applications and /Applications/Xcode.app/Contents/Applications to list what is installed, and launches apps through NSWorkspace.

The one system integration is Open at Login, the toggle in the popover footer and in the settings window sidebar. It calls SMAppService.mainApp.register(), which adds the app to Login Items in System Settings. Turning the toggle off unregisters it.

// Use

Each folder you create becomes its own icon in the menu bar. Click an icon and a popover drops down with that folder's apps; click an app to launch it. Clicking the same icon again closes the popover, as does Escape or a click in another app. The popover footer holds the Open at Login toggle on the left, and Settings, About and Quit on the right.

The settings window is where folders are built:

ControlWhat it does
Sidebar +Create a folder
Folder iconOpen the icon picker — 138 Lucide icons, searchable, or paste your own SVG
Name fieldRename the folder; the name is also the menu bar icon's tooltip
Columns stepper2 to 6 apps per row in the popover
Add AppsPick from everything installed; apps marked Menu bar app declare LSUIElement
Double-click an appGive it a custom label
DragReorder folders in the sidebar, or apps within a folder

The popover sizes itself from the app count and the column setting, so a folder with three apps does not open a window built for twelve.

Deleting the last folder reopens the settings window — with no folders there are no menu bar icons, and with no Dock icon there would be no way back in.

Folders are stored as one JSON file:

~/Library/Application Support/MenuBarFolders/folders.json

// Build from source

make install

Builds release, bundles, codesigns, installs to /Applications, and launches. Other targets:

make run
make clean

Signing uses the self-signed Imperator Dev identity by default. It has to be a stable identity rather than ad-hoc: the login item registration is keyed to the bundle's designated requirement, and ad-hoc signing mints a new hash on every build, so each update would look like a different app and drop the registration. Override it if you do not care:

make build CODESIGN_IDENTITY=-

// Release

Build a zip without touching git or the remote:

make dist VERSION=1.0.0

Cut a full release — bumps Info.plist, commits, tags v1.0.0, pushes, and publishes a GitHub release with the zip attached:

make release VERSION=1.0.0

Requires the GitHub CLI (brew install gh, then gh auth login). The working tree must be clean. Tags are plain semver (v1.0.0); the release title carries the app name. CFBundleVersion is set from git rev-list --count HEAD and is never edited by hand.

// Implementation notes

A SwiftPM executable with no dependencies. LSUIElement is true, so there is no Dock icon; the status items are the entire interface. MenuBarManager keys each status item's click back to its folder UUID with objc_setAssociatedObject, because NSStatusBarButton carries no user data of its own.

Because SwiftPM does not compile asset catalogs, menu bar icons cannot ship as image assets. They are stored as SVG element strings, parsed at runtime, and rendered into template NSImages so macOS tints them for light and dark menu bars.

AppDiscovery lists apps with the string-based contentsOfDirectory(atPath:) and then resolves symlinks, because on macOS Sequoia and later some system apps are Cryptex symlinks that the URL-based API skips.

// Third-party

Icon path data is derived from Lucide, used under the ISC license. Portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT); all other copyright is held by Lucide Contributors 2022.