Docs

Everything you need to know, nothing you don't.

English | Català

Getting Started

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

Download DMG

Dockyard works best when these are installed (it’ll tell you if they’re missing):

  • Claude Code or Codex — pick the coding CLI you want in the Agent tab
  • git — you probably have this
  • gh — GitHub CLI, for PR status and quick actions
  • tmux — optional, enables session persistence

Your first 30 seconds

  1. Open Dockyard
  2. Drop a git repository onto the sidebar (or click + to pick one)
  3. Hit ⌘N to create a workstream
  4. That’s it. You’re coding with AI now.

No config files required. Dockyard detects your git setup, installed tools, and GitHub connections automatically.


Core Concepts

The three things you’ll interact with every day.

Projects

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).

Workstreams

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:

  1. Fetches the latest default branch from origin
  2. Creates a git worktree with a fresh branch (prefixed with your branch prefix, default: dy)
  3. Symlinks .env and .env.local from the main repo (if enabled)
  4. Runs the setup script (if configured)
  5. Launches the coding agent

The UI shows up instantly — worktree creation happens in the background.

Workstream tabs

  • Info — branch name, PR status, project docs
  • Agent (⌘Return) — your selected coding CLI session
  • Environment — setup and run script controls
  • Terminal (⌘T) — additional terminal tabs, as many as you want
  • Browser (⌘B) — embedded browser with auto-port detection
  • Editor (⌘O) — launches your configured terminal editor (e.g. Neovim) in a terminal tab

Branch auto-rename

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.

Removing vs. purging

  • Remove — kills terminals and agent, but the worktree stays on disk
  • Purge — permanently deletes the worktree and branch (asks for confirmation if there are uncommitted changes)

When a PR is merged, Dockyard shows a “Purge” badge so you know it’s safe to clean up.

The Coding Agent

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.

Agent settings

  • Bypass permission prompts — skips confirmation dialogs. Useful if you trust your agent (and live dangerously).
  • Tmux mode — wraps agent sessions in tmux so they survive app restarts. Requires tmux.
  • Auto-rename branch — lets Claude Code rename the branch to match the task.
  • Coding CLI — selects the coding CLI used in the Agent tab.
  • Agent Teams — experimental multi-agent coordination, currently available with Claude Code.

Quick actions

Quick actions run one-shot coding CLI tasks from the sidebar:

  • Commit — stages and commits with an AI-generated message
  • Push — pushes the current branch to origin
  • Create PR — creates a pull request with AI-generated title and description
  • Close PR — closes the PR

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.


Your Workspace

Terminals, browsers, editors, and shortcuts — the tools inside each workstream.

Terminals

Terminals are GPU-rendered via Ghostty. They’re fast.

  • ⌘T — new terminal tab
  • ⌘W — close tab (or Ctrl+D to exit the shell)
  • ⌘1 — Info, ⌘2 — Coding Agent, ⌘3-9 — switch between tabs
  • ⌘Shift+[ / ⌘Shift+] — cycle through tabs

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.

The Browser

Every workstream can have browser tabs (⌘B). The browser is embedded — no window switching needed.

Port detection

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.

  • ⌘L — focus the address bar
  • ⌘Option+B — open current URL in your external browser
  • ⌘Click — opens links in your external browser

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.

The Editor

Each workstream can have editor tabs (⌘O), launching your configured terminal editor command (e.g. nvim .) directly in a native Ghostty terminal tab.

Keyboard Shortcuts

Dockyard is keyboard-first. Here’s everything.

Global

Shortcut Action
⌘N New workstream (or project, if none exist)
⌘Shift+N New project
⌘, Settings
⌘/ Help
⌘Option+S Toggle sidebar
⌘Option+. Toggle sidebar width

Workstream

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

External Apps

Shortcut Action
⌘Option+B Open in external browser
⌘Option+T Open in external terminal

Configuration

How to automate the boring parts.

Scripts & Lifecycle

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).

The Environment tab

Split-pane layout: Setup on the left, Run on the right.

  • ⌘Shift+Return — start/restart the run script

Environment Variables

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

About DY_PORT

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.

Settings

Open with ⌘, or click the gear icon.

General

  • Base directory — default location for new projects
  • Branch prefix — prefix for workstream branches (default: dy)
  • Symlink .env files — auto-symlink .env and .env.local to worktrees
  • Theme — System, Light, or Dark
  • Language — System default, English and Catalan
  • Confirm before quitting — asks before closing with active workstreams
  • Launch at login — starts Dockyard on boot

Coding Agent

  • Bypass permission prompts — disables confirmation for agent actions
  • Agent Teams — experimental multi-agent mode
  • Auto-rename branch — agent automatically renames branch based on intent
  • Tmux mode — session persistence via tmux

Apps

  • External Terminal — which terminal app to open with ⌘Option+T
  • External Browser — which browser for ⌘Option+B and ⌘Click

Advanced

  • Detailed logging — logs script output for debugging
  • Quick action debug mode — shows raw output from quick actions
  • Bleeding edge updates — opt into pre-release builds
  • Clear project list — nuclear option, removes all projects from sidebar

Integrations

Connecting Dockyard to everything else.

CLI

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.

GitHub

Requires the gh CLI with authentication (gh auth login).

  • Project view — repo info, description, stars, forks, open issues, recent PRs
  • Workstream sidebar — PR number, title, and status (open/merged/closed) per branch
  • Merged detection — shows “Purge” badge when a branch’s PR is merged

Quick actions

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.

Updates

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.


Enterprise Features 😉

Full IDE

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?

Merge Viewer

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?


Troubleshooting

“Tools not found”

Dockyard detects tools from your login shell. If claude, codex, gh, git, or tmux aren’t showing up:

  • Make sure they’re in your shell’s PATH
  • Fish 4.0 and Nix users: the app handles these environments, but if something’s off, check Settings > Environment

Tmux sessions not persisting

  • Verify tmux is installed and detected (Settings > Environment)
  • Dockyard uses its own tmux socket (-L dockyard), so your personal tmux config won’t interfere

Port not detected

  • Make sure your run script uses $DY_PORT (or the port gets detected from the process tree)
  • The dy-run launcher wraps the run script — it monitors child processes for listening TCP ports
  • Check Settings > Advanced > Detailed logging for debug output

Something else broken?