13 · Docs — keys & slash

You don't memorize this list. The popover does.

Every command in the office sits behind one discovery surface: type / and narrow. The tables below are the reference copy — grouped by where your hands already are.

The discovery surface

The slash popover is how you find everything.

/ at a word start opens the picker. Keep typing to narrow it: /th filters to /theme, /themes, /thinking. Arrows move through the matches, enter or tab accepts, esc walks away clean with no side effects. Arrowing through the /theme matches applies each theme as a live preview while you pass it — accept and it sticks; escape and the office settles back to what it was.

That popover is the intended way to learn the office — the reference table further down this page is what it is filtering.

theboringfloor slash command popover: typing /th filters the command list to theme and thinking commands
slash popover — /th narrows the list; arrows move, enter accepts
Key table

The keys, by where your hands are.

Navigation

q / ctrl+cquit the office
ctrl+qarm quit — works everywhere, embedded terminal included

Panes

tab / shift+tab / 1..8switch panel: chat · terminal · agents · board · mail · activity · git — only while shell-captured (ctrl+space) are these NOT intercepted
up / down / pgup / pgdn / wheelscroll the active panel
enter / click a filegit tab: open its colored unified diff — b / esc back to the list, r refresh

Chat composer

entersend to the boss — free-sends into the backlog while the boss is busy
shift+enter / ctrl+jnewline — ctrl+j covers terminals that deliver shift+enter as a bare enter
@at a word start: attach-file picker — type to filter, arrows choose, enter / tab attach, esc close
ctrl+vpaste text — attaches the image instead when the clipboard holds one
paste >20 lines / >2000 charscollapses to a one-line [pasted N lines · M chars] chip — deletes as one backspace unit, expands back to the full text on send
backspaceon an empty input: drop the newest attachment chip
y a n escanswer a permission prompt — allow once / always / reject / defer
ctrl+ptoggle plan/build mode — the plan pane opens once a plan has content
ctrl+x twiceplan mode: confirm and approve the current draft → sent to the build agent

Attachments stage as dim paperclip chips above the input — capped at five, the oldest drops past the cap — ride the message queue like text, and go out as prompt file parts; the echoed bubble shows an attachment-count suffix. /clear or a send clears the chips.

Pastes route to the focused surface, one deliberate path. In the chat input a paste over twenty lines or two thousand chars collapses to a one-line [pasted N lines · M chars] chip — it deletes as a single backspace unit and expands back to the full text on send. A question dialog's free-answer field takes a multi-line paste verbatim. The terminal tab wraps the paste in bracketed-paste markers for the shell. And picker filter inputs — /model, /session, @ — take paste as filter text.

Threads

ctrl+gexpand / collapse a worker thread inline in the chat
ctrl+fopen the most recent worker thread as a fullscreen focus pane — esc / ctrl+f closes back, office state byte-identical
ctrl+texpand / collapse completed thinking blocks
ctrl+dexpand / collapse diff blocks

Terminal tab

ctrl+spacetoggle shell keyboard capture both ways — released is the default, leaving auto-releases
ctrl+orelease shell capture (alias — release only, never a dive)
rrespawn the shell when it dies
drag + releaseselect terminal text; release copies, · Copied N chars rides the badge row
esc / typingcancel the selection highlight
pasteinto the shell, wrapped in bracketed-paste markers — readline / zle safe

Browser tab

ctrl+efocus project floors; Escape or Tab returns to tools
ctrl+nnew conversation: title, team, and backend
ctrl+rsearch the loaded transcript, keeping your draft
ctrl+wexpand tools while keeping floors on the far left
ctrl+bflip the middle pane between the office and browser
up / down / j / kmove the link cursor
oopen the focused link — a file rides to the OS browser, http(s) navigates in place
einline URL editor in the location bar — prefilled, enter opens, esc cancels
O (shift+o)open the current page in the OS browser
[ / ]back / forward in the 100-page history ring, scroll offsets restored
rreload in place, no duplicate history
pgup / pgdnscroll the body
q / escback to the floor
The model picker

/model swaps the boss's brain, /submodel swaps a role's — both write back.

Find /model in the popover — it opens the active backend's own native catalog. Each backend takes its own reference format: OpenCode wants provider/model (e.g. anthropic/claude-sonnet-4-5), Claude Code takes a native alias (sonnet, opus[1m]), Codex takes its own tokens (e.g. gpt-5.4). If discovery is unavailable, hand it that reference directly: /model <native-ref>. Either way the command writes back to brain.json like /power and /theme do, so the next boot keeps it.

/submodel is the same idea one level down: pick a native agent type, then its model, where the backend supports one. /submodel <agent> opens that type's picker, /submodel <agent> <native-ref> sets it directly. Native agent names come from the backend itself, not the floor roster's roles.

One honest caveat, and it's per backend rather than one blanket line: OpenCode fails the send outright if a saved model turns out invalid, rather than silently retrying without it. Claude Code injects a saved per-agent model at dispatch through a PreToolUse hook. Codex has no native per-role model support at all — /submodel refuses a per-agent choice there with an explicit error instead of pretending to honor it. The full breakdown, catalog by catalog, lives on model selection.

The picker filters as you type: a filter: … row shows the live query, the title badge runs N/M (narrowed of total), a dead query says (no matches), backspace edits, ctrl+u clears, and esc clears a live filter first — a second esc closes the picker. Pastes land in the filter too. The /session picker and the @ attach picker filter the same way.

theboringfloor /model command: picking the boss model from the active backend's native catalog
/model — the boss model, picked from your backend's own catalog
Slash reference

The full command table, grouped.

These are office commands — anything the picker doesn't list is sent to the boss as plain text.

Agent context-recovery tool

⟦recent-messages⟧ / ⟦recent-messages: N⟧agent-only marker, on its own line and once per reply — recover the latest 20 messages by default, or N clamped to 1..50; read-only and no permission prompt

Agent plan tools

⟦plan-present⟧ … ⟦/plan-present⟧agent-only multiline block — fills the plan pane as a draft for member review or editing; it does not run work or approve the plan
⟦plan-update⟧ … ⟦/plan-update⟧agent-only multiline block — refreshes the plan pane with a new draft; an update never replaces the latest approved plan on its own
⟦plan-get-approved⟧agent-only marker on its own line — sends the latest approved plan back to the agent; it never substitutes a draft

Plan drafts and updates are only review material. In plan mode, review or edit the pane, then press ctrl+x twice to approve it for the build agent. The approved plan persists across sessions, bounded to 20,000 runes; drafts do not replace it until you approve them. See plan mode for the full workflow.

⟦plan-present⟧
# Goal
Describe the work to review.
⟦/plan-present⟧

⟦plan-update⟧
# Goal
Describe the revised draft.
⟦/plan-update⟧

⟦plan-get-approved⟧

The queue

/queue [clear]show the backlog — clear drops it
/routeforce-dispatch the backlog as one [BATCH DISPATCH] now

The work

/stopabort current work (boss + workers)
/newfresh office — the transcript is archived
/sessionpast-sessions picker; switch the office live
/backendprint the active LLM transport; swap opencode/claudecode/codex while idle
/statusoffice status
/mcp [reconnect <name>]MCP server status; reconnect one server

Popovers

/permre-open an esc’d permission prompt
/questionre-open a deferred boss question

Permissions

/bypasstoggle session-scoped bypass-permissions — confirm to enable, instant off

Bypass permissions. /bypass is the deliberate escape hatch: agents run tools and browser actions without asking, for this office session only. Enabling asks for an explicit confirm first; disabling is instant. While on, every tab's topbar carries a loud ⚠ BYPASS segment, and any ask that still slips through — including the office's own browser-action prompt — is auto-approved with a dim log row in the transcript. Toggling respawns the backend so the mode actually reaches the agent (claude resumes your session context), and every boot starts with bypass OFF. On opencode the office-owned child receives an ephemeral OPENCODE_CONFIG_CONTENT allow-all override; the member's .opencode/opencode.json, parent environment, and brain.json stay byte-identical. Claude writes nothing at all. The full story lives with the permissions docs.

Display

/theme <name>switch theme (persists)
/themeslist themes
/thinking on|offshow / hide thinking blocks
/tools on|offshow / hide tool one-liners
/diffs on|offexpand / collapse file diffs
/clearempty the chat

Floor & power

/compact on|offcompact layout, this session
/mode normal|compactlayout mode (persists)
/wide 26..100sidebar width — 0 restores the default of 80
/zenfullscreen floor, any key exits
/focus flooralias of /zen
/power auto|performance|saverthe power governor — how hard the office renders

Boss & memory

/model [native-ref]boss model — the active backend's own catalog, persists per backend
/submodel [agent] [native-ref]model for one native agent type, where the backend supports it
/memory [filter]completed dispatches from the project ledger, newest first

Meta

/helpthe command list, in-app
/quitexit theboringfloor
Sounds & clipboard

Two quiet channels worth knowing.

Sounds. The office has a small vocabulary of synthesized chimes — queued, send, reply, done, dispatch, alert, error. ui.sounds in brain.json takes on, bell or off, and THEBORINGFLOOR_MUTE=1 silences it from the environment. The sounds library plays every chime and serves the WAVs.

The clipboard. Drag-select over the chat transcript and the span copies through the terminal's OSC52 clipboard on release, with a transient Copied N chars note on the status bar; esc or a plain click clears the highlight. The terminal tab adds pbcopy, wl-copy, xclip or xsel ahead of OSC52 — the details live with the terminal tab docs.

Ceilings

What this doesn't do yet.

  • Keys are fixed. brain.json has no remap key — the table above is the table.
  • Attachments are files and images. The @ picker and ctrl+v image paste are the whole staging surface.
  • OSC52 depends on the terminal. A terminal that strips OSC52 keeps the host-clipboard paths only — the copied note stays honest, the pasteboard stays empty.