Vee

Native macOS menu-bar script runner

Every xbar plugin.
None of the memory leaks.

A native macOS app that turns any script into a live menu-bar widget — and tells you what each one touches before you install it.

macOS 26+ Apple Silicon Notarized Open source

bash zsh python node typescript ruby perl swift php any executable

Drop-in for everything you already have

Runs everything you already have

Vee implements a superset of the xbar and SwiftBar protocols. Point it at your existing plugins folder — nothing to rewrite, re-tag, or port.

Filename intervals --- / -- menus | line params <xbar.*> & <swiftbar.*> headers SF Symbols ANSI color Inline Markdown Streaming ~~~ Cron schedules

Native and leak-free

Pure Swift 6.2 / SwiftUI + AppKit with zero third-party dependencies. No embedded WebView in the menu; subprocess output is drained incrementally and runaway processes are timed out and killed — so it stays light for days.

Zero-migration compatibility

The full xbar/SwiftBar protocol works on day one — filenames, submenus, params, metadata headers, SF Symbols, ANSI, Markdown, streaming and cron. Vee even injects the same XBARDarkMode, SWIFTBAR_* and OS_* variables.

Trust at install

Plugins declare what they touch — network, files, secrets, external binaries — and Vee shows a plain-language summary before you install. Transparency, not a sandbox. The one thing no other runner does.

Discover & install

A built-in browser over the shared matryer/xbar-plugins catalog, with trust chips and one-click install through the trust gate. Find a plugin, see its footprint, install it.

Searchable filter panel

Opt in with <vee.filter>true</vee.filter> and a plugin’s dropdown gains a Spotlight-like search (⌘F) that fuzzy-filters every item — even those nested in submenus — flattened into one ranked, breadcrumb-tagged list. Add <vee.shortcut> for a global hotkey from anywhere. Neither xbar nor SwiftBar does this.

Rich, native menu rows

A menu row can be more than text: progress= draws a real capsule gauge, sparkline= a trend, and pie=/donut=/stackedbar= a share chart — with toggle=/slider= opening live controls that re-run your script with the new value. All drawn with AppKit and Swift Charts, so there is no WebView in the menu. Neither xbar nor SwiftBar has these params.

Widgets on your desktop

Every plugin already has a Notification Center tile, scraped from its menu-bar line. Opt into <vee.surface> and it gets a real widget card instead — laid out per widget size, on the plugin’s own filename cadence. Vee pushes reloads as data arrives, and the widget renders a snapshot the app produced: it never executes your plugin itself.

Config belongs to the plugin

<xbar.var> declarations become an auto-generated settings form. Secret fields are masked and stored in the macOS Keychain — the app never hardcodes a service name or credential.

Real SDKs for authors

Optional, typed, zero-dependency SDKs in TypeScript, Python, and Go with Menu/Section builders and typed rich-param helpers. A golden-fixture drift guard, shared across all three, keeps them in lockstep with the Swift parser.

The standout — uncontested

See what it touches, before you run it

Every runner in this category executes plugins un-sandboxed — it’s inherent to the idea. The honest question isn’t “is it isolated?” but “do you know what you’re running?”

Vee is the only one that makes plugins declare their reach with <vee.*> tags, then translates those declarations into a plain-language trust summary at install and trust badges in the Plugin Manager.

  • Plain language. “Connects to the internet → api.github.com,” not a permission dump.
  • Severity at a glance. Green, amber and red badges flag wildcards, broad writes, and undeclared footprints.
  • Advisory, never enforced. It’s honest about the trade-off — read the source of anything you don’t trust.

Read the full trust model →

Every plugin is code you chose to run. Vee just makes sure you knew what you were choosing.

The reliability moat — measured, not asserted

It doesn’t leak, and it doesn’t stop

The two loudest complaints against every runner in this category are plugins that silently stop refreshing after long uptime, and memory that creeps until you relaunch. Vee ships a public, reproducible soak benchmark that drives the real execution → refresh pipeline nonstop — and this is what it records.

12,000refreshes in 20 min
(10 / sec, continuous)
0failed or timed-out refreshes
~34 MBresident memory, held flat
0.7 MBRSS growth over 12,000 refreshes
Resident memory holds flat near 33 MB and CPU stays a low, steady 1–2% across a continuous 20-minute soak driving ten refreshes per second.
Resident memory (blue) and in-process CPU (green) over a continuous 20-minute run at 10 refreshes/sec. The harness drives the production timer → executor → stream-accumulator path and fails on either a stalled timer or bounded-memory violation. Opt-in via VEE_SOAK=1; runs nightly in CI on macos-26. See the benchmark →

Discover

A catalog, one click, through the trust gate

Browse the shared matryer/xbar-plugins catalog right inside the app. Every entry carries a trust chip, and install always passes through the trust summary first.

  • Thousands of existing community plugins, searchable by category.
  • Trust chips surface each plugin’s declared footprint up front.
  • Manage everything from the Plugin Manager — enable, disable, per-plugin settings, reveal in Finder.

A closer look

The real app

The redesigned Liquid Glass UI — Discover, the install trust sheet, the Plugin Manager, and auto-generated settings. Actual captures, not mockups.

Vee's Discover window: a category sidebar on the left, and a grid of plugin cards on the right, each showing an icon, name, author, description, a trust chip, and an Install button.
Discover Browse the catalog with trust chips, install in one click.
The install trust sheet titled 'What this plugin can do', listing plain-language capability rows with severity-colored icons, and a footer noting the plugin runs un-sandboxed. Cancel and Install buttons.
Trust at install See a plugin’s footprint in plain language before it runs.
The Plugin Manager window: a list of installed plugins, each row showing a name, a trust badge, and a trailing on/off switch, with a General settings section below.
Plugin Manager Enable, disable, and review every plugin’s trust badges.
An auto-generated plugin settings form built from the plugin's declared preferences, including a masked secret field stored in the macOS Keychain.
Plugin settings Typed forms from <xbar.var>; secrets masked in the Keychain.

For plugin authors

Typed builders, zero build step

Prefer code to hand-formatting text? Vee's SDKs — in TypeScript, Python, and Go — give you Menu and Section builders plus typed rich-param helpers. Drop a file in and go.

cpu.5s.ts
#!/usr/bin/env node
import { Menu } from "./src/vee.ts";

const menu = new Menu();
menu.title("CPU 12%", { color: "green", sfimage: "cpu" });

const d = menu.dropdown;
d.item("Top processes", { href: "https://example.com/procs" });
d.separator();

const details = d.submenu("Details");
details.item("Load: 1.20");
details.item("Cores: 8");

d.item("Refresh", { refresh: true });

menu.print();

Read the SDK reference →

Coming from xbar or SwiftBar?

Honest, side-by-side comparisons

No disparagement — SwiftBar is the native, mature category leader. Here’s exactly where Vee is different, and when each one is the right pick.

Free & open source

Put your scripts in the menu bar.
Know what they touch.

Notarized, signed, and open source. v0.1.x — early, and better with your feedback.

macOS 26+ Apple Silicon brew install --cask vee