
Free macOS menu bar app
RunBar
Project scripts and dev servers, one click from the menu bar
Run bun, npm, yarn, or pnpm scripts and custom commands from the menu bar — with Kill & Retry when ports collide.
v1.0.33 · 15.2 MB · macOS · Apple silicon · free for personal and public use
What it does
Project commands in one click
- Auto-detect package managers (default bun)
- Pin shortcuts for start, stop, restart
- Live port awareness and conflict recovery
Install
Get RunBar running in under a minute
Terminal install · RunBar
After downloading the zip
Ad-hoc signed apps are not Apple-notarized. Paste these commands if Gatekeeper blocks launch — same flow across all tools.
1. Unzip into Applications
unzip -o "$HOME/Downloads/RunBar-1.0.33-macos-arm64.zip" -d /Applications/2. Remove Gatekeeper quarantine (if macOS blocks launch)
xattr -dr com.apple.quarantine "/Applications/RunBar.app"3. Open RunBar
open -a "RunBar"
Version history
RunBar release notes
Every published version, newest first.
v1.0.33
Current10 Oct 2026Fixed
- A moved project folder showed as “1” on the menu-bar icon — with nothing running, the number counted every project needing attention, and a saved project whose folder had been renamed or deleted counts as one. It looked exactly like “1 running” while no project ran and Active Ports was empty. With nothing running, the number now only counts failures the icon also colours (a failed run, a port conflict).
- A missing folder now says so in the menu — the project shows ⚠ instead of ○, and its submenu reads “Folder missing” instead of “No package.json”. Remove it and add the folder from its new place.
v1.0.32
9 Oct 2026Fixed
- Update notice never seen — When the background check finds a new version, the “Update available” dialog (Install & restart… / Not now) now opens by itself, in front of other windows, once per version. Until now it only posted a notification, which macOS never showed.
- Notifications never shown — Notifications go through Apple's current API (UNUserNotificationCenter). rumps used the deprecated NSUserNotificationCenter, whose notifications current macOS drops without an error. macOS only shows them for Developer ID signed apps; this ad-hoc build logs the reason to its error log instead.
- Update check failed without Homebrew — Update checks and downloads work on Macs without Homebrew: the bundled OpenSSL only looked for certificates in Homebrew's folder. macOS's own `/etc/ssl/cert.pem` is now trusted as well.
v1.0.31
9 Oct 2026Changed
- Current dependencies — rebuilt with PyInstaller hooks 2026.8. No app changes.
v1.0.30
16 Sep 2026Added
- Several commands per project — a project is no longer limited to one running command. Start `dev`, then `storybook` (or Laravel `serve` next to Vite `dev`) and both run side by side: the project line shows `▶ dev :3000 · storybook :6006`, the submenu lists one entry per run (Stop / Restart / Show Terminal / Open in Browser / Open Logs…) plus Stop All (N), and port conflicts retry per run. Starting a command that is already running restarts only that one, as before. Runs are tracked per (project, label); log files are now named `<project>-<label>-<stamp>.log`, and a stopped project offers Open Last Log….
Changed
- Auto update check every 6 hours (was 12). A failed check — offline right after login, server error — is retried up to 3 times, 10 minutes apart, instead of waiting for the next interval.
- Python 3.10+ for source installs — `install.sh` skips Apple's bundled Python 3.9 and rebuilds a virtualenv that was created with it; the bundled .app is unaffected.
Fixed
- Auto update check ran at launch, twice — rumps timers fire as soon as they start, so the “first check about a minute after launch” happened immediately (often before Wi-Fi was up) and the periodic timer fired once more right behind it. The first check now really waits a minute.
v1.0.29
16 Sep 2026Added
- Start Selected — a submenu where you tick projects and saved commands (checkmarks, remembered in `settings.start_selected`), plus ▶ Start N selected to launch them all at once with each one's default run (default shortcut → Laravel serve → first package.json script → Flutter → static server). Entries already running are skipped and named in the notification; Select All / Clear Selection included.
- Open All Logs — next to Stop All while something runs: opens the log file of every project and command RunBar started, in one `open` call.
- Saved commands — Add Command… saves any shell command that isn’t tied to a project folder (`ngrok http 3000`, `docker compose up`, `ssh -N -L …`) with a label and an optional folder (default: home). Saved commands sit in their own section under the projects, separated by a divider, and behave like a project: Run / Stop / Restart / Show Terminal / Open in Browser / Open Logs… / Edit… / Remove, listen-port badge, port-conflict Kill & Retry, counted in the header and Stop All. Save & Run starts the command as soon as it is saved. Stored in `settings.commands` in state.json.
- Laravel projects — a folder with `artisan` + `composer.json` gets a Laravel submenu: `serve (:8000)` / `serve (:8080)` (`php artisan serve --port=…`), `composer dev` / `composer test` (hand-runnable composer.json `scripts`; `pre-*` / `post-*` hooks are skipped), `queue:work`, `schedule:work` and `migrate`. `serve (:8000)` is the seeded default shortcut and the Run Custom Command / Add Shortcut prefill, ahead of the Vite `dev` script in package.json. `php` / `composer` resolve from the login shell PATH, Homebrew (`/opt/homebrew/opt/php`), Laravel Herd, MAMP and global composer bins. PHP commands always run from the folder that holds `artisan`, even when the only package.json is in `frontend/`. Monorepo split lists Laravel folders as Laravel · artisan, and a Laravel root with `docs/index.html` is no longer mistaken for a static site. Active Ports labels the `php -S … server.php` listener as `laravel`.
Fixed
- PHP built-in server port conflicts — `Failed to listen on 127.0.0.1:8080 (reason: Address already in use)` now badges port 8080 (it used to pick up `127`) and offers Kill & Retry once a pinned `--port` exits. A bare `php artisan serve` is left alone while Laravel itself moves to the next free port; the badge follows the `Server running on [http://127.0.0.1:8001]` line.
- Resolved tool paths with spaces — when RunBar rewrites a custom command's leading tool (`php`, `bun`, …) to its absolute path, the path is shell-quoted, so a Laravel Herd `php` under `~/Library/Application Support/…` runs.
v1.0.27
12 Sep 2026Added
- Auto update check — every 12 hours (first check about a minute after launch). A purple dot on the menu-bar icon plus a notification when a new version is ready; Check for Updates… becomes “Update x.y.z available…”.
v1.0.26
12 Sep 2026Fixed
- Quit stays quit — unload the login item on Quit (same as the other Bars) so a leftover `KeepAlive` agent cannot reopen RunBar. Launch at login still uses the plist at the next login.
v1.0.25
11 Sep 2026Added
- Static site live server — a folder with just `index.html` (no package.json) gets a Static site (live server) submenu: `serve (:5500)`, `:8080`, `:3000`, and a SPA-fallback variant. RunBar serves the files itself (stdlib HTTP server bundled in the app — no npm, no `npx serve`) with no-cache headers and live reload (the page reloads when any file in the folder changes). The listen port is badged, Stop works, and a busy port offers Kill & Retry. Port 5500/5501 are now watched in Active Ports. Monorepo split also detects static sub-folders.
- Monorepo support — Add Project on a folder that holds several projects (`frontend/`, `backend/`, `apps/*`, pnpm/npm/yarn workspaces, Flutter apps) shows a checkbox list and adds each one as its own RunBar project (`repo/frontend`, `repo/backend`), each with its own scripts, running command and port. Existing projects get Split into Sub-projects… in their submenu. `node_modules`, build output and platform folders are skipped.
Fixed
- `nvm use && npm run dev` — “command not found: nvm” — commands now run through your shell (`zsh`/`bash`) with `$NVM_DIR/nvm.sh` sourced (and `fnm env` when installed), so shell-function tools work exactly like in Terminal. The shell is non-interactive, so Stop still terminates the process group.
v1.0.23
27 Aug 2026Changed
- Menu chrome — Settings…, Check for Updates…, Version, then Quit (same order as the other Bars). Quit RunBar is now Quit.
Fixed
- Duplicate menu bar icon after update — do not `launchctl bootstrap` the login item after `open`. That started a second RunBar. The plist stays on disk, so Launch at login still runs at the next login.
v1.0.21
14 Aug 2026Fixed
- Self-update with launch at login — start the installer before parking the LaunchAgent; only replace a bundle that contains `Contents/MacOS/RunBar`; relaunch with `open` instead of launchctl
- Empty RunBar.app after update — `ditto --sequesterRsrc` zips include `MACOSX/RunBar.app`; `find -name RunBar.app -quit` sometimes copied that stub (no real binary). Extract with `ditto -x -k` and skip `MACOSX`
v1.0.20
14 Aug 2026Fixed
- Flutter → run (iOS Simulator) — after booting Simulator, pick the device UDID from `flutter devices --machine` and run `-d <udid>` (Flutter matches name/id only, so literal `-d ios` never selects `iPhone SE …`)
v1.0.19
13 Aug 2026Fixed
- Relaunch after update — open the new `.app` with LaunchServices (retrying on launchd error 111) instead of LaunchAgent bootstrap, which reported success without showing the menu bar icon
v1.0.18
13 Aug 2026Fixed
- Flutter → run (iOS Simulator) — boots `apple_ios_simulator` first, then `flutter run -d ios` (bare `-d ios` fails when Simulator isn’t already running)
v1.0.17
13 Aug 2026Added
- Flutter → run (iOS Simulator) — `flutter run -d ios` (Xcode Simulator) alongside Chrome / macOS / web-server
Changed
- Run Custom Command / Add Shortcut prefill uses Flutter (`flutter run -d chrome`) for Flutter projects, and lockfiles (`bun.lock`, `package-lock.json`, etc.) to pick `bun` / `npm` / `pnpm` / `yarn` instead of always defaulting to `bun run dev`
v1.0.16
13 Aug 2026Fixed
- Update progress window — menu-bar-only (Accessory) apps now briefly become a regular app so the percent panel actually appears
- Relaunch after update — park the LaunchAgent, wait until leftover copies exit, then start exactly one new instance (login item if enabled, otherwise `open`)
v1.0.15
13 Aug 2026Changed
- `install.sh` picks the newest Python 3 from Homebrew or Xcode / CLT (no longer hard-coded to 3.12)
v1.0.14
9 Aug 2026Fixed
- Check for Updates zlib Error -3 — stop using requests/urllib3 for the manifest (and zip) download; stdlib urllib reads the body as-is and only gunzips when the payload actually starts with gzip magic, so a CDN that wrongly sets `Content-Encoding: gzip` no longer fails the update check
v1.0.13
9 Aug 2026Fixed
- Memory growth over long runs — stop refreshing menu/state on every log line; coalesce and trim console `NSTextStorage`; discard terminal sessions on stop/remove (and on hide/close after stop) so footprint no longer climbs into multi‑GB territory
v1.0.12
3 Aug 2026Fixed
- Show Terminal invisible text — live output sometimes drew transparent until selected; append with explicit green attributed strings instead of bare `setString` / system green
v1.0.11
3 Aug 2026Fixed
- Show Terminal typing — menu-bar (Accessory) apps can’t take keyboard focus; RunBar temporarily becomes a regular app while a console is visible so keys reach the process (plus local echo so you see what you type)
v1.0.10
22 Jul 2026Added
- Show / Hide Terminal — each RunBar-owned process gets an interactive console window (live output + keyboard input). Closing or Hide Terminal only hides the window; the process keeps running. Re-open anytime with Show Terminal (Flutter: type `r` / `R` there for hot reload / restart)
Changed
- Removed one-click Flutter Hot Reload / Hot Restart menu items in favor of the interactive terminal
v1.0.9
22 Jul 2026Added
- Flutter Hot Reload / Hot Restart — when a `flutter run` process is owned by RunBar, project menu offers Hot Reload (r) and Hot Restart (R) (processes now run on a PTY so Flutter accepts single-key input)
v1.0.7
21 Jul 2026Fixed
- Check for Updates — avoid zlib “incorrect header check” when a CDN/proxy mislabels responses as gzip; fetch manifest and zip with `Accept-Encoding: identity` and raw (undecoded) bytes
v1.0.6
21 Jul 2026Added
- Open in Browser — from Active Ports and from a running project when a listen port is known
v1.0.5
18 Jul 2026Added
- Flutter projects — detect `pubspec.yaml`, Flutter menu (`run (Chrome)` / macOS / web-server), default shortcut with `-d` so device picking never blocks
- Ignore Dart VM Service / DevTools URLs when detecting listen ports; parse `is being served at http://…` for Flutter web-server
v1.0.4
18 Jul 2026Added
- Check for Updates… — compares against `https://entelxcore.com/downloads/runbar/release-macos.json` and can install the free-tools zip in-place (same flow as AI Usage / UsageBar)
v1.0.3
18 Jul 2026Changed
- Patch release for ENTELXCORE Free Tools
v1.0.2
18 Jul 2026Changed
- Menu bar icon uses outline `terminal` (medium weight) to match CommitBar / UsageBar
- App logo aligned with ENTELXCORE free-tools product mark
v1.0.1
18 Jul 2026Changed
- Patch release published to ENTELXCORE Free Tools as `RunBar-1.0.1-macos-arm64.zip`
v1.0.0
18 Jul 2026Added
- Menu bar app to add projects and run package.json scripts / custom commands
- Auto-detect npm, yarn, pnpm, and bun (default package manager: bun)
- Shortcuts per project with one-click run / stop / restart
- Port conflict detection including Next.js “already running” + Kill & Retry
- Preferences modal (notifications, package manager, editor, ports, launch at login)
- Login-shell PATH enrichment for bun / nvm / Homebrew
- Ad-hoc signed `.app` + zip/DMG release packaging
Notes
- First public release




