
Free macOS menu bar app
CommitBar
Stage, commit, and push from the macOS menu bar
Stage, commit, and push without leaving your flow. A lightweight macOS menu bar companion for everyday Git.
v2.2.1 · 14.3 MB · macOS · Apple silicon · free for personal and public use
What it does
Git commits from your menu bar
- Pick repos once, commit anytime
- Quick status and push from the menu bar
- Built for developers who live in the bar
Version history
CommitBar release notes
Every published version, newest first.
v2.2.1
Current9 Nov 2026Fixed
- Repositories not read yet no longer show as clean — at launch, and right after Add Repository, each repository showed `— · clean` and the header said `all clean` until every repository had answered, which a slow one could stretch to many seconds. They now show `checking…`, and the header says so too.
- A detached HEAD is no longer counted as "to sync" — a clean repository checked out at a tag, or in the middle of a rebase, made the header say `1 to sync` though there was nothing to pull or push. The header now says `1 detached`; "to sync" counts only commits to pull or push.
v2.2.0
8 Nov 2026Changed
- A menu bar icon drawn from the CommitBar logo — the branch inside the ring, as on entelxcore.com, instead of a generic system symbol. When nothing needs attention it still takes the menu bar's own color, light or dark; when something does, it turns orange or red with the number of repositories, as before.
- A clearer menu — each repository is one row: a status dot (orange when it needs attention, red for merge conflicts or a status that can't be read, gray when clean), the name, and its branch and state in a right-aligned column, such as `main · 3 changed`, `feature/login · ↑2` or `develop · ↓1`. A file both staged and modified counts once. The header, with the app's logo, sums it up (`4 repositories · 1 with changes · 2 to sync`), and Pull All and Push All show their count on the right.
- The new teal logo — the app's icon is now the teal CommitBar logo from entelxcore.com.
v2.1.0
8 Nov 2026Added
- Pull All and Push All — next to Commit All…, the menu offers Pull All (n) when repositories are behind their remote and Push All (n) when they have commits to push, each only when there is something to do, with how many. They run in the background, three repositories at a time; each shows `waiting…` and then `pulling…` or `pushing…` in the menu, gets the same time limit and SSH Keychain handling as a single Pull or Push, and is refreshed when it is done. Pull All only fast-forwards. A repository is skipped and named when it has merge conflicts, no upstream branch, a detached HEAD, a branch that has diverged from its remote, local changes to files the pull would bring, or another operation running. One notification sums it up at the end, for example “Pulled 3, skipped 1 (conflicts: api)”, when notifications are on in Settings; the full git message of a repository that failed is what a single Pull or Push on it shows. If one could not authenticate, the “Save to Keychain” offer appears once. With “Always open Terminal for push/pull” on, one Terminal window runs them all.
- Choose the files to commit — the commit window lists the changed files with a checkbox each, in a scrolling list that stays quick with thousands of files, and clicking a file shows its diff. When something is staged the staged files are checked and only their staged changes are committed, as before; otherwise every file is checked. Uncheck a file to leave it out, or check others: the commit then takes exactly the checked files with all their changes, new, deleted and renamed files included, and everything else stays as it was, staged changes too. All and None check or clear the list, Commit is disabled while nothing is checked, and the suggested message follows the checked files until you edit it. Commit All… and Commit One by One… use the same window.
v2.0.3
7 Nov 2026Fixed
- Notifications follow your settings — any modified, untracked or staged file, unpushed commit or detached HEAD was enough for a notification, so a repository with merge conflicts (which always has modified files) still notified with "Notify when a repo has merge conflicts" off, and an editing session posted a banner every five minutes, which macOS shows since 2.0.0. A repository now notifies only when it gets merge conflicts or falls behind its remote, each only with its setting on, once each time it happens. Editing files never notifies. The "Update available" dialog is not affected by these settings.
- One repository that does not answer no longer stops refreshes for all — git status had no time limit, so a repository on a network share that was no longer connected, or in iCloud Drive with files not downloaded, kept the refresh waiting forever, and no repository was refreshed again until CommitBar was restarted. Status reads now stop after 20 seconds and the repository shows that as its error, the others refresh as usual, and a refresh always finishes, even when something in it fails. The background status also no longer takes Git's index lock, so it cannot collide with your own git commands or leave a stale `index.lock` when it is stopped. Commit, push and pull keep the limits they had.
- A removed repository stays removed — a refresh already running when you removed a repository wrote back the list it started with, and the refreshes scheduled after a commit, push or pull added their result without checking, so the repository came back in the menu. Results for repositories no longer in the list are now dropped, and a repository added while a refresh runs no longer disappears from the menu when it ends.
- File names with spaces, accents or renames work in the commit window — Git's short status quotes such names (`"a b.txt"`, `"caf\303\251.txt"`) and writes a rename as `old -> new`; the commit window listed those strings as file names and its diff preview found nothing for them. CommitBar now reads the NUL-separated form, which gives every path as it is, and lists a rename under its new name. A name like `a[1].txt` is no longer taken as a pattern by the diff preview.
- The menu bar icon no longer disappears on a light menu bar — when no repository needed attention, the icon and its number were drawn white and vanished on a light menu bar. They now follow the menu bar's color (a template image and the system label color) and change with it.
- A save cut short can no longer empty the repository list — `state.json` was rewritten in place, so a write cut short left it empty or half written, CommitBar then started with no settings and the next save erased the repository list. It is now written to a temporary file that replaces the old one in one step.
- The menu waits for a burst of updates before rebuilding — the 0.6-second wait before rebuilding the menu never happened, because a rumps timer fires once as soon as it starts, so every status update rebuilt the whole menu. It now really waits.
v2.0.2
7 Nov 2026Fixed
- Launch at login no longer starts a second CommitBar, or quits the one you are using — turning it on loaded the login item right away, and since it starts at load, a second CommitBar appeared next to the first; turning it off unloaded the item, which stops CommitBar when it was the copy started at login. The setting now only adds or removes the login item, which macOS uses at the next login.
- "Save SSH key to Keychain" no longer breaks SSH with Homebrew's OpenSSH — CommitBar added `UseKeychain yes` to `~/.ssh/config`, an option only Apple's ssh knows; with Homebrew's OpenSSH first on PATH every push, pull and fetch stopped with "Bad configuration option: usekeychain", in Terminal too. The block now starts with `IgnoreUnknown UseKeychain`, a block written by an older CommitBar is repaired at launch, and the Keychain step runs Apple's `ssh-add`.
- Git worktrees and submodules can be added — Add Repository… required `.git` to be a folder, but in a worktree or submodule it is a file, so they were refused as "Not a Git repository".
- A failed update no longer leaves CommitBar closed — if installing the update failed after CommitBar quit, nothing reopened it. The installer now reopens the installed CommitBar whenever it cannot finish, and an update that could not be installed at all (CommitBar opened from a temporary location macOS uses for downloads, or an Applications folder this user cannot write) is refused before CommitBar quits, with a message saying why.
- "Update took too long … was cancelled" now really cancels — the download kept going after that message and could quit CommitBar and install minutes later. A cancelled update now stops, and the timeout only counts time without download progress, so a slow connection is no longer cut off.
Security
- An update containing more than one CommitBar.app is refused — the signature check and the installer each picked a bundle on their own; with exactly one allowed, the installer can only install the bundle that was checked.
v2.0.1
7 Nov 2026Fixed
- Commit no longer commits more than you staged — Commit and Commit & Push ran `git add -A` first, so changes you had deliberately left out (hunks staged with `git add -p`, a half-finished file, untracked files) went into the commit too. When something is staged, CommitBar now commits exactly that and leaves the rest as it is, like `git commit` in Terminal, and the commit window says so above the file list. With nothing staged it still stages everything, as before.
- Refreshes after a push or pull in Terminal come when they should — the follow-up refreshes 1, 3, 8 and 20 seconds later all ran at once, before Terminal had finished, so the result only showed at the next poll. A rumps timer fires once as soon as it starts; `schedule_later` now skips that and really waits.
v2.0.0
7 Nov 2026Changed
- Signed with Developer ID and notarized by Apple — CommitBar 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, a Full Disk Access grant carries over to updates instead of being lost with each new build.
- Opens on macOS 13 and later, as the README says — release builds were made with Homebrew's Python, which is built for the Mac's own macOS, so 1.2.10 needed macOS 27 to open at all. Releases are now built with Python from python.org, the app declares macOS 13 as its minimum, and `release.sh` checks every bundled binary against it before publishing.
Security
- Updates must be signed by the CommitBar developer — Check for Updates… now unpacks the downloaded zip and checks, before CommitBar 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.
v1.2.10
19 Oct 2026Fixed
- Push failed on a hook that calls dart, flutter, node or any other SDK — started at login, CommitBar inherits launchd's `/usr/bin:/bin:/usr/sbin:/sbin`, so a pre-push hook died with `dart: command not found` and the push was refused, although the same push works in Terminal. CommitBar now asks the login shell for its PATH and gives it to git, so hooks run the toolchain you have by hand. The shell is asked once per launch, in the background, and only commit, push and pull — the commands that run hooks — wait for the answer; a status refresh never does, so the menu still fills right away. A repository whose hook runs its analyzer and tests takes as long as it takes: the menu keeps showing `pushing…` and the 15-minute limit from 1.2.8 still applies.
v1.2.9
19 Oct 2026Fixed
- Repositories shown with a dash instead of their branch — when macOS denies CommitBar access to a repository's folder, git cannot even read its own working directory (`fatal: Unable to read current working directory: Operation not permitted`), so the first command of a refresh fails and the repository stays in the menu as `● name —`, marked as needing attention, with the raw git text as its only explanation. That text now says what it is: macOS is not letting CommitBar read the folder, and it can be allowed under System Settings → Privacy & Security → Full Disk Access, or by removing the repository and adding it again with Add Repository…, whose file picker grants access to the folder you pick. An SSH key rejection (`Permission denied (publickey)`) is still reported as an authentication problem.
v1.2.8
18 Oct 2026Fixed
- Push with a slow pre-push hook ended in “Push needs authentication” — CommitBar killed `git push` after 60 seconds, and its own “timed out” note was then read as an SSH failure, so a repository whose pre-push hook runs tests for a few minutes got the “Save to Keychain” dialog although SSH was fine, and the hook's test processes kept running in the background while nothing was pushed. Push and pull now get 15 minutes. If that still runs out, CommitBar stops git together with everything the hook started and shows “Push took too long” with an Open Terminal button, never the Keychain dialog. A push or pull still running after 10 seconds posts a “Still pushing…” notification so it does not look hung; the menu keeps showing `pushing…` as before. A real network timeout from ssh (“Connection timed out”) is still treated as a connection problem.
v1.2.7
9 Oct 2026Fixed
- CommitBar quit after a successful push, pull, commit or branch switch — 1.2.6 crashed right when it showed “Push successful.”, “Pull successful.”, “Commit successful.”, “Committed and pushed.” or the create/switch-branch result: those six notices still called rumps' notification function, which 1.2.6 had switched off, and the error it raised on the main thread aborted the app. They now go through the same path as every other notice, and only rumps' launch-time connection to the old notification API is skipped, so a missed call can no longer crash the app.
v1.2.6
9 Oct 2026Changed
- Menu bar number counts repositories — the number next to the icon is now how many repositories have uncommitted changes, not the total of changed files across them (two repos with 40 edits show 2). With no local changes anywhere it still counts repositories that need a push or pull.
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.
v1.2.5
9 Oct 2026Changed
- Current dependencies — built with `packaging` 26.3 and PyInstaller hooks 2026.8. `requirements.txt` now allows `packaging` 26.x (was capped below 26).
v1.2.4
16 Sep 2026Added
- Commit All… and Commit One by One… in the main menu, under the repository list. Both open the same commit window as a repository's Commit…, for every repository that has changes. Commit All opens one window per repository (cascaded); Commit One by One opens them in turn — the title shows “(2 of 5)”, Skip moves on without committing, Cancel stops the sequence.
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
- Repository order in the menu only changed when a repository was added — the menu now rebuilds whenever the sorted order changes. Repositories with changes to commit come first, then anything else needing attention (ahead/behind, conflicts, detached HEAD), then clean ones, each A–Z.
- Commit / push / pull errors never showed an alert — every `except … as extra:` handler in `dialogs.py` read `exc`, so a failing git command raised `NameError` inside the background job instead of the alert, and the repository stayed marked `committing…` / `pushing…` until restart.
- 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.2.3
13 Sep 2026Fixed
- First changed file lost its first letter — trimming `git status --porcelain` output removed the leading status space, so an unstaged `bun.lock` showed as `un.lock [staged]` (and generated commit messages read `HANGELOG.md`). Staged/modified counts were off by one for the same reason.
v1.2.2
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.2.1
12 Sep 2026Fixed
- Quit reopened the app — Launch at login used `KeepAlive`, so launchd started CommitBar again after Quit. Match RunBar: `KeepAlive` off, unload the login item on Quit (plist stays for the next login).
v1.2.0
27 Aug 2026Added
- Switch or create a branch from each repository’s menu (local branches, plus New Branch…)
v1.1.2
27 Aug 2026Changed
- Menu chrome — Settings…, Check for Updates…, Version, then Quit (same order as the other Bars). Refresh All is now Refresh.
Fixed
- Duplicate menu bar icon after update — after `open` of the new app, do not reload the LaunchAgent. KeepAlive would start a second copy because that process is not the launchd job. The plist stays on disk, so Launch at login is unchanged at the next login.
v1.1.0
19 Aug 2026Changed
- Non-blocking git jobs — commit, push, and pull run in the background so the menu stays usable
- Push/pull 2–3 repositories in parallel; the same repo still allows only one write at a time
- Commit window is modeless, with Commit and Commit & Push buttons (no follow-up alert)
- Menu item shows `pushing…` / `committing…` while that repo is busy
- Status refresh never runs git on the AppKit main thread, and skips a repo that is currently pushing
v1.0.11
14 Aug 2026Fixed
- Self-update with launch at login — start the installer script before parking the KeepAlive LaunchAgent, so bootout cannot kill the app before replace/relaunch. Relaunch uses `open` (same path that works for StackBar).
- Unpack the free-tools zip with `ditto` and skip `__MACOSX/*.app` stubs so the real `Contents/MacOS/CommitBar` is installed
v1.0.10
13 Aug 2026Fixed
- Relaunch after update — open the new `.app` with LaunchServices instead of treating LaunchAgent bootstrap as a successful start (bootstrap loaded the job but the menu bar icon never came back)
v1.0.9
13 Aug 2026Fixed
- Check for Updates progress — show the same “Installing update…” percent window as the other bar apps
- Double reopen after update — park the LaunchAgent before replacing the app so KeepAlive plus `open -n` cannot start both the old and new copies
v1.0.8
13 Aug 2026Changed
- `install.sh` picks the newest Python 3 from Homebrew or Xcode / CLT (no longer hard-coded to 3.12)
v1.0.7
9 Aug 2026Fixed
- Check for Updates zlib Error -3 — fetch manifest/zip via stdlib urllib instead of requests/urllib3 so a CDN that wrongly sets `Content-Encoding: gzip` no longer breaks the update check
v1.0.6
9 Aug 2026Fixed
- Memory leak: rumps retained every rebuilt `NSMenuItem` in a global callback map (~1 GB after days of use)
- Menu now updates titles in place; full rebuild only when repos / remote / editor layout changes
- Filesystem watches ignore high-churn dirs (`node_modules`, `dist`, `.venv`, etc.) and unschedule on remove
- Large git diffs are capped in memory
- Crash on Commit & Push (SIGSEGV from releasing the commit window too early)
v1.0.5
20 Jul 2026Fixed
- SSH Keychain setup / Terminal push-pull when `SSH_AUTH_SOCK` is stale after reboot
- LaunchAgent no longer bakes in a session-specific `SSH_AUTH_SOCK` path
v1.0.4
18 Jul 2026Added
- Check for Updates… menu item (ENTELXCORE manifest + in-app zip install)
v1.0.3
18 Jul 2026Changed
- Patch release for ENTELXCORE Free Tools
v1.0.2
18 Jul 2026Fixed
- `release.sh` always rebuilds before zipping (fixes zip filename vs in-app version mismatch)
- Launch at login migrates off `run.sh` / dev paths when `/Applications/CommitBar.app` exists
Changed
- Menu bar icon uses medium-weight SF Symbol to match the Bars family (RunBar / UsageBar)
- App logo aligned with ENTELXCORE free-tools product mark
v1.0.1
18 Jul 2026Added
- Custom app icon (menu bar dev wrapper and installed `.app`)
- Support for local Git repos without a remote (commit-only flow)
Changed
- Release publishes to ENTELXCORE free-tools (`CommitBar-{version}-macos-arm64.zip`)
v1.0.0
18 Jul 2026Added
- macOS menu bar app for monitoring multiple Git repositories
- Live status: modified, staged, untracked, ahead/behind, conflicts
- Commit dialog with scrollable file list and diff preview
- Push / pull from the menu bar with SSH Keychain support
- Preferences panel (notifications, refresh interval, SSH setup)
- PyInstaller `.app` build and install to `/Applications`
- Release zip script for distribution
Fixed
- Menu bar updates after commit/push/pull
- `git diff` exit code handling
- Always stage files before commit
- Main-thread UI refresh from background git operations




