Tabs, panes and windows

At rest Opsty is one row of frosted glass above your shell. Each tab in it has a lamp before its name and a few words after it that say what it is doing, so you can look away and still know.

The tab strip: each tab named for its folder, with its lamp before the name and what it is doing after it, and Opsty’s few buttons at the right.

The window, left to right

  • Tabs. Each is named for the folder its shell is in, or the server it is on. New tab, the + after the last tab, opens one (⌘T). The × on a tab, a middle click or ⌥⌘W closes it; ⌘W closes the pane in front, then the tab, then the window. Nothing asks. If something is still running there, the tab goes at once and what it was running carries on, hidden, for ten seconds: a note in the corner says so, Closed doclife, with Undo (⌘Z) and Stop it now. Reopen closed tab (⇧⌘T) brings it back too; after the ten seconds it brings back its folder and a dimmed copy of what was on screen. Settings ▸ General ▸ Keep closed tabs running for sets the time.
  • Dragging a tab. Drag it along the strip to reorder it; a gap opens where it will land. Hold it over another tab and that tab opens; drop it on a pane and it becomes a split there, on the side you choose: Split right, Split down, Split left or Split up. Drag it out of the strip and let go on the desktop and it becomes a window of its own (see Windows). Wherever it goes, its shells and whatever runs in them carry on. Double-click a tab to rename it, and right-click it for its menu.
  • Hovering a tab you have not looked at for a while shows what it did meanwhile, the same line as the away panel.
  • Running appears while something is running. It counts what is running and, in violet, what needs you, and opens the Running list.
  • 0.4.1 ready appears only when an update has downloaded. See Updates.
  • Connect and History open the launcher on your servers or on everything you have run, and the magnifying glass (Find) opens it on everything. See the launcher.
  • The last button (Settings) opens the Settings window.
doclife’s tab, closed a moment ago with its server running. The tab has gone; the note says the server is still running, hidden, and still holds port 3000, and counts down the seconds left to undo it.

While the window is down as the Quick Terminal, a Hide · ⌥Space button at the right of the strip puts it back. See Quick Terminal.

Every command is in the launcher (⇧⌘P), and nearly every one is in the menu bar too. The three that are not are Copy for an AI chat and Copy as image, which are on each command’s own menu, and Put the opsty command on your PATH, which is also in Settings. ⌘/ lists every shortcut.

The line under the grid

A hint line appears under the grid only when there is something to say:

  • while an agent is in front: ⇧↵ new line, and a ✎ Write a message button (see Running an agent);
  • while a program is using the mouse: An application is using the mouse, and that holding ⌥ lets you drag to select text;
  • when Opsty’s shell integration did not load: Opsty’s help did not load in this shell — no command cards and no blocks., with See why (see Shell integration).

Everything that floats over the grid, such as the Tab popup, the cards, the Running list and the sheets, is the same glass: a clear edge around a dense center that stays readable over any background, with a small lip pointing at the line it belongs to. Only one floats at a time, and none is ever drawn over the line you are typing.

Splits

Window ▸ Split right (⌘D, or ⌘\) and Split down (⇧⌘D) split the pane you are in. ⌥⌘←, ⌥⌘→, ⌥⌘↑ and ⌥⌘↓ move to the pane on that side, ⌘] and ⌘[ walk them in turn, and the divider between two panes drags. Each pane is its own shell with its own lamp, and a split tab shows how many panes it has after its name.

A tab split three ways: doclife’s dev server on the left, its tests and a shell on the right. The tab shows 3 after its name; the pane with the keyboard is the bright one.

Bring the pointer to the top of a pane’s left margin and a small grip appears there. Click it, or right-click anywhere in the margin, for the pane’s menu; drag it to move the pane to another tab, another pane, another window or out onto the desktop. Dropping a pane on the middle of another one swaps the two.

  • Move pane to new tab takes a pane out of its split and gives it a tab of its own, right after its old one, still running. That is how you unsplit without losing a shell. Split into tabs does it for every pane of the tab at once, and a tab’s Join as a split with ▸ puts one tab back into another as a split.
  • Maximize pane (⇧⌘⏎) lets one pane fill its tab until you press it again. The others keep running, and the tab says 1 of 3 where the pane count was. If a hidden pane’s agent asks you something, that mark turns to its lamp; click it to see the panes again with that one in front.
  • Equalize panes (⌃⌘=, or double-click a divider) evens out the sizes, and Resize pane ▸ (⌃⌘→ and the other arrows) grows the pane in front toward the arrow.
  • Swap with ▸, in the pane’s menu, exchanges two panes’ places.
The same tab with the server maximized: where the pane count was, the tab says 1 of 3. Click it, or press ⇧⌘⏎ again, to see all three.

Windows

New window (⌘N) opens a window with one tab, in the folder of the tab you were in. Every window is equal: closing one leaves the others alone, and closing the last one leaves Opsty running, ready for the next. The Window menu lists the open windows, and the Mac’s own ⌘` moves between them.

  • A tab of its own. Drag a tab down out of the strip and let go on the desktop: a window opens there with the tab in it. Move tab to new window in the Window menu, or the tab’s own menu, does the same, as does Move pane to new window for a single pane. Nothing restarts: an agent in the middle of a turn, a dev server and an ssh session all carry on, with their scrollback.
  • Back again. Drop a tab on another window’s strip and it joins it, or on one of its panes to become a split there. A window whose only tab you drag simply moves with it. Merge all windows gathers every window’s tabs into the one in front.
  • Closing a window (⇧⌘W, or its red button) is immediate when its shells are at their prompts. When something in it is still running, a sheet asks Close this window?, lists each thing with its lamp and what it is doing, and offers Move them to the other window (when there is one), Cancel or Stop 3 and close.
  • Every window comes back. With Settings ▸ General ▸ Reopen last tabs on, Opsty reopens each window where it was, on the display it was on, with its tabs, splits and names.

Show all tabs (⇧⌘\) opens the launcher on every tab in every window, the ones that need you first under Needs you, then each window’s, with what each is doing. Type to filter; ⏎ goes to the tab in its own window, and ⌥⏎ brings it to this one.

Show all tabs with two windows open: subtank, waiting in the other window, comes first under Needs you; then each window’s tabs, with what each is doing.

What each tab says

Every tab has a lamp, the mark before its name, and a few quieter words after it. Both are worked out in one place, so the tab, the Running list, the menu bar and the notification always agree, and every state has a shape as well as a color.

LampAfter the nameWhat it means
Green dotnothing, or the program in front, such as vimOn this Mac, and nothing needs you.
Turning ringthe agent’s task, such as Fix login bugAn agent is working.
Pulsing violet dotyour turnAn agent stopped (it finished, or it is asking you something), or a program rang the bell or sent a notification, while you were looking elsewhere.
Green dot:5173A program in this tab is listening on port 5173: a server is up.
Red crossstoppedA command that had run for five seconds or more ended with an error. See When something stops.
Green dotdoneA command that ran for ten seconds or more finished while you were looking elsewhere.
Blue dotthe tab is named for the serverOn a server, over ssh.
Red dot, red tab stripprodOn a server you marked as production. See Production.

The red cross and the word stopped stay until you act: run something in that tab, press Clear in its detail on the Running list, close its failure card, or clear the tab with Clear to Start (⌘K). your turn and done clear as soon as you look, and so does the count on the Running button and the Dock, for a stop as well.

Two more marks can follow the name: a small red number counts the errors a running dev server has printed (see Errors while it is still running), and while a program reports how far along it is, a filling ring takes the lamp’s place.

How Opsty knows an agent

Opsty recognizes Claude Code, Codex and Gemini CLI. It knows one is running from the program in the tab (claude, codex, gemini, or Node running their packages) and reads what it is doing from what the agent already tells every terminal: the window title and the status it reports.

  • Claude Code 2.1.295 and later asks the terminal whether it can read a status, and Opsty answers. Claude then says in words whether it is working, waiting for you or done, often with a sentence about what it waits for or what it did, which the notification, the Running list and the Glance quote. Its title then carries only its task. An older Claude Code, or one with claudeStatus = false in config.toml, puts ◐ and its task in the title while it works, and ✳ when it stops. Finishing and asking permission look the same there, so Opsty reads Claude’s question off the screen to tell them apart; see Answering from the notification.
  • Gemini CLI shows ✦ (or ⏲) while working, ✋ when it needs an answer and ◇ when it is ready, unless its own Dynamic Window Title setting is off. Then its title only says Gemini CLI (folder), and its tab shows no working or waiting state.
  • Codex says what it is doing in a status that terminals can read (OSC 7501): working, waiting for you, or idle. Its title gives the task, which is the conversation’s name once it has one.

On a server. Opsty doesn’t answer Claude Code’s question over ssh, so Claude there keeps its ◐ and ✳ and sends that title through the connection. Once it has named itself (✳ Claude Code) in that session, Opsty reads its ◐ and ✳ as Claude’s: the tab keeps its server lamp, shows Claude’s own title after the host (staging · ✳ Fix nginx config), turns to your turn when Claude stops and calls you back like a local agent. Nothing is installed on the server.

Nothing is installed into the agents either, and none of their settings change.