Panes, tabs and one search for everything.
⌘D splits right, ⌘⇧D splits down, to any depth. Tabs sit on top or in a sidebar that hides itself, grouped into colour-coded folders. Every window, tab and working directory comes back on relaunch.
⌘K reaches app commands, shell and clipboard history,
your ~/.ssh/config hosts, recently changed files,
notes, and every open pane in every window. It also does
arithmetic and unit conversion as you type.
- Drop a file or paste an image on a pane to type its path. On an SSH pane it's uploaded first.
- Find searches scrollback, or a Claude Code conversation that never reached it.
Every agent, and which one is waiting on you.
Claude Code, Codex and opencode each get a pill on their pane: ready, thinking, or needs you. ⌘⇧A opens a rail with every running agent across every window, blocked ones first, with the task, the branch, and live cost and tokens. Reply, accept or interrupt from the card.
Beside the pill, a bubble for each kind of tool call in flight shows what the agent has its hands in. Each card counts the files and lines it has changed since it started; open it for the diffs. Come back after a while away and one card sums up what happened.
- Hooks install non-destructively into Claude's and Codex's own settings.
claude --bgsessions join the roster with one-click resume.
The machine on the other end of the SSH session.
Right-click an SSH pane for a briefing on the host: load, memory, disks, containers, VMs, failed units, recent errors and pending updates, gathered in one round trip. A status gem sums it up.
A pill shows where kubectl points and turns red on
production. Each context opens the same kind of card for the
cluster. ansible-playbook runs mirror into a live
hosts-by-tasks grid, and terraform plan comes back
with what it destroys listed first.
- Containers from Docker, Podman, containerd and Apple's
containerin one pill. - Fleet run sends one command to many hosts, a pane each.
Your fleet as a map.Beta
⌘⇧M gives the window to a live graph of your agent sessions, the hosts they talk to, and the clusters and containers under them. Connect docks a real terminal on the canvas; overviews and logs open as panels over it.
Hold ⌥ and every card shows a letter. Press it to aim there, then drive the rest from the keyboard. Leaving writes a snapshot, so coming back tells you what changed.
Routines are work you do more than once: write the steps, leave the details as fields, run now, later, or after something else. Each host's result is kept, so a step reports 11/12 ok and names the one that failed. Anything named like production asks first.
The sessions you left running, on your phone.
Conterm for iOS shows every window, tab and pane on your Mac, which agent is waiting, and lets you answer it. It reads what the Mac publishes over the SSH connection you already have: no listening port, no account, no relay.
The Mac shows up on the local network by itself. Pairing sends the phone's key over, both screens show the same six digits, and one click installs it. No password is typed anywhere.
- Attach to a pane and type into it; a TUI sees real Return and Escape.
- Off by default. Nothing is published until you turn it on.
The whole app from the keyboard.
Everything below works from first launch. ⌘K covers the rest.
Tabs and panes
Find and jump
Agents and fleet
Install Conterm.
It checks GitHub for updates at launch and once a day, and a pill in the toolbar installs the new version. Settings, sessions and config back up to a single file you can restore on another Mac.
- macOS 14 Sonoma or later
- Apple Silicon
- Liquid Glass chrome on macOS 26
Download and drag to Applications
Open the
.dmgfrom the latest release and drag Conterm into Applications.Open it the first time with right-click
Conterm is open source and ad-hoc signed rather than notarized, so the first launch is right-click, Open, then Open again.
If macOS still refuses
Clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/Conterm.app
Bring your Ghostty config
Conterm reads
~/.config/conterm/configin Ghostty's syntax. One line shares your existing settings:config-file = ~/.config/ghostty/config