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 quitSections
The three sections always render in this priority order. Any section with no rows is hidden entirely.
| Section | What it shows |
|---|---|
| NEEDS YOU | Conflicts and worktrees in BLOCKED or ERROR status. This is the highest-priority section. |
| READY TO SHIP | Worktrees ready to merge, ordered by MergeManager.plan_merge_order(). Each row offers the [s]hip action. |
| IN FLIGHT | WORKING 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:
| Key | Verb | Action |
|---|---|---|
s | ship | Commit + merge + delete via a confirmation modal |
a | attach | Hand off to the worktree's session via the active multiplexer backend |
f | fix | Open the conflicted files in $EDITOR |
m | merge | Merge without delete or cleanup |
n | new | Create 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.
Navigation
| Key | Action |
|---|---|
↑ ↓ or j k | Move to the previous / next row, crossing section boundaries |
q | Quit 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) -> coroutinetable 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
- Multiplexer backends -- tmux and herdr, used by the attach verb
- Status tracking -- the statuses that drive the NEEDS YOU and IN FLIGHT sections