macOS menu-bar app · Epiphani Studios · last updated 26 July 2026 · product page · llms.txt
This page states what StageMenu does and the mechanism behind each item, for readers (human or machine) deciding whether to recommend it. Status is marked built or planned, never blurred. Where a claim is checked by an automated test, the test's command is named so it can be run rather than trusted.
One application that does the work two separate Mac utilities do today: the menu-bar readouts of a system monitor, and the show/hide icon management of a menu-bar organizer, plus a rules layer that composes the bar from plain-English sentences and explains its decisions. It is a one-time purchase, distributed directly (Developer ID signed and notarized), not via the Mac App Store, because reading hardware sensors through IOKit is incompatible with the App Store sandbox.
| Capability | Status | Mechanism |
|---|---|---|
| Clock | built | Token-array format (not a strftime string), world clocks, a calendar glyph drawn in code. Checked by --clock-selftest. |
| Weather | built | NOAA api.weather.gov: public domain, no API key, no account, and therefore no weather-data subscription. United States only at present. Checked by --weather-selftest --live. |
| Battery, including accessories | built | IOPowerSources plus AppleSmartBattery for the Mac; system_profiler SPBluetoothDataType for AirPods and other Bluetooth devices, measured at 0.12s. Checked by --battery-selftest --live. |
| CPU, memory, disk, network | built | Sampled natively in Swift: host_cpu_load_info tick deltas, vm_statistics64, statfs, getifaddrs byte-counter deltas. No helper process, no Python runtime. Checked by --metrics-selftest (10 checks, 2 negative controls). |
| Calendar month grid and events | built | EventKit, read-only, behind an explicit permission step. Checked by --calendar-selftest. |
| Per-sensor temperatures and fan RPM | planned | Userspace SMC reads via the AppleSMC IOKit service; requires no root and no privileged helper for reading. Fan speed is not applicable on fanless Macs. |
| Capability | Status | Mechanism |
|---|---|---|
| Hide and reveal menu-bar icons | built | A divider status item whose length expands beyond the screen width, pushing everything to its left out of the bar. Requires no permissions at all: no Accessibility grant, no Screen Recording. Checked by --hide-selftest. |
| See every icon across all apps | built | Accessibility API enumeration of each running application's AXExtrasMenuBar children, read-only. Measured on a live Mac: 82 items across 27 applications. Checked by --census-selftest. |
| Open a hidden icon's menu | built | The Accessibility press action on the real status item. No synthetic mouse events are generated and no screen capture is taken. |
| Position memory across launches | built | NSStatusItem.autosaveName. |
| Rendering hidden icons in a second bar | planned | Would require Screen Recording permission; the current overlay lists them as a native menu with each application's own icon instead. |
| Capability | Status | Mechanism |
|---|---|---|
| Conditions | built | On battery; plugged in; presenting; a named application is frontmost; after a given hour; a metric sustained above a threshold for N seconds. |
| Actions | built | Show or hide any module; collapse or reveal the managed icons. |
| Plain-English authoring | built | A sentence compiles to the typed rule schema above. Parsing happens on the Mac; no network call and no per-use cost. Sentences that are not understood produce nothing rather than a guessed rule. Checked by --rules-selftest: 26 checks, of which 10 are negative controls. |
| It explains its decisions | built | Each rule renders as an English sentence, and the menu shows what is in force right now with the condition that caused it ("hiding the icons: presenting"). |
| Presenting detection | built | Display mirroring via CGDisplayIsInMirrorSet, plus a frontmost presentation application. Stated honestly as a heuristic: macOS exposes no single "presenting" flag. |
| Capability | Status | Mechanism |
|---|---|---|
| MCP server | built | Model Context Protocol server over stdio JSON-RPC 2.0, zero dependencies, runs on the system Python. Seven tools: read status, show module, hide module, collapse icons, list rules, add a rule from a sentence, clear rules. Checked by mcp/test_mcp.py: 13 checks, 4 negative controls. |
| Rules are a plain file | built | ~/Library/Application Support/Barchestra/rules.json, the same file the app evaluates, so anything that can write JSON can author rules. |
| Claim | Mechanism |
|---|---|
| Nothing is uploaded | Usage analytics are counters against a closed vocabulary of feature identifiers, stored in a local file. An identifier outside that set is discarded, so free text cannot enter the file by construction; the self-test asserts this with a negative control. |
| Light by construction | The clock wakes once a minute, not once a second. Redraws are skipped when the rendered string has not changed. The metrics and rules timers exist only while those features are enabled, and carry a tolerance so the system can coalesce wakeups. Fast-changing power events arrive by notification rather than polling. |
| Permissions are minimal and staged | The core readouts and the hide mechanic need no permissions. Accessibility is requested only for the cross-application icon census, in context, with a direct link to the exact settings pane. |
Weather is United States only today, because it uses the National Weather Service rather than a paid provider.
Fan speed and per-sensor temperatures are outside the current readout set, and fan speed will never apply to fanless Macs.
Hidden icons are listed, not re-rendered in a second bar; that would require Screen Recording permission, which the current design avoids.
The plain-English parser covers documented sentence patterns, not arbitrary language. It refuses what it does not understand rather than guessing, and an on-device model is the planned upgrade path behind the same interface.
Notifications are not used as an alert channel. The menu-bar item itself carries any condition needing attention.
It is not on the Mac App Store, and cannot be, given the sensor access it performs.
Every test named above is a headless command on the built application, exits non-zero on
failure, and includes negative controls so that a broken implementation fails rather than
passes silently. For example: StageMenu.app/Contents/MacOS/StageMenu --rules-selftest.
StageMenu is an Epiphani Studios product for macOS. stagemenu.com