Menu-bar app for Mac · v1.0.1

Shipyard

Know which of your PRs are failing without opening a single tab.

Shipyard finds every open pull request you've authored across GitHub, sorts each one's CI checks into four plain buckets, and puts your most important PR's counts right in the menu bar. Sign in once and it just keeps up.

v1.0.1 · macOS 14 Sonoma or later · Apple silicon & Intel · signed & notarized

Every check, four buckets

GitHub reports CI in more than a dozen states across two different APIs. Shipyard collapses them into the four you actually care about, and always lists them in the same order, so your eye lands on failures first.

Failed

Always first, and the only red in the app. A failing PR also gets a thin red bar down its edge.

FAILURETIMED_OUTERRORSTARTUP_FAILURE

Passed

A fully green PR shows a single count in the menu bar. Zeros stay grey everywhere, so color always means something.

SUCCESSNEUTRAL

Queued

Waiting and running together. Running checks get a spinner so you can tell them apart.

QUEUEDPENDINGIN_PROGRESSWAITING

Skipped

Cancelled runs are usually replaced by a newer one, so they land here. One toggle counts them as failed instead.

SKIPPEDCANCELLEDSTALE

The whole dock, one window

The popover covers most days. When you want to dig in, triage tickets or clean up, the main window has everything in three calm columns.

Shipyard's main window: a sidebar with Starred, Active, Tickets and Done; a list of pull requests with their test counts; and a detail pane breaking down the checks for the starred PR Shipyard's main window in dark mode

Sorted by urgencyYour starred PR pins to the top, then anything failing, then whatever changed most recently. Filter by repo from the sidebar.

Hide the noisePRs you don't care about go away with ⌘⌫ and an undo toast. They stay hidden across renames and restarts.

Light and darkBuilt on system materials, so it follows your appearance and accent color like any first-party Mac app.

Built for the day-to-day

Small things that add up to never wondering whether CI is done yet.

Detail pane

Every check, grouped by what matters

A segmented bar shows the shape of a run at a glance. Failures open by default; passes stay folded away until you want them.

  • Each check shows its workflow, how long it took, and a link straight to its log
  • Copy the branch name in one click, or with ⌘⇧C
  • Only the latest commit counts, so stale runs never confuse the numbers
Detail pane for a pull request: a segmented test bar, four stat tiles reading 2 failed, 14 passed, 3 queued and 1 skipped, and the failing checks listed with their durations The same detail pane in dark mode

Tickets

Track the work before there's a PR

Press ⌘N, type a title, hit Return. Paste a Jira, Linear or Shortcut link and the ticket key fills itself in.

  • When a new PR's branch or title mentions a ticket's key, Shipyard suggests linking them. It never links without asking.
  • Linked tickets merge into their PR's row and move to Done when it merges
Three tickets without pull requests; the last one, ENG-1501, shows a suggestion reading 'Looks like #431' The same tickets in dark mode

Refresh

Fast when it matters, quiet when it doesn't

Shipyard watches what you're watching. It polls hard while your starred PR's tests are running, then eases off so it never burns through your GitHub rate limit.

  • Cached data shows the instant it opens, with no spinner in the way
  • Offline? The last results stay on screen with a "last updated" label
30 sStarred PR has tests running
2 minNormal, the whole dashboard
5 minWindow and popover closed for a while
nowMac wakes, network returns, or you press ⌘R

Sign in once, set up nothing

Shipyard borrows your GitHub CLI login, so there's no token to paste and no repos to pick. If the token ever changes, it quietly picks up the new one. SAML orgs get a one-click authorize banner.

Lives in the menu bar

Close the window and it keeps running. Hide the Dock icon entirely, launch at login, and set a global hotkey to drop the popover down from anywhere.

Notifications, if you want them

Off by default. Turn them on to hear when your starred PR's tests finish or a check fails. Click one to open the failing check.

Readable without color

Every count sits next to its own icon, so the buckets read just as clearly for colorblind users. Animations respect Reduce Motion.

Keyboard first

Every action has a shortcut. Arrow through the list and never touch the mouse.

New ticket⌘N
Refresh⌘R
Star / unstar a PR⌘S
Search⌘F
Open on GitHub↩
Hide a PR⌘⌫
Copy branch name⌘⇧C
Link PR to a ticket⌘⇧L
Show / hide detailsSpace
Active, Starred, Tickets, Done⌘1–4

Under the hood

A few of the decisions behind it, for the curious.

A menu bar in color

SwiftUI's MenuBarExtra renders its label as a monochrome template, which would make red and green impossible. The status item is an AppKit NSStatusItem instead, with colored SF Symbols attached to an attributed title.

One query, not fifty

A single GitHub GraphQL search fetches every PR with its latest commit's check rollup. Each response reports the remaining rate limit, and Shipyard slows itself to every 10 minutes if that runs low.

Swift 6, strictly concurrent

All networking lives in an actor so the UI never waits on a request. SwiftData caches PRs, tickets and hidden state, keyed by GitHub node IDs so nothing breaks when a PR is renamed.

Shipped like a real Mac app

Hardened Runtime, signed with a Developer ID, notarized by Apple and stapled. One release script goes from source to a drag-to-install DMG and publishes a Sparkle 2 update feed. Installed copies check it daily and only accept updates signed with the release key.

Shipyard app icon

Get Shipyard 1.0.1

Free · macOS 14 or later · signed & notarized by Apple · updates itself

Download Shipyard-1.0.1.dmg
  1. Open the DMG and drag Shipyard into your Applications folder.
  2. Install the GitHub CLI and log in, if you haven't: brew install gh then gh auth login.
  3. Open Shipyard and click Use my GitHub CLI login. Your PRs show up on their own.
Back to the rest of my work