Canopydocs v0.4.7

The main window

One shell, five fixed regions. Nothing floats except dialogs and popovers.

The main window in the Runtime layout: top bar, sidebar, worktree bar, service rail, logs, status bar.The main window in the Runtime layout: top bar, sidebar, worktree bar, service rail, logs, status bar.
The main window in the Runtime layout: top bar, sidebar, worktree bar, service rail, logs, status bar.

Top bar#

The top bar: breadcrumb, command palette, running count, attention queue, Sync and Settings.The top bar: breadcrumb, command palette, running count, attention queue, Sync and Settings.
The top bar: breadcrumb, command palette, running count, attention queue, Sync and Settings.
ElementWhat it does
BrandThe Canopy mark and name. The bar is also the window's drag region.
Breadcrumbrepository › branch for the selected worktree. Hidden in the overview.
⌘K buttonOpens the command palette.
N running chipTotal running services across every worktree. Click it for the overview.
Agents chipAppears when an agent session is running. Click for the overview.
Needs you / All clearThe attention queue. Goes red when something crashed or a background job failed.
SyncRescans worktrees and reconciles ones deleted on disk. See below.
SettingsOpens Settings (⌘,).

What Sync does#

More than a refresh:

  1. refresh has the backend rediscover worktrees, git metadata and services.
  2. Open views are told to re-read each repo's .worktreemanager.json, so edits made outside the app show up in Settings under Setup, Files and Migrate.
  3. It lists prunable worktrees, meaning ones whose folders were deleted outside Canopy, and opens the prune dialog if it finds any. Canopy snapshots the tree before refreshing, because a vanished worktree's database name lived in its now-deleted .env and that snapshot is the last place it exists.
The sidebar: worktrees grouped by state, with quick actions on each row.The sidebar: worktrees grouped by state, with quick actions on each row.
The sidebar: worktrees grouped by state, with quick actions on each row.

The Filter field matches branch and repository name. A repository filter appears once you have two or more repositories, ending in Add repository… ⇧⌘N below a rule. All worktrees switches to the overview (⌘O).

A worktree being created has no row in the tree yet, so it gets its own in-progress row showing the live setup step. Same when one is being removed.

Rows are grouped into Needs you, Pinned, Running and Idle. Each group collapses and shows a count. A finished background job is news rather than a demand, so it never drags its worktree into Needs you.

Each row carries:

PartMeaning
Status dotgreen = every service running · amber = some live · red = a service crashed · faint = idle
BranchMonospace, the row's identity.
Dirty pipUncommitted changes in the worktree.
Agent pipRunning agent sessions, with a count past one.
PinPinned to the top group.
Quick actionsStart/stop all, open terminal, open in editor, pin, without opening the worktree.

To select several: -click toggles a row, -click extends a range, and a plain click clears the multi-selection. With a selection active the footer turns into N selected · Clear · Delete N, which opens the multi-remove dialog.

⌘B hides and shows the sidebar. Hidden, a toggle appears in the worktree bar, flush against the edge the sidebar just left.

Worktree bar#

One line, and the branch is the only part that stretches:

ElementNotes
Branch and fork glyphHover for the full worktree path.
Git chips↑ahead, ↓behind, dirty.
Open in editorUses the editor command from General settings.
⋯ menuSee below.
The reasonA lowercase fragment explaining the button beside it. First thing to give way on a narrow window.
Next actionOne button, named for what it will do. See The next action.
The worktree ⋯ menu: git operations, then file locations, then Remove worktree.The worktree ⋯ menu: git operations, then file locations, then Remove worktree.
The worktree ⋯ menu: git operations, then file locations, then Remove worktree.

In the ⋯ menu, in order:

  • Switch branch… ⌘\, if it's enabled in General settings.
  • Pull, the worktree and its submodules.
  • Sync submodules ⇧⌘S, re-pinning submodules to the commit this worktree records.
  • Run setup… for the provisioning runner.
  • Database… for the database tools.
  • Context… for the agent context editor.
  • Reveal in Finder and Copy path.
  • Remove worktree…, in red, and absent on the main checkout.

Service rail#

Everything the old service cards used to say, in one 34px row. Services and ports covers it in full.

The service rail: running services as filled chips, then the database chip and custom commands.The service rail: running services as filled chips, then the database chip and custom commands.
The service rail: running services as filled chips, then the database chip and custom commands.

Work surface#

The middle of the window is one or two panes, and each can show Logs, Terminal or Agent. Layout presets are a keystroke each:

PresetKeysPanes
Runtime⌘1Logs
Split⌘2Logs + Agent
Agent⌘3Agent
Shell⌘4Terminal + Logs
Terminal⌘5Terminal
The split layout (⌘2): logs on the left, the agent pane on the right, with a draggable divider.The split layout (⌘2): logs on the left, the agent pane on the right, with a draggable divider.
The split layout (⌘2): logs on the left, the agent pane on the right, with a draggable divider.

Swapping a pane's tab always works. If what you end up with isn't one of the five presets, the status bar calls it Custom. The divider drags between 22% and 78%.

Status bar#

The status bar: branch, git state, the last commit, and the Pull control with its submodule menu.The status bar: branch, git state, the last commit, and the Pull control with its submodule menu.
The status bar: branch, git state, the last commit, and the Pull control with its submodule menu.
ElementWhat it does
BranchOpens Switch branch when that action is enabled, otherwise it's plain text.
↑a ↓bAhead and behind origin.
uncommittedOpens the commit / stash / discard dialog.
Last commitRelative time and subject.
Pull + caretPull everything, or open the per-submodule popover.
Agent chipagent working or agent waiting.
LayoutThe current preset's name. Click to cycle (⌘1⌘5).
BellThe attention queue count.

In the overview the bar shrinks to All worktrees · N worktrees · M repositories plus the bell.

Empty states#

Every region has one, and each ends on a next step instead of an apology:

  • No repositories yet, with a button into the add-repository screen.
  • No services configured for this worktree, said by the rail, while the logs pane offers the next action instead of an empty stream.
  • No agent running here and No terminal open here, each with a line about what starting one gives you.

Text zoom#

⌘+ and ⌘- move the app's whole type ramp in 10% steps between 80% and 160%. ⌘0 resets it. It applies live in every Canopy window and it persists.

The main window at 130% text zoom.The main window at 130% text zoom.
The main window at 130% text zoom.

Documentation for Canopy 0.4.7. Controls marked coming soon are present in the interface but have no implementation behind them yet.