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 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
, withUndo
(⌘Z) andStop 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
orSplit 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
andHistory
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.
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 youdrag 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.
, withSee 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.
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’sJoin 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 says1 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, andResize pane
▸ (⌃⌘→ and the other arrows) grows the pane in front toward the arrow.Swap with
▸, in the pane’s menu, exchanges two panes’ places.
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 theWindow
menu, or the tab’s own menu, does the same, as doesMove pane to new window
for a single pane. Nothing restarts: an agent in the middle of a turn, a dev server and ansshsession 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 offersMove them to the other window
(when there is one),Cancel
orStop 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.
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.
| Lamp | After the name | What it means |
|---|---|---|
| Green dot | nothing, or the program in front, such as vim | On this Mac, and nothing needs you. |
| Turning ring | the agent’s task, such as Fix login bug | An agent is working. |
| Pulsing violet dot | your turn | An 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 | :5173 | A program in this tab is listening on port 5173: a server is up. |
| Red cross | stopped | A command that had run for five seconds or more ended with an error. See When something stops. |
| Green dot | done | A command that ran for ten seconds or more finished while you were looking elsewhere. |
| Blue dot | the tab is named for the server | On a server, over ssh. |
| Red dot, red tab strip | prod | On 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 = falseinconfig.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 saysGemini 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.