Qubis›The Interface

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.

Chat on the left, the right pane showing an editor, with the draggable seam between them.

Sizes

The pane has three states, not a visible/hidden flag:

StateBehaviour
CollapsedHidden. The chat column fills the content area.
ExpandedShares 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.
MaximizedFills the content area. The chat column and threads sidebar are suppressed.
ShortcutAction
⌘L / Ctrl+LToggle the pane
⌃⌘FToggle 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.

ShortcutModeWhat it is
⌘E / Ctrl+EEditorText editor and every specialized viewer
⌘D / Ctrl+DDiffThe working tree's changes, read from git
—AgentsThe thread's sub-agents and its background work
⌘J / Ctrl+JTerminalA shell in the workspace directory
—BrowserAn 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.

The editor with two tabs open and a vertical split.

Tabs and splits

ActionShortcut
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 splitCommand 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

ActionShortcut
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 symbolF2
Run the current file⇧⌘R
Toggle comment⌘/
Delete line⇧⌘K
Fold / unfold⇧⌘[ / ⇧⌘]
Request completion⌃Space
Go to definitionF12
Next / prev diagnosticF8 / ⇧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.

The thread diff, with several changed files and per-hunk additions and deletions.

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.

The terminal in the right pane, running a command in 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.

The embedded browser showing a documentation page beside the chat.

  • ⇧⌘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.