# shipyard
> A macOS menu bar app for keeping up with your projects while your agents work. One number for what needs you, one file your agents edit, pings from any machine.
A macOS menu bar app. It lists the pull requests, issues and workflow runs of the GitHub repositories you watch, grouped into projects, with one number in the menu bar for what needs attention, and your agents' pings. Everything it shows is set in one TOML file, `~/.config/shipyard/config.toml`, that you and your agents edit. These docs describe version 0.8.0.
## For AI agents
- To change someone's shipyard, edit their `config.toml` with the agent skill: `npx skills add yahyabedirhan/shipyard -g -y`. The skill knows every key, checks each edit and reads the app's verdict.
- To tell the user something, use the `shipyard` command on their machine: `shipyard ping send "
"` for what they must act on, `shipyard notice send ""` for a status that needs nothing from them.
- Never invent a key: every key is in [docs/configuration.md](https://shipyard.yahyapak.dev/docs/configuration.md), generated from the JSON schema.
- Optional: identify yourself on your first page with `?analytics_agent=&analytics_purpose=` (see [privacy](https://shipyard.yahyapak.dev/privacy)).
## Install
- Download `Shipyard--macos.zip` from https://github.com/yahyabedirhan/shipyard/releases/latest (macOS 14 or later), or build from source:
```sh
git clone https://github.com/yahyabedirhan/shipyard.git
cd shipyard
make install
```
- The agent skill: `npx skills add yahyabedirhan/shipyard -g -y`, then ask your agent "Watch this repo in shipyard".
- Other machines: `herdr plugin install yahyabedirhan/herdr-shipyard` (https://github.com/yahyabedirhan/herdr-shipyard).
## Docs
- [What it is](https://shipyard.yahyapak.dev/docs/what.md): Your pull requests, issues, workflow runs, pings and notes, grouped by project in the menu bar, with one number for what needs you.
- [Install](https://shipyard.yahyapak.dev/docs/install.md): Download the app, or build it from source. Then give your agents the skill.
- [First run](https://shipyard.yahyapak.dev/docs/first-run.md): Connect GitHub, choose a preset, and pick the repositories to watch.
- [Presets](https://shipyard.yahyapak.dev/docs/presets.md): Three ready-made files for shipyard's main uses. Start from one, then change any key.
- [Layouts](https://shipyard.yahyapak.dev/docs/layouts.md): Every project in one list, or one project at a time in tabs.
- [Config explorer](https://shipyard.yahyapak.dev/docs/explorer.md): Pick a snippet and see what it changes, on a mock of the panel.
- [Pings and notices](https://shipyard.yahyapak.dev/docs/pings.md): Your agents tell you when they need you, and when there's news.
- [Notes in Notion](https://shipyard.yahyapak.dev/docs/notes.md): Your own notes, one Notion database per project, listed beside the pull requests.
- [The agent skill](https://shipyard.yahyapak.dev/docs/skill.md): Ask in your own words. Your agent edits the file and checks it.
- [Other machines](https://shipyard.yahyapak.dev/docs/machines.md): Agents on your other machines ping you too, through Herdr.
- [Configuration reference](https://shipyard.yahyapak.dev/docs/configuration.md): Every key of config.toml, its default and what it takes.
- [The shipyard command](https://shipyard.yahyapak.dev/docs/commands.md): One command for agents and scripts: pings, notices, checks and the app.
- [Limits](https://shipyard.yahyapak.dev/docs/limits.md): What shipyard does not do.
- [Troubleshooting](https://shipyard.yahyapak.dev/docs/troubleshooting.md): Short answers to what goes wrong most.
- [Changelog](https://shipyard.yahyapak.dev/docs/changelog.md): What changed in each version, with its pull requests.
- [Everything in one file](https://shipyard.yahyapak.dev/llms-full.txt)
## Links
- Source: https://github.com/yahyabedirhan/shipyard
- Releases: https://github.com/yahyabedirhan/shipyard/releases/latest
- Changelog: https://github.com/yahyabedirhan/shipyard/blob/main/CHANGELOG.md
- Schema: https://raw.githubusercontent.com/yahyabedirhan/shipyard/main/schema/config.schema.json
---
# What it is
Your pull requests, issues, workflow runs, pings and notes, grouped by project in the menu bar, with one number for what needs you.
Coding agents open pull requests and issues and start workflow runs, often several at once across several repositories. shipyard lists them in the menu bar, from anyone, grouped into projects you name. The number beside its icon counts the items that need attention: new, changed since you last opened them, waiting on your review, or failing their checks.
It can notify you when something happens, and your agents can ping you when they need you. What it shows lives in one TOML file that you, or your agents, edit.
Notes:
- Clicking an item opens it on GitHub and clears its attention until it changes again. Closed items never need attention.
- There is no settings window. The file is the whole interface for settings, and each save applies at once.
---
# Install
Download the app, or build it from source. Then give your agents the skill.
You need macOS 14 or later and a GitHub account. Building from source also needs the Command Line Tools with Swift 6, from `xcode-select --install`
The download is `Shipyard--macos.zip` on the [latest release](https://github.com/yahyabedirhan/shipyard/releases/latest). It isn't notarized, so clear the quarantine flag before the first launch, as below.
### Download
Get the zip from the [latest release](https://github.com/yahyabedirhan/shipyard/releases/latest).
```sh
unzip Shipyard--macos.zip
mv Shipyard.app /Applications/
xattr -dr com.apple.quarantine /Applications/Shipyard.app
open /Applications/Shipyard.app
```
### From source
Builds, signs and installs the app, then opens it.
```sh
git clone https://github.com/yahyabedirhan/shipyard.git
cd shipyard
make install
```
### The agent skill
```sh
npx skills add yahyabedirhan/shipyard -g -y
```
Then ask your agent: "Watch this repo in shipyard".
To uninstall, choose **Sign out** in the gear menu if you signed in with GitHub, quit shipyard, and delete the app and its files. Remove the agent skill with `npx skills remove shipyard -g` if you installed it.
```sh
rm -rf /Applications/Shipyard.app ~/.config/shipyard ~/Library/Application\ Support/Shipyard
```
Notes:
- `make install` builds, signs and copies `Shipyard.app` to `/Applications`, then opens it. To update, run `git pull && make install` again.
- To update a download, replace the app with a newer zip. There is no automatic update.
---
# First run
Connect GitHub, choose a preset, and pick the repositories to watch.
shipyard lives in the menu bar, with no Dock icon. On first launch its panel asks you to connect GitHub: **Sign in with GitHub**, or use the [GitHub CLI](https://cli.github.com) if `gh` is signed in. It then offers three starting configurations, called presets, and asks which repositories to watch.
Click an item to open it on GitHub and mark it seen; **⌥-click** marks it seen without opening it. **↑**, **↓** and **Return** move through the items and open one, and **⌘R** refreshes. shipyard starts at login unless `launch-at-login = false`
The gear menu lists the parts shipyard uses: **Set up GitHub**, **Set up Notion**, **Set up /shipyard skill** and **Set up shipyard command**, with a check mark beside each one that is set up. Each opens a view of its status in the panel.
Notes:
- Sign in with GitHub uses GitHub's device flow: the panel shows a code to enter on github.com, and keeps the token in your Keychain.
- Every refresh spends a small share of your GitHub rate limit, 10% at most by default, since your agents share it.
---
# Presets
Three ready-made files for shipyard's main uses. Start from one, then change any key.
Onboarding writes the preset you choose into `config.toml`, with your repositories in place of the examples. It writes a preset only into a file that is missing or holds nothing but `version`, so it never replaces your settings.
### `my-agents`
Everything the user and their agents open in their repositories: pull requests and issues, grouped by kind, one project per repository. Notifications are the defaults: every new pull request, every ping and notice, and an agent starting or stopping with the app.
- For: the pull requests and issues the user and their agents open, one project per repository
- Asks for: the repositories to watch
```toml
#:schema https://raw.githubusercontent.com/yahyabedirhan/shipyard/main/schema/config.schema.json
# shipyard configuration, started from the my-agents preset: the pull
# requests and issues you and your agents open, one project per
# repository.
# You and your agents edit this file; shipyard applies changes live.
# Every key is optional; keys, defaults and events are in the schema above.
version = 1
# Group each project's items by kind: pull requests, then issues.
[defaults]
group-by = "kind"
# List issues too, not only pull requests, in every project.
[defaults.issues]
show = true
# Projects: one [[projects]] block per repository. Add more at the end.
[[projects]]
slug = "hello-world"
repositories = ["octocat/hello-world"]
[[projects]]
slug = "spoon-knife"
title = "Spoon-Knife"
repositories = ["octocat/Spoon-Knife"]
```
### `incoming-contributions`
What other people open on the user's repositories, with their own (and their agents') and bots' items hidden, grouped by repository under subheaders, and a second project of the pull requests waiting on their review in any repository. It notifies when someone else opens a pull request or an issue, on each new review request, on each ping and notice, and when an agent starts or stops using the app.
- For: the pull requests and issues other people open on the user's repositories, bots hidden, plus the pull requests waiting on their review anywhere
- Asks for: all their repositories (`owned`, as written below) or the ones they pick
```toml
#:schema https://raw.githubusercontent.com/yahyabedirhan/shipyard/main/schema/config.schema.json
# shipyard configuration, started from the incoming-contributions preset:
# the pull requests and issues other people open on your repositories,
# bots left out, and the pull requests waiting on your review anywhere.
# You and your agents edit this file; shipyard applies changes live.
# Every key is optional; keys, defaults and events are in the schema above.
version = 1
# Group each project's items by repository, each under a subheader.
[defaults]
group-by = "repository"
subsections = true
# List other people's pull requests: yours (and your agents') and
# bots' are hidden.
[defaults.pull-requests]
authors = { hide = ["me", "bots"] }
# List other people's issues too, hiding the same authors.
[defaults.issues]
show = true
authors = { hide = ["me", "bots"] }
# Notify when someone else opens a pull request or an issue, when
# one of your agents sends a ping or a notice, and when an agent
# starts and stops using the shipyard app.
[[defaults.notifications]]
event = "pr.opened"
authors = ["others"]
[[defaults.notifications]]
event = "issue.opened"
authors = ["others"]
[[defaults.notifications]]
event = "ping.sent"
[[defaults.notifications]]
event = "agent.notice"
[[defaults.notifications]]
event = "control.started"
[[defaults.notifications]]
event = "control.ended"
# Projects: one [[projects]] block each. owned is every repository
# your account owns, including ones you create later.
[[projects]]
slug = "incoming"
title = "Incoming"
repositories = ["owned"]
# The pull requests waiting on your review, or a team's you're in, in
# any repository. anywhere lists only those, so this project shows no
# issues, and it notifies each new request (and ping, and notice) instead.
[[projects]]
slug = "review-requests"
title = "Review requests"
repositories = ["anywhere"]
pull-requests = { review-requested = true }
issues = { show = false }
notifications = [
{ event = "pr.review_requested" },
{ event = "ping.sent" },
{ event = "agent.notice" },
]
```
### `review-queue`
Only the pull requests waiting on the user's review, or a team's they're in, in any repository, grouped by repository under subheaders. Each new request notifies, and so does each ping and notice.
- For: only the pull requests waiting on the user's review, in any repository
- Asks for: nothing
```toml
#:schema https://raw.githubusercontent.com/yahyabedirhan/shipyard/main/schema/config.schema.json
# shipyard configuration, started from the review-queue preset: only the
# pull requests waiting on your review, in any repository.
# You and your agents edit this file; shipyard applies changes live.
# Every key is optional; keys, defaults and events are in the schema above.
version = 1
# The pull requests waiting on your review, or a team's you're in, in
# any repository, grouped by repository under subheaders. Each new
# request notifies, and so does each ping and notice your agents send.
[[projects]]
slug = "review-queue"
title = "Review queue"
repositories = ["anywhere"]
pull-requests = { review-requested = true }
group-by = "repository"
subsections = true
notifications = [
{ event = "pr.review_requested" },
{ event = "ping.sent" },
{ event = "agent.notice" },
]
```
Notes:
- With the agent skill installed, an agent can start you from one too: "set shipyard up as a review queue".
---
# Layouts
Every project in one list, or one project at a time in tabs.
`layout = "list"` under `[menu]` shows every project in one scrolling list, one line per item under pinned project headers. `layout = "tabs"` shows one project at a time, with an All tab first. The layout button in the panel's header switches between them and writes the change to the file.
Within a project, `group-by` groups the items by kind, repository, date or author, or not at all; `sort-by` orders each group; `subsections` puts each group under a subheader; and `show-first` keeps each group to its first few rows, with a **Show N more** row for the rest.
```toml
[menu]
layout = "tabs"
```
```toml
[defaults]
group-by = "repository"
subsections = true
show-first = 4
```
Notes:
- The layout button is one of only three ways the app writes the file. The others are onboarding's preset and the project picker, which appends projects.
- The All tab always groups by kind, newest first. Each project's own tab follows its configuration.
---
# Config explorer
Pick a snippet and see what it changes, on a mock of the panel.
Each snippet below is a few lines of `config.toml`. The mock under it applies them to a small set of made-up items, so you can see what the keys do before you write them.
The page shows a mock panel for a few snippets. The keys they set are in [configuration.md](configuration.md).
Notes:
- The mock is drawn in HTML from these docs, not by the app. It follows the same rules for grouping, sorting and hiding, but it is not a screenshot.
---
# Pings and notices
Your agents tell you when they need you, and when there's news.
A **ping** is a short message an agent sends with `shipyard ping send`: a title, an optional body and sender, and at most one action. It's listed under the projects that watch the repository of the agent's working folder, needs attention until you click it, and posts a notification. Clicking it opens a link, brings an app forward, or focuses the agent's Herdr tab.
A **notice**, from `shipyard notice send`, is a status update that needs nothing from you, such as "tests running": a notification only, never listed, counted or kept. When in doubt, agents send a notice.
```sh
shipyard ping send "PR #57 is ready for review" --from claude --open https://github.com/my-org/shop/pull/57
shipyard ping send "Waiting for your input" --herdr --id shop-question
shipyard ping withdraw shop-question
shipyard notice send "Tests running" --from "claude · checkout" --id checkout-tests
```
### `shipyard ping send` flags
| Flag | What it does |
|---|---|
| `""` | the one line the menu and the notification show; quote it, it's one argument |
| `--body ` | more than the title fits, shown under it and in the notification |
| `--from