v0.1.7 · macOS 14+

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

$git push
runbar1 running
@markoradak
running1
CIworkflow
markoradak/runbar
2m 4s
mainpush
median 2m 14s~10s left
recent3
ReleaseHEAD4m ago
markoradak/shiftover·success·1m 4s
Tests17m ago
markoradak/runbar·failure·47s
Preview40m ago
markoradak/site·success·38s
synced 0s agov0.1.7

Live demo · real seconds, real states — press Run it

Detection latency

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.

git push returnstime to first spinner
Runbar · FSEvents0.9s
Polling · 5-minute defaultup to 5m
0m1m2m3m4m5m
Honest estimates

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.

CI1m 52s
markoradak/runbar
median 2m 14s~22s left

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.

Deploy1m 36s
acme/platform-api
running long · median 48s

Past its median. The bar switches to indeterminate and says so, rather than sitting at 99% pretending it knows.

Lighthouse26s
markoradak/site
no duration history

First run of this workflow. No history means a plain elapsed timer and no bar, rather than an invented number.

Failure output

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.

Testsworkflow
markoradak/runbar·failure·47s
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.
Zero manual repo configuration

You can exclude repos. You are never asked to add one.

Two sources, unioned and deduped, refreshed on launch and every ~30 minutes.

~/Codewalking to depth 4
  • 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
2 repos added · 0 asked about
01

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.

02

Your GitHub account

GET /user/repos?sort=pushed, top 30, as a safety net for repos you care about but haven't cloned.

Integrations

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.

Missing one?

Request an integration

Opens a prefilled issue on GitHub for you to review and file — nothing is sent from this page.

Privacy and access

Read-only. Always.

No backend, no relay, no telemetry, no analytics, no account. One app bundle talking directly to the providers you connect.

Requested permissions2 of 10
  • Actionsreadrun status and history
  • Metadatareadmandatory for any GitHub App
not requested
  • Contents
  • Workflows
  • Pull requests
  • Issues
  • Deployments
  • Packages
  • Administration
  • Secrets

It cannot start, cancel, or re-run anything, and it never reads your code.

GET/repos/markoradak/runbar/actions/runs
If-None-Match: "a3f9c21e"
304Not Modified
x-ratelimit-remaining: 4982 — unchanged

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.