Skip to content

The Control Plane is Open Orchestrator's UI -- a prioritized decision surface that surfaces the most important thing first. Launch it by running owt with no arguments. It is the only board; running owt with no subcommand opens it directly.

What is the Control Plane? ​

The Control Plane organizes everything that needs your attention into three sections rendered top-to-bottom in priority order. Empty sections are hidden, so the highest-priority work is always at the top of the screen and you are never scrolling past idle rows to find what matters.

  open-orchestrator · 4 rows · 14:32:08
  ▸ NEEDS YOU      (1)
  ▶ auth-jwt        merge conflict — needs manual resolution   [f] [a]
  ▸ READY TO SHIP  (2)
    fix-login       +3 commits · queued #1/2                   [s] [a]
    docs-update     +1 commits · queued #2/2                   [s] [a]
  ▸ IN FLIGHT      (1)
    api-refactor    45m · opencode · Refactoring REST routes   [a]

  ↑↓ nav | s ship | a attach | f fix | m merge | n new | q quit

Sections ​

The three sections always render in this priority order. Any section with no rows is hidden entirely.

SectionWhat it shows
NEEDS YOUConflicts and worktrees in BLOCKED or ERROR status. This is the highest-priority section.
READY TO SHIPWorktrees ready to merge, ordered by MergeManager.plan_merge_order(). Each row offers the [s]hip action.
IN FLIGHTWORKING agents, with elapsed time and the agent's last task message.

Because empty sections disappear, a quiet project might show only IN FLIGHT, while a project with conflicts puts NEEDS YOU at the very top.

Row Verbs ​

Each row advertises the actions available for its state in square brackets. The footer lists the keys:

KeyVerbAction
sshipCommit + merge + delete via a confirmation modal
aattachHand off to the worktree's session via the active multiplexer backend
ffixOpen the conflicted files in $EDITOR
mmergeMerge without delete or cleanup
nnewCreate a new worktree (interactive)

The [a] attach verb hands you off through the active multiplexer backend -- tmux by default, or herdr when enabled.

Starting work from the UI ​

Press n to create a new worktree without leaving the board. The new-worktree modal lets you pick how the agent starts -- a standard session, or a native Claude workflow (plan-first), which is the equivalent of owt new --workflow (plan mode + a plan-then-execute protocol). The modal previews the exact owt command before it runs.

KeyAction
↑ ↓ or j kMove to the previous / next row, crossing section boundaries
qQuit the Control Plane and return to the terminal

Navigation flows across all visible rows regardless of which section they belong to, so you can step from a NEEDS YOU row straight into READY TO SHIP without changing modes.

Header Bar ​

The header bar shows the project name, total row count, and a live clock (for example, open-orchestrator · 4 rows · 14:32:08).

How Empty Sections Are Hidden ​

Section builders are pure functions in core/control_plane_sections.py. Each builder returns the rows for its section; a section that produces zero rows is not rendered at all. This keeps the surface focused: the layout collapses to only the sections that currently have something to act on, and the most important non-empty section is always first.

Architecture ​

The Control Plane separates concerns across three modules:

  • core/control_plane_sections.py -- pure section builders that turn live state into rows.
  • core/control_plane_actions.py -- the action dispatcher, a (SectionKind, RowAction) -> coroutine table that maps a row verb to the work it performs.
  • core/control_plane_view.py -- the Textual view, which only knows about rows and key presses.

This split keeps the view dumb (rows in, key presses out), makes section logic unit-testable in isolation, and lets new verbs be added to the dispatcher table without touching the view.

See Also ​