The Right Pane
The right pane is the half of Qubis that holds files. The chat column is where you talk about the work; the right pane is where you look at it, edit it, run it, and review it.

Sizes
The pane has three states, not a visible/hidden flag:
| State | Behaviour |
|---|---|
| Collapsed | Hidden. The chat column fills the content area. |
| Expanded | Shares the content area with the chat, split at a seam you can drag. The split is stored as a fraction, so resizing the window preserves the proportions. |
| Maximized | Fills the content area. The chat column and threads sidebar are suppressed. |
| Shortcut | Action |
|---|---|
| ⌘L / Ctrl+L | Toggle the pane |
| ⌃⌘F | Toggle maximized (macOS only — see Shortcuts) |
Because maximized implies visible, the pane can never be hidden while primed to reopen full-screen — there is no state where the toggle does something surprising.
Modes
The pane shows one of five things at a time.
| Shortcut | Mode | What it is |
|---|---|---|
| ⌘E / Ctrl+E | Editor | Text editor and every specialized viewer |
| ⌘D / Ctrl+D | Diff | The working tree's changes, read from git |
| — | Agents | The thread's sub-agents and its background work |
| ⌘J / Ctrl+J | Terminal | A shell in the workspace directory |
| — | Browser | An embedded webview |
Diff is a fixed chip at the head of the tab strip, ahead of the editor, terminal, and browser tabs — on a thread whose folder is inside a git working tree. Outside one there is no chip, ⌘D does nothing, and the pane opens on the editor instead. A browser tab opens with ⇧⌘B or from the tab strip's add-tab menu. Agents has no shortcut: reach it from the lightning chip in the title bar, the sub-agents chip above the composer, or Show Agents in the command palette.
Editor
A full text editor with tabs, splits, and language support.

Tabs and splits
| Action | Shortcut |
|---|---|
| New tab | ⌘T / Ctrl+T |
| Close tab | ⌘W / Ctrl+W |
| Reopen the last closed tab | ⇧⌘T |
| Previous / next tab | ⌥⌘← / ⌥⌘→ |
| Split horizontally | ⌘\ |
| Focus pane by index | ⌘1 … ⌘9 |
| Split vertically / close split | Command palette |
Panes tile in a split tree, so you can put a config file beside the 3D view of the geometry it references, or a solver log beside the case it came from.
Closing the last tab collapses the pane rather than switching it to another view, so the pane never lands somewhere you did not ask for.
Editing
| Action | Shortcut |
|---|---|
| Save | ⌘S / Ctrl+S |
| Save as | ⇧⌘S |
| Find | ⌘F / Ctrl+F |
| Find next | ⌘G |
| Find previous | ⇧⌘G |
| Find and replace | ⌥⌘F / Ctrl+H |
| Go to line | ⌃G (macOS only) |
| Undo / redo | ⌘Z / ⇧⌘Z |
| Select all | ⌘A |
| Jump back / forward | ⌘[ / ⌘] |
| Rename symbol | F2 |
| Run the current file | ⇧⌘R |
| Toggle comment | ⌘/ |
| Delete line | ⇧⌘K |
| Fold / unfold | ⇧⌘[ / ⇧⌘] |
| Request completion | ⌃Space |
| Go to definition | F12 |
| Next / prev diagnostic | F8 / ⇧F8 |
Search across the workspace is ⇧⌘F; ⌘F stays within the current file.
Language support
Qubis speaks the Language Server Protocol, so for languages with a server available you get diagnostics inline, hover documentation, completions, and symbol rename. Diagnostics also surface as underlines in the gutter and as a status chip in the title bar.
A language gets these only when a server for it is installed on your machine — see Environment Setup. Without one the editor still works; it just has nothing to report.
Themes
Nine editor themes ship in the box, switchable from the command palette: Qubis Dark, Qubis Light, Monokai, GitHub Dark, One Dark, Gruvbox Dark, Catppuccin Mocha, Solarized Dark, and Rosé Pine. The choice also drives the rest of the UI, so the app matches the editor rather than fighting it.
Diff
The thread's git working tree against its base branch, rendered as a review: every file whose content differs, however it was changed.

