One icon, many widgets
Bucket pages, trackpad swipe, a pinned row, and ⌘F search — all behind a single menu bar icon.
Your menu bar, finally organized.
BarShelf collects your scattered menu bar tools — OTP codes, LLM usage, recent files, CI status — into one icon, one popover of native widgets. Any command-line tool you already have becomes a widget in minutes. No new SDK to learn.
Why BarShelf
Your most-checked tools are scattered across a dozen menu bar icons, terminal windows, and browser tabs. BarShelf brings them together.
Bucket pages, trackpad swipe, a pinned row, and ⌘F search — all behind a single menu bar icon.
aas usage --json, otpeek, gh, kubectl… pipe any command straight into a widget.
SwiftUI rendering, dark mode, SF Symbols, and vibrancy. No Electron, no embedded browser.
A declarative exec manifest, a JSON workflow DSL, or a full script — same widget model.
One widget model
Every widget shares the same scheduler, permission frame, and native renderer. Layers differ only in where the data comes from.
A manifest points at a CLI. The output is either a direct UINode view tree, or raw data plus a built-in adapter.
A declarative DSL: sources → transforms → view. ${…} interpolation, forEach, fs.directory with QuickLook thumbnails and drag-out. No code.
A resident Deno subprocess over JSON-RPC with the mb.* TS SDK. Host-mediated exec, storage, secrets, and timers.
Third-party widget code never runs in the app process — process isolation is the trust boundary.
Bundled widgets
BarShelf ships with working widgets that double as templates — from a one-line shell script to a full Deno program.
| Widget | Layer | What it shows |
|---|---|---|
| hello | exec · viewtree | The smallest widget — a shell script emitting a UINode tree. |
| aas Usage | exec · adapter | LLM account usage meters from aas usage --json. |
| OTPeek | exec · adapter | TOTP codes with a countdown ring; Keychain-injected vault password. |
| Recent Files | workflow · fs.directory | Stashbar-style recent files with QuickLook thumbnails and drag-out. |
| Script Clock | script · Deno | Live clock plus a storage-backed click counter via the TypeScript SDK. |
Install
Pick whichever you prefer. Every path installs the same signed, notarized app.
Grab the arm64 zip from Releases, move BarShelf.app to /Applications, and double-click. It's Developer ID signed and Apple-notarized — no Gatekeeper dance.
Install from this project's cask tap:
# add the tap once brew tap Open330/barshelf \ https://github.com/Open330/barshelf brew install --cask Open330/barshelf/barshelf
mbkThe bundled CLI scaffolds, validates, packs, and installs widgets:
mbk new my-widget --kind workflow
mbk validate ./my-widget
mbk install https://github.com/Open330/aas
brew install deno);
exec and workflow widgets work without it.