Your CI, one second
after git push.
A native macOS menu-bar monitor for GitHub Actions, Vercel, and Cloudflare Pages — across every repo you already have checked out. Sign in, point it at your code folder, done. It finds the repos itself.
v0.1.7 · 5.1 MB · Apple silicon & Intel · updates via Sparkle
Live demo · real seconds, real states — press Run it
It doesn't wait for a poll tick.
Runbar watches your checkouts with FSEvents — both .git/refs/remotes/origin/ and .git/packed-refs, because git writes to either — and promotes a repo the instant its remote-tracking ref moves.
The closest comparable app polls on a five-minute default. That difference is the whole reason this exists.
The progress bar tells the truth.
The ETA is the median of the last 10 completed runs of that same workflow, not the last one — so a single fast failure doesn't poison the estimate. Three states, no invented numbers.
Determinate bar, measured against the median of the last 10 completed runs — not the last one, so a single fast failure can't poison the estimate.
Past its median. The bar switches to indeterminate and says so, rather than sitting at 99% pretending it knows.
First run of this workflow. No history means a plain elapsed timer and no bar, rather than an invented number.
The log is already there when it breaks.
Expand a failed run and Runbar fetches the tail of its log inline — no browser tab, no hunting through a job matrix for the step that actually failed. Errors and warnings are coloured as they stream.
Running builds stream their output live in the same place. One click copies the whole tail to your clipboard — try the button.
Run swift test --enable-code-coverage Building for debugging... [142/142] Compiling RunbarTests PollSchedulerTests.swift Test Suite 'All tests' started at 2026-07-18 21:03:58 Test Suite 'PollSchedulerTests' started Warning: rate limit headers missing on 2 responses Test Case '-[PollSchedulerTests testConditionalRequestSkipsUnchanged]' started Error: XCTAssertEqual failed: ("304") is not equal to ("200") PollSchedulerTests.swift:118 Test Case '-[PollSchedulerTests testConditionalRequestSkipsUnchanged]' failed (0.412 seconds) Test Suite 'PollSchedulerTests' failed at 2026-07-18 21:04:11 Executed 47 tests, with 1 failure (0 unexpected) in 3.109 seconds Error: Process completed with exit code 1.
You can exclude repos. You are never asked to add one.
Two sources, unioned and deduped, refreshed on launch and every ~30 minutes.
- runbar/.github/workflows/ci.ymltracked
- dotfiles/no .github/no workflows
- blog/.github/dependabot.ymlnot a workflow
- platform-api/.github/workflows/deploy.ymltracked
- scratch/no .gitnot a repo
Your code folder
Walked to depth 4, for anything with a .git and at least one .github/workflows/*.y{a,}ml. The presence of .github/alone isn't enough — that directory also holds issue templates and dependabot.yml, which don't imply Actions.
Your GitHub account
GET /user/repos?sort=pushed, top 30, as a safety net for repos you care about but haven't cloned.
Every pipeline in one menu bar.
Connect any combination — runs from all of them land in the same list, sorted by what's happening now.
- supported
GitHub Actions
Workflow runs, jobs and current step, live output and failure logs.
- supported
Vercel
Deployments, build state, and a link straight to the preview.
- supported
Cloudflare Pages
Deployments, build stages, and log tails for failed builds.
Read-only. Always.
No backend, no relay, no telemetry, no analytics, no account. One app bundle talking directly to the providers you connect.
- Actionsreadrun status and history
- Metadatareadmandatory for any GitHub App
- Contents
- Workflows
- Pull requests
- Issues
- Deployments
- Packages
- Administration
- Secrets
It cannot start, cancel, or re-run anything, and it never reads your code.
Stored ETags mean unchanged repos cost nothing against your rate limit. Runbar tracks what's left and widens its own polling before it ever becomes your problem.
Credentials
Live in the macOS Keychain. Never in UserDefaults, a plist, a file, or a log line.
Updates
Downloaded from GitHub Releases and verified against a signed Sparkle appcast before anything is installed.
Source
MIT licensed and buildable from a single ./bootstrap.sh, so none of the above has to be taken on trust.
Sign in, point it at your code.
Requires macOS 14 or later. Free and open source under the MIT license.