RunBar icon

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.

v2.2.1 · 15.5 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

Version history

RunBar release notes

Every published version, newest first.

  1. v2.2.1

    Current9 Nov 2026

    Fixed

    • Adopted servers keep their ◆ — since 2.2.0 a server RunBar adopted (one the keeper kept running after Quit, or one already listening in the project's folder) looked exactly like one RunBar started itself. Its row shows ◆ again, in teal.
    • No stray items under Quit at launch — for a second or two after launch, Start Selected, Open All Logs and Stop All could appear again at the bottom of the menu, under Quit, until the menu was first rebuilt.
  2. v2.2.0

    8 Nov 2026

    Changed

    • A menu bar icon drawn from the RunBar logo — a terminal window with its `>_` prompt inside the ring, as on entelxcore.com, instead of a generic system symbol. When nothing runs it still takes the menu bar's own color, light or dark, and it shows the number of runs and turns red when one fails, as before.
    • A clearer menu — each project and command is one row: a status dot (teal while it runs, a half dot in your accent color while it starts or stops, red when it failed, orange for a port conflict or a missing folder, gray when stopped), the name, and what it runs in a right-aligned column, such as `▶ dev :3000`; a stopped row shows in gray what starting it would run. The header, with the app's logo, puts what is running first (`4 running · 5 projects · 1 command · 3 ports`), Active Ports and Start Selected show their count on the right, and a stack being started reads `starting 1 of 2…`.
    • The new teal logo — the app's icon is now the teal RunBar logo from entelxcore.com.
  3. v2.1.0

    8 Nov 2026

    Added

    • Run on next free port — the “Port … is already in use” dialog has a third button next to Kill & Retry and Cancel: Run on :5174 restarts the same command on the next free port instead of killing whatever holds the port. The port is found from the taken one upward with a bind test on 127.0.0.1 and ::1 (so a server on 0.0.0.0, `::` or either loopback counts as taken), skipping ports RunBar's own runs use. Each kind of command gets it the way it understands: package.json scripts get `PORT=<n>` plus the flag their dev server needs, passed through the package manager (`npm run dev -- --port 5174 --strictPort`, `bun run dev --port 5174 --strictPort` for Vite; `-p` for Next.js and Storybook, `--port` for Astro, Nuxt and Angular; Create React App reads PORT), `php artisan serve` gets `--port=`, Flutter web runs `--web-port=`, the built-in static server `--port`, and other commands `PORT` (with any `--port <taken>` in them changed). The dialog says how (“PORT=5174 and --port 5174 --strictPort (Vite)”). Where moving cannot work it explains instead of offering the button: Firebase emulators (their ports live in firebase.json), a script that pins its own Vite / Astro / Nuxt port in package.json, Next.js's one-dev-server-per-folder lock, a Flutter run that is not a web run.
    • The new port stays with that run — the run's line shows it (`dev :5174`) from the moment it starts, its menu says “On :5174 — :5173 was in use”, and Restart keeps it; ▶ Run, Start Selected and stacks still start the saved command on its usual port. Always Use :5174 in the run's menu saves the moved command (`PORT=5174 bun run dev --port 5174 --strictPort`) into the shortcut that started it, or as a new shortcut with the run's label, or into the saved command.
    • Stacks — Start Selected → Save as Stack… saves the ticked projects and commands, in the order they were ticked (shown as “Order: api → web”; untick and tick one again to move it to the end), under a name such as “api + web”. The new Stacks submenu has, per stack, ▶ Start api + web, which starts them one at a time: each one once the one before it reports a listening port (the same detection as the port badge), exits (a one-shot step such as `migrate`), fails, or has not listened after 60 seconds — then the stack goes on and the notification says so (“web — no port after 60 s — started the next one”). An entry that is already running is waited for, not restarted; one that hits a port conflict is waited for until the dialog is answered. ■ Stop api + web stops them in reverse order. While a stack starts, the menu shows “Starting api + web: 1 of 2…” under the header and each entry's state in the stack's submenu; Stop, Stop All and Quit cancel the start first, so nothing else starts once they act. Load into Start Selected ticks a stack's entries to change it (save under the same name to replace it), Delete Stack… removes only the stack. Stacks are kept in state.json (`stacks`, with an optional per-stack `item_timeout` in seconds); older state files simply have none.

    Changed

    • Select All in Start Selected keeps the order you ticked — it adds the rest after the entries already ticked (projects by name, then commands) instead of replacing the order, since the tick order is now the order a stack starts in.
  4. v2.0.3

    7 Nov 2026

    Fixed

    • Servers left running on quit keep working — with “Stop project servers when quitting RunBar” off (the default), a server kept writing to the terminal RunBar had opened for it, and that terminal closed with RunBar: a Next or Vite dev server died with an I/O error at its next log line (an HMR update, a request) or hung with a dead port that RunBar then adopted as live at its next launch. Updates and their relaunch did the same. RunBar now hands those terminals to a small background keeper when it quits or restarts for an update. The keeper keeps writing each server's output to its log until the server exits, then exits itself, and after the restart Open Logs… on the adopted server opens that log. Nothing is kept when RunBar is set to stop servers on quit, and in the app the keeper is RunBar's own executable, so it needs no Python on the Mac. RunBar also stops or hands off its servers when macOS ends it (an update relaunch, logging out), not only through Quit.
    • Commands that crash stay in the menu — a dev server that exited with an error went straight back to “○ name” and the only notice was the earlier “Started …”, so the red icon and the ✗ mark never appeared. A failed run now keeps its line (`✗ shop dev failed`, or `▶ dev :3000 · ✗ storybook` next to a running one) with its exit code (“Exited with code 1”, “Killed by SIGKILL”) and last output line, plus Restart, Open Logs… and Dismiss, until you restart or dismiss it. The menu bar icon turns red and a notification says which command failed and why (when notifications are on). Stopping a run, a clean exit and Kill this port on a RunBar run do not count as failures.
    • package.json scripts run when the package manager's path has a space — scripts were started as `<package manager> run <script>` without shell quoting, so a bun / npm / pnpm / yarn under a folder like `~/Library/Application Support/…` failed every script with exit 127, and a script named like `start;prod` ran something else. Both are quoted now, also for the Firebase `functions: build:watch` command; the menu still shows the plain script name.
    • Logs no longer grow without limit — a long-running, chatty run could fill its log file indefinitely. At 5 MB a run's log now moves to `<log>.1` and starts over, so one previous file is kept; the keeper uses the same limit, and old logs are pruned together with their `.1` file.
    • The menu bar icon shows on a light menu bar — the idle icon and its number were drawn in a fixed white, which disappeared on a light menu bar. The idle icon is now a template image that macOS draws in the menu bar's own color, and the number uses the menu bar's text color.
    • Settings are saved safely — state.json is flushed to disk before it replaces the previous file, so a crash or power loss right after a save cannot leave it empty or half written.
    • The menu rebuilds once per burst of updates — the 0.35-second delay meant to group status updates did not wait at all (a rumps timer fires as soon as it starts), so every update rebuilt the whole menu.
  5. v2.0.2

    7 Nov 2026

    Fixed

    • Stop lets a dev server shut down cleanly — Stop sent SIGTERM and force-killed the command 0.4 seconds later, which cut clean shutdowns short: `firebase emulators:start --export-on-exit` never wrote its export. Stop now signals the run's whole process group and gives it 5 seconds before SIGKILL, so whatever ignores SIGTERM (the command or a process it started) is still gone afterwards. The waiting never happens on the main thread, Stop All and Quit stop several runs side by side, and a run whose terminal a background daemon keeps open no longer leaves Stop hanging. Kill & Retry keeps its short grace for the process holding the port.
    • Port conflicts name the right port — the conflict parser took the first number on the line: Flutter's `… errno = 48), address = 0.0.0.0, port = 8080` gave 48 and Node's `EADDRINUSE: address already in use 127.0.0.1:5173` gave 127, so Kill & Retry (and auto-kill) went after the wrong port and could keep retrying. The port now comes from `port = N` / `port N` or the number after the address (`127.0.0.1:5173`, `[::1]:3000`, `:::3000`, `localhost:3000`), never an errno or a part of an IP address. The green badge had the same problem: `Listening on 127.0.0.1:4000` showed 127 and `php artisan serve --host=192.168.1.5` showed 192.
    • A broken package.json no longer keeps RunBar from opening — a package.json that is a list (`[]`), whose `scripts` is not an object, or that is not UTF-8 (saved as UTF-16) raised an error while the menu was built, so RunBar would not start until the file was fixed. Such a file now counts as “no scripts” and the project stays in the menu. The same goes for a pubspec.yaml, firebase.json (and its functions/package.json) or composer.json that is not UTF-8.
    • Updates check that they can finish before RunBar quits — Install & restart now stops with an “Update failed” alert, while RunBar keeps running, when the app runs from the temporary location macOS uses for downloaded apps (move it to Applications first) or from a folder this Mac user cannot write. An update zip with more than one RunBar.app is refused.
    • A failed update reopens RunBar — when the installer stopped after RunBar had quit (a broken zip, a failed copy), RunBar stayed closed. The installer now reopens the installed app: the new version, or the old one it put back.
    • Slow update downloads are no longer cancelled — the update watchdog gave up after 150 seconds even while the download was still progressing; it now cancels only after 150 seconds without progress. A cancelled update can no longer finish in the background and quit RunBar to install after all.
    • Launch at login no longer starts a second RunBar or quits this one — turning the setting on loaded the login item at once, which started another copy (it runs at load), and turning it off unloaded it, which quits RunBar when it was started at login. The setting now only writes or removes the login item; it takes effect at the next login.
  6. v2.0.1

    7 Nov 2026

    Fixed

    • Saving Settings no longer deletes your saved commands — the Settings window built new settings from the options it shows plus the projects, so the saved standalone commands and the Start Selected ticks were dropped on every Save. Save now changes only what the window shows.
    • Kill & retry on a port conflict waits before restarting — the 0.6-second pause that lets the old process release the port did not wait at all (a rumps timer fires once as soon as it starts), so the restart could hit the same "port in use" again.
  7. v2.0.0

    7 Nov 2026

    Changed

    • Signed with Developer ID and notarized by Apple — RunBar was ad-hoc signed, so macOS blocked the first launch until quarantine was cleared in Terminal or the app was opened with right-click → Open. It is now signed with ENTELXCORE's Developer ID Application certificate, with the hardened runtime, and notarized and stapled by Apple: it opens with a double-click like any other app. Because the signature now stays the same from version to version, access you grant it under Privacy & Security carries over to updates instead of being lost with each new build.
    • Opens on macOS 13 and later — release builds were made with Homebrew's Python, which is built for the Mac's own macOS, so 1.0.34 needed macOS 27 to open at all. Releases are now built with Python from python.org, the app declares macOS 13 as its minimum (the README asked for 14, but nothing in RunBar needs more than 13), and `build_release.sh` checks every bundled binary against it before publishing.

    Security

    • Updates must be signed by the RunBar developer — Check for Updates… now unpacks the downloaded zip and checks, before RunBar quits, that the app inside is signed with ENTELXCORE's Developer ID. A tampered or broken download ends in an “Update failed” alert and the current version keeps running.
  8. v1.0.34

    21 Oct 2026

    Added

    • Firebase projects — a folder whose `firebase.json` has an `emulators` block gets a Firebase submenu (after package.json scripts): `emulators (auth, firestore, functions, …)` runs `firebase emulators:start` (the label lists the configured emulators; `ui`, `hub`, `logging`, `eventarc`, `tasks` and `singleProjectMode` are suite bookkeeping and skipped), `emulators (import/export ./emulator-data)` adds `--import ./emulator-data --export-on-exit` when that folder (or `.emulator-data/`, `emulators-data/`, `firebase-export/`) exists, and `functions: build:watch` / `functions: build --watch` runs the Cloud Functions build in watch mode inside `functions/` (or the `source` folder firebase.json names) with that folder's package manager — its lockfile first, then the project's, then bun. The emulators run side by side with `dev`. Hosting-only configs (no `emulators` block) get no section; without firebase-tools the section shows one greyed-out line, `firebase-tools not found (npm i -g firebase-tools)`.
    • Emulator UI badge + Open in Browser — the suite prints hosting / functions / Firestore websocket URLs while booting; the green badge now waits for `View Emulator UI at http://127.0.0.1:4000` (the only listen line that may replace an earlier badge) and ignores the `http function initialized (…)` / `websocket is running on` lines. Before the banner appears, Open in Browser already opens the Emulator UI port from `emulators.ui.port` (default 4000). Active Ports labels the suite `firebase`, and its Java emulators `firestore` / `database` / `pubsub`.
    • Emulator port conflicts — `Port 8080 is not open on localhost (127.0.0.1,::1), could not start Firestore Emulator` and `Could not start Firestore Emulator, port taken` turn the run orange with Kill & Retry on that port (a lone “port taken” line falls back to the emulator's default port). Note that Firestore's default `:8080` is also Flutter's `run (web-server :8080)`.
    • `firebase` resolves from the login shell PATH or nvm's bin folders (where `npm i -g firebase-tools` puts it); a custom `firebase …` command gets the absolute path and always runs where firebase.json lives (project root or `app/`), even when the only package.json is in `frontend/`. The `firebase emulators:start` entry is the seeded default shortcut / dialog prefill only for projects with no package.json script, Laravel or Flutter run.
  9. v1.0.33

    10 Oct 2026

    Fixed

    • 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.
  10. v1.0.32

    9 Oct 2026

    Fixed

    • 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.
  11. v1.0.31

    9 Oct 2026

    Changed

    • Current dependencies — rebuilt with PyInstaller hooks 2026.8. No app changes.
  12. v1.0.30

    16 Sep 2026

    Added

    • 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.
  13. v1.0.29

    16 Sep 2026

    Added

    • 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.
  14. v1.0.27

    12 Sep 2026

    Added

    • 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…”.
  15. v1.0.26

    12 Sep 2026

    Fixed

    • 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.
  16. v1.0.25

    11 Sep 2026

    Added

    • 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.
  17. v1.0.23

    27 Aug 2026

    Changed

    • 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.
  18. v1.0.21

    14 Aug 2026

    Fixed

    • 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`
  19. v1.0.20

    14 Aug 2026

    Fixed

    • 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 …`)
  20. v1.0.19

    13 Aug 2026

    Fixed

    • 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
  21. v1.0.18

    13 Aug 2026

    Fixed

    • Flutter → run (iOS Simulator) — boots `apple_ios_simulator` first, then `flutter run -d ios` (bare `-d ios` fails when Simulator isn’t already running)
  22. v1.0.17

    13 Aug 2026

    Added

    • 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`
  23. v1.0.16

    13 Aug 2026

    Fixed

    • 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`)
  24. v1.0.15

    13 Aug 2026

    Changed

    • `install.sh` picks the newest Python 3 from Homebrew or Xcode / CLT (no longer hard-coded to 3.12)
  25. v1.0.14

    9 Aug 2026

    Fixed

    • 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
  26. v1.0.13

    9 Aug 2026

    Fixed

    • 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
  27. v1.0.12

    3 Aug 2026

    Fixed

    • Show Terminal invisible text — live output sometimes drew transparent until selected; append with explicit green attributed strings instead of bare `setString` / system green
  28. v1.0.11

    3 Aug 2026

    Fixed

    • 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)
  29. v1.0.10

    22 Jul 2026

    Added

    • 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
  30. v1.0.9

    22 Jul 2026

    Added

    • 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)
  31. v1.0.7

    21 Jul 2026

    Fixed

    • 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
  32. v1.0.6

    21 Jul 2026

    Added

    • Open in Browser — from Active Ports and from a running project when a listen port is known
  33. v1.0.5

    18 Jul 2026

    Added

    • 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
  34. v1.0.4

    18 Jul 2026

    Added

    • 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)
  35. v1.0.3

    18 Jul 2026

    Changed

    • Patch release for ENTELXCORE Free Tools
  36. v1.0.2

    18 Jul 2026

    Changed

    • Menu bar icon uses outline `terminal` (medium weight) to match CommitBar / UsageBar
    • App logo aligned with ENTELXCORE free-tools product mark
  37. v1.0.1

    18 Jul 2026

    Changed

    • Patch release published to ENTELXCORE Free Tools as `RunBar-1.0.1-macos-arm64.zip`
  38. v1.0.0

    18 Jul 2026

    Added

    • 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