This is the pane to live in when the agent is doing real work. Because it reads git rather than the agent's own tool calls, a rename or a deletion made by a shell command shows up like any other change, and so does an edit you made yourself in the editor. Untracked files count; ignored ones do not.
The bar at the top names what is being compared — feature vs dev @ a1b2c3d,
the branch you are on against the base commit — and why that base was chosen,
chosen base or nearest trunk. Change base picks a different base
branch, and the choice is remembered for the current branch. The base is the
merge-base with that branch rather than its tip, so work landing on it after
you forked does not read as reverted. With no base branch to measure from the
bar reads vs HEAD and the diff is the uncommitted work.
Each file is Added, Modified, Deleted or Renamed, with its added and removed line counts, which become Open under the pointer — never on a deletion. A file with no text to show says so instead of a diff: Binary file, Too large to show with its size, Stored in Git LFS, or Could not read. A clean tree reads No changes.
Reviewing here is not optional discipline, it is the workflow. See Reviewing Changes.
Agents
Everything the thread has fanned out or left running, in one view: the sub-agents it dispatched, and under them its solver tasks and background commands.
The lightning chip sits beside Diff at the head of the tab strip while the pane
is open and the thread has one of those — and stays while the Agents view itself
is open, filled like the Diff chip, so dismissing the last agent does not pull
the chip out from under you. While the view is closed it carries a dot if a
sub-agent is waiting on an approval, and its tooltip sums both kinds of work.
With the pane closed there is no chip: the sub-agents chip above the composer
and Show Agents in the command palette open the view wherever the pane can
be shown, as does the agent's own prism_set_right_pane with agents. While it shows, the
file explorer and search rail is not drawn — the title bar's toggles read as
closed, and a click opens the panel.
The list splits into Active and Done, each with its count. A row is two
lines: its state glyph, accent dot, codename, and task title, with the elapsed
time at the right, then the model it is on, the tokens its last response
reported, and what it has done — 12 calls, or 12 calls, 2 running. An empty
Active section reads No active sub-agents.
Hover the token figure for the exact counts and the model they were measured
on. The sub-agent's own page spells the figures out on a chip — 8.2k in · 3.1k out · 47%, where the percentage is that sub-agent's context against its own
model's input budget, and turns amber past 80%. The figures come from the
sub-agent's last finished response, so one mid-turn shows what it had spent at
the previous one, and one that has reported nothing carries no figures at all.
stop on the Active header ends every live sub-agent and leaves the parent turn running; clear on the Done header and the ✕ on a finished row — Hide from Agents — hide them. A stop that could not be delivered says so in a banner on the thread, because that sub-agent's work may carry on; the composer's Stop is still the one that ends the turn. Hiding is not deleting: the transcript row it came from still opens the agent's page. Hiding the last one empties the view, so the pane goes back to whatever it was showing before Agents — per thread, so it still lands right after a thread switch, and a pane you had collapsed stays collapsed. Opened with nothing running, the view reads Nothing running.
Clicking a row opens that sub-agent as a page, and the page reads as a chat. The header gives its state glyph, accent dot, codename, and task, then chips for status, model, elapsed time, and usage, with stop while it is live. The header carries no reasoning line. Under the header is the conversation, drawn by the same transcript the chat uses: the task as the first message, each prompt it was given, what it said back as rendered markdown, and its tool calls as the same cards and folded runs you read in the chat. While the sub-agent runs, the reasoning line sits at the end of the conversation.
Agents at the top goes back to the list, and so does Esc while the pane is on screen and the composer below does not have focus.
A tool card here shows its result without the arguments, and an earlier message cannot be edited — send a new one instead.
Messaging a sub-agent
The page ends in a composer, the chat's own editor with nothing but the text and the send arrow. Enter or the arrow queues a message on that sub-agent's thread; the field stays filled until the agent service accepts it, and an error lands on the thread's banner. Drafts are kept per sub-agent, so switching between them never carries one's text into another, and messaging a sub-agent you had hidden brings it back into the list.
The sub-agent answers you in its reply rather than reporting to the thread that spawned it, so a conversation here does not wake the parent for every exchange. Its elapsed chip stops at the task's handoff, so talking to it afterwards does not add to the time. The agent is also told the codenames the pane shows, so "what did Leavitt find" reaches the right one from the chat.
Terminal
A real shell, rooted at the workspace directory.

- ⌘J / Ctrl+J / Ctrl+` shows it.
- ⇧⌘J spawns a new one.
The terminal owns its keyboard input while focused, so bare keys such as the arrows, Esc and Ctrl+C go to the shell rather than to Qubis. Command-chorded application shortcuts (⌘W, ⌘T, ⌘S) still work, so you are never stuck in a terminal that has swallowed Qubis's own shortcuts.
⌘- / Ctrl-clicking a URL in the output opens it. Only
https://, http:// and mailto: are treated as links: terminal output is not
trusted, so a printed file://, ssh:// or magnet: is plain text and opens
nothing.
This is your own shell, separate from the agent's. Anything you run here is not approved by, gated by, or visible to the agent.
Browser
An embedded webview, so documentation, a datasheet, or a supplier page can sit beside your work instead of in another application.

- ⇧⌘B opens a new browser tab.
- By default, links the agent produces open here rather than in your system browser. Turn that off in Settings → General if you would rather they went to your normal browser.
- Right-click an HTTP(S) link in chat to choose Open in External Browser or
Open in Qubis Browser.
mailto:links can only open externally. On Linux, the embedded browser is unavailable, so chat links open externally.
The toolbar
Above the page sit Back, Forward, and Refresh, then the address field.
A blank tab you open yourself lands with the field focused and the placeholder
Search the web or enter a URL — type either. An absolute local path works
too (/Users/you/report.html, C:\Users\you\report.html, or a UNC share) and
opens the file rather than going to a web search. On a loaded page the field
shows the address instead, with the origin emphasized and the rest of the URL
dimmed: a shield marks HTTPS, and a plain HTTP page is labelled Not secure.
Clicking the address selects the whole URL, so typing replaces it.
Esc abandons the edit and puts the live address back, and so does leaving for another tab. A redirect that lands while you are typing does not: your half-typed URL stays.
Back and Forward stay enabled once a tab has loaded anything at all, rather than greying out at the ends of history.
Agent control
The agent has browser tools of its own, which is how it looks something up without you pasting it in: it loads pages, reads them, and clicks, types, and navigates as you would.
The first time the agent loads a URL in the thread you are looking at, the pane comes up so you can see what is happening; later loads in the same session leave the pane alone, though each one still selects the agent's tab. The tab it is driving carries a soft purple outline in the tab strip, and a cursor overlay shows where it is about to act. The cursor animates with the page as it scrolls, and lands straight on the spot instead if your system asks for reduced motion. In the transcript three or more browser calls in a row collapse, by default, into one Used N browser actions row.
The outline and the cursor clear when the agent finishes, and on their own after about 25 seconds without a browser call.
The agent cannot read what you have typed: when it lists what is on screen, an editable field is labelled by its placeholder rather than its contents, and the headings-and-links outline leaves field and editor text out.
The embedded browser is not available on Linux builds. The shortcut and menu entry are removed there rather than left pointing at a pane that cannot do anything, and the agent is not offered browser tools either — on Linux it never tries to look something up in a pane that does not exist.