VCode home

Split the window into panes

Agents: claude, codex, opencode · On: desktop

On a wide window the conversation area splits into panes, side by side or stacked: up to six across and six down. Each pane holds some of your open tabs and shows one of them, with its own plan and subagents strips as header rows, its own composer, and its own status line inside that box. The window is a row of columns, and a column is one pane or a stack of them: every horizontal line belongs to one column, so each column's heights are its own. You drag a tab from one pane to another, and you drag the line between two panes to give one of them more room.

Why you would use it

You are watching one agent work while you type to another, or reading a review in one tab against the code in the next. On one pane that is a tab switch every few seconds, and you lose your place in both.

How to use it

Panes need a window at least 760px wide. Below that the app is the phone layout and the split buttons do nothing.

  1. Click Split right in a pane's header (data-act="split-right") to put a second pane beside that one, or Split down (data-act="split-down") to put it underneath. Split right makes a column the full height of the window, beside the whole stack the pane is in; split down cuts the pane itself in two. The new pane takes the next open tab that no pane is showing; with no tab left it opens the new-thread card.

    Two panes side by side, each with its own tab strip, the left one focused.

  2. Drag a tab out of its pane's strip and onto another pane's tab strip. A blue caret stands on the seam the tab would go into, the copy of the tab rides in the lane under the pointer, and the tabs from the seam on slide aside to open a gap as far as the strip has room for one.

    A tab dragged into the right pane's tab strip: its tab slid right, a blue caret on the seam, the copy of the dragged tab in the gap.

    Let go and the tab lands exactly where the caret stood. It leaves the strip it came from, and the pane it landed in takes the focus. A pane whose last tab you dragged away stays where it is, empty, ready for a new thread or another tab dropped back into it. An empty pane is the phone's new-thread page: the VCode logo over a round plus over new thread, and no composer or stub under it. The pane itself sits a shade darker than the panes beside it, so you can see which one holds nothing without reading its strip. Click anywhere on it and the new-thread card opens; the thread it starts lands in that pane.

    The left pane empty after its last tab was dragged out, darker than the pane beside it: the VCode logo, a round plus and "new thread" in the middle, no footer, the right pane holding every tab.

    The dragged tab now first in the right pane's strip, the left pane down to one tab.

  3. Or drop it on the body of a pane rather than its strip. The whole pane lights up: over the middle the tab joins that pane's tabs at the end of its strip, over the top or bottom edge the highlight is that half of the pane and the drop splits it there. Over the left or right edge the highlight is that half of the pane's whole column, the full height of the window, which is where the new column goes.

    A tab dragged over the middle of the right pane, the whole pane outlined in blue and the copy under the pointer.

  4. Drag the line between two panes to move it: sideways for panes side by side, up and down for stacked ones. Only the two panes the line sits between change size; every other line stays where it is. The pointer turns into a resize cursor over the line, the panes follow it as you drag, and where you let go is remembered with the rest of the layout. The line goes where your hand goes, wherever on the band you took hold of it, and neither pane goes below 160px. Come within 8px of another pane's line running the same way and the drag lands on it instead of on the pointer, so the two line up exactly; the handle brightens while it is held there.

    Two panes with the line between them dragged left, the left pane narrowed and the line lit under the pointer.

  5. Click anywhere in a pane to focus it. The usage meters and the file explorer follow the focused pane, and so does the composer.

  6. Write in a pane by clicking its composer. A pane that does not have the box shows a stub the same size with a dashed edge, so the footers of every pane line up and nothing moves when the focus does. It reads whatever was typed into that pane's thread, up to the one line the box opens at here, or that thread's own line when nothing was: ask Claude…, ask Codex…, run a shell command… for a pane left in shell mode, and while that thread's turn runs use the wheel to steer or queues until this turn ends, whichever its agent allows. The keys stay too: the stub draws that pane's own attach, agent, model and effort keys, its status line, its mic and its send, where the box draws them, so a pane you are not typing into still says who answers in it, on which model, and on which branch. They are a picture — the tap that reaches them focuses the pane — and a pane with no thread in it shows them dimmed. Clicking the stub focuses the pane, and the box arrives with the caret already in it.

    Two panes, the left one focused with the composer, the right one showing its own status line and the message typed into it.

    An unfocused pane's stub: the message typed into that thread above its keys, with the status line between the effort dial and the mic.

  7. Each pane's header has the same four buttons: split right, split down, zoom (Zoom pane) and close (Close pane — the tab stays open). Closing a pane closes no tab: its tabs move to the pane that has the focus. On a zoomed pane the zoom button turns into Zoom out, with its corners pointing in; press it to bring the other panes back.

  8. The keyboard, tmux style. Ctrl+B then:

    Key What it does
    % Split right
    " Split down
    ← → ↑ ↓ Focus the pane that way
    o Focus the next pane
    z Zoom the focused pane, or unzoom
    x Close the focused pane

    Without the prefix: Alt+Shift and an arrow moves to the pane that way (⌘⌥ and an arrow on a Mac). Ctrl+D splits right and Ctrl+Shift+D splits down (⌘D and ⇧⌘D on a Mac). Ctrl+PageDown and Ctrl+PageUp move through the focused pane's own tabs. Ctrl+T and Ctrl+N open a new thread in the focused pane, and Ctrl+P the files (⌘ on a Mac). Bare, the same two keys page the focused pane's transcript.

What you see

Options and settings

Option Default What it changes
Panes across at most 6 MAX_ACROSS in public/split-layout.js
Panes down at most 6 MAX_DOWN, so MAX_LEAVES is 36
Smallest pane 160px MIN_PANE, what a divider drag stops at
Snap reach 8px SNAP_PX, how near another line a drag lands on it
Prefix window 1500ms How long Ctrl+B waits for the key after it
localStorage wb.panes absent The saved tree. Absent is one pane

Limits and known gaps