Everything you need to know, nothing you don't.
English | CatalÃ
The year is 2026. We build on tmux (2007), git worktrees (2015), terminals (1978, the VT100 era, when even Francesc was only a future project), and GPU rendering (thanks Mitchell for Ghostty). Old tools, new tricks.
You need two things: a Mac and a vague sense that your current workflow could be better.
brew install --cask barnolacesc/tap/dockyard
Dockyard works best when these are installed (it’ll tell you if they’re missing):
No config files required. Dockyard detects your git setup, installed tools, and GitHub connections automatically.
The three things you’ll interact with every day.
A project is a git repository. Drop a directory on the sidebar or click the + button. Dockyard checks if it’s a git repo (and offers to initialize one if it’s not).
The project overview shows repository info, GitHub details (stars, forks, open issues), up to 5 recent PRs, and auto-discovered markdown documentation from your repo.
Projects sort by Recent (last activity) by default. Toggle to A-Z if you’re that kind of person.
Right-click a project in the sidebar for quick access: Reveal in Finder, Open in External Terminal, Open on GitHub, or Remove (files stay on disk, we’re not monsters).
A workstream is where the work happens. Each one gets its own git worktree, branch, terminal, coding agent, and browser tab. They’re completely isolated from each other.
⌘N creates a new workstream. Behind the scenes:
dy).env and .env.local from the main repo (if enabled)The UI shows up instantly — worktree creation happens in the background.
With Auto-rename branch enabled in settings, the coding agent automatically renames your branch to match your current task based on your prompts. So dy/coral-tidal-reef becomes dy/fix-login-timeout.
When a PR is merged, Dockyard shows a “Purge” badge so you know it’s safe to clean up.
The coding agent tab runs Claude Code, Codex, OpenCode, or Antigravity CLI in an embedded terminal. Choose the CLI in Settings, then use the same Agent tab in every workstream.
Quick actions run one-shot coding CLI tasks from the sidebar:
These run as background commands using the selected coding CLI where supported. Enable Quick action debug mode in settings if you want to know how the sausage is made. Trust us, Francesc spent more time than he can admit debugging weird behaviors in there.
Terminals, browsers, editors, and shortcuts — the tools inside each workstream.
Terminals are GPU-rendered via Ghostty. They’re fast.
You can drag files and text onto the terminal. Because sometimes the mouse is fine, actually.
⌘Option+T opens the workstream directory in your preferred external terminal app.
Every workstream can have browser tabs (⌘B). The browser is embedded — no window switching needed.
When your run script starts a dev server, Dockyard detects the listening port automatically and navigates the browser to it. No configuration needed. The dy-run launcher monitors the process tree for TCP listeners.
The browser shows a connection error page with a retry button if the server isn’t ready yet. It’ll auto-navigate once the port is detected.
Each workstream can have editor tabs (⌘O), launching your configured terminal editor command (e.g. nvim .) directly in a native Ghostty terminal tab.
Dockyard is keyboard-first. Here’s everything.
| Shortcut | Action |
|---|---|
| ⌘N | New workstream (or project, if none exist) |
| ⌘Shift+N | New project |
| ⌘, | Settings |
| ⌘/ | Help |
| ⌘Option+S | Toggle sidebar |
| ⌘Option+. | Toggle sidebar width |
| Shortcut | Action |
|---|---|
| ⌘1 | Info |
| ⌘2 | Coding Agent |
| ⌘3-9 | Switch tab |
| ⌘Shift+[ | Previous tab |
| ⌘Shift+] | Next tab |
| ⌘Return | Focus Coding Agent |
| ⌘T | New Terminal |
| ⌘B | New Browser |
| ⌘O | New Editor |
| ⌘W | Close tab |
| ⌘Shift+W | Archive workstream |
| ⌘L | Address bar (browser) |
| ⌘Shift+M | Toggle mobile view (browser) |
| ⌘Shift+Return | Start/Rerun |
| Shortcut | Action |
|---|---|
| ⌘[ | Previous workstream |
| ⌘] | Next workstream |
| ⌘↑ | Previous project |
| ⌘↓ | Next project |
| ⌘0 | Back to project |
| Shortcut | Action |
|---|---|
| ⌘Option+B | Open in external browser |
| ⌘Option+T | Open in external terminal |
How to automate the boring parts.
Drop a .dockyard.json in your project root to automate the workstream lifecycle.
{
"setup": "npm install",
"run": "PORT=$DY_PORT npm run dev",
"teardown": "docker-compose down"
}
| Hook | When it runs |
|---|---|
setup |
Once, when a workstream is created. Install dependencies, run migrations, whatever. |
run |
On demand via the Environment tab. Wrapped in dy-run for port detection. |
teardown |
When a workstream is archived or purged. Stop containers, clean up. |
All fields are optional. Scripts run in the workstream directory using your login shell. Yes, even fish. Don’t ask how long that took.
Dockyard also reads .emdash.json, conductor.json, and .superset/config.json if .dockyard.json doesn’t exist. Because compatibility is polite. (Time for a standard?) When using a fallback config, Dockyard injects compatibility environment variables so scripts work without modification (e.g. CONDUCTOR_PORT, EMDASH_PORT, SUPERSET_PORT_BASE).
Split-pane layout: Setup on the left, Run on the right.
Every terminal, setup script, and run command in a workstream has these variables:
| Variable | What it is | Example |
|---|---|---|
DY_PROJECT |
Project name | my-app |
DY_WORKSTREAM |
Workstream name | coral-tidal-reef |
DY_PROJECT_DIR |
Main repository path | /Users/you/my-app |
DY_WORKTREE_DIR |
Worktree path | ~/.dockyard/worktrees/my-app/coral-tidal-reef |
DY_PORT |
Deterministic port (40001-49999) | 42847 |
DY_DEFAULT_BRANCH |
Default branch (main, master, etc.) | main |
Each workstream gets a deterministic port based on a hash of the worktree path. Same workstream, same port, every time. No port conflicts between workstreams. Use it in your run script: PORT=$DY_PORT npm run dev. If your thing is running thousands of workstreams simultaneously, you might get a collision 🎲 but hopefully you run out of memory first.
When enabled (Settings > General), Dockyard symlinks .env and .env.local from your main repo into each worktree. So your secrets follow you without copy-pasting.
Open with ⌘, or click the gear icon.
dy).env and .env.local to worktreesConnecting Dockyard to everything else.
Install the dy command from Settings > Environment > Install CLI. Then:
dy /path/to/your/project
Opens the directory in Dockyard. That’s all it does, and that’s all it needs to do.
Requires the gh CLI with authentication (gh auth login).
From the sidebar, run one-click operations: Create PR (AI-generated title and description), Push (to origin with -u), or Close PR (closes with a comment). Because if you’re tired of typing “now commit, push, and open a PR” into your agent for the hundredth time, you’re not alone.
Dockyard shows a badge in the sidebar when a newer version is available. You can also check manually from Dockyard > Check for Updates…
Homebrew users:
brew upgrade dockyard
DMG users: updates are handled automatically via Sparkle. Check manually from the menu: Dockyard > Check for Updates…
Enable Bleeding edge updates in Settings > Advanced for pre-release builds. For those who like to live on the edge and file bug reports.
Nope. There’s a built-in editor (⌘O) for quick looks and small edits — but we’re not building an IDE. For serious editing sessions, you should be using the tools you already love: Zed, VS Code, whatever. Dockyard gives you a coding agent, a browser, a worktree, and just enough editor to not have to leave. Besides, who’s writing code anymore?
Also nope. Your git client already does this better than we ever would. We just make sure each workstream has a clean branch ready for review. You are keeping your PRs small and avoiding merge conflicts, right? …Right?
Dockyard detects tools from your login shell. If claude, codex, gh, git, or tmux aren’t showing up:
-L dockyard), so your personal tmux config won’t interfere$DY_PORT (or the port gets detected from the process tree)dy-run launcher wraps the run script — it monitors child processes for listening TCP ports