BarShelf app icon: a cream-colored shelf beneath two mint-green sparkles on a deep teal background.

Your menu bar, finally organized.

One menu bar icon.
Every tool you check.

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.

  • macOS 13+ · Apple Silicon
  • Developer ID notarized
  • Zero runtime dependencies
  • 161 tests
  • MIT licensed

Why BarShelf

Native widgets, driven by the tools you already run

Your most-checked tools are scattered across a dozen menu bar icons, terminal windows, and browser tabs. BarShelf brings them together.

One icon, many widgets

Bucket pages, trackpad swipe, a pinned row, and ⌘F search — all behind a single menu bar icon.

CLI is the API

aas usage --json, otpeek, gh, kubectl… pipe any command straight into a widget.

Native, not web

SwiftUI rendering, dark mode, SF Symbols, and vibrancy. No Electron, no embedded browser.

Three ways to build

A declarative exec manifest, a JSON workflow DSL, or a full script — same widget model.

One widget model

Three execution layers

Every widget shares the same scheduler, permission frame, and native renderer. Layers differ only in where the data comes from.

exec

Declare a command

A manifest points at a CLI. The output is either a direct UINode view tree, or raw data plus a built-in adapter.

CLI → UINode view tree
workflow

Compose in JSON

A declarative DSL: sources → transforms → view. ${…} interpolation, forEach, fs.directory with QuickLook thumbnails and drag-out. No code.

sources → transform → view
script

Write TypeScript

A resident Deno subprocess over JSON-RPC with the mb.* TS SDK. Host-mediated exec, storage, secrets, and timers.

Deno ⇄ JSON-RPC ⇄ host

Third-party widget code never runs in the app process — process isolation is the trust boundary.

Bundled widgets

Five examples, one per pattern

BarShelf ships with working widgets that double as templates — from a one-line shell script to a full Deno program.

Bundled with every BarShelf install.
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

Up and running in a minute

Pick whichever you prefer. Every path installs the same signed, notarized app.

Release zip

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.

Download the latest release →

Homebrew

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

Build & scaffold with mbk

The 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
Requirements: macOS 13+ (Ventura) on Apple Silicon. Script widgets need Deno (brew install deno); exec and workflow widgets work without it.