Documentation

Get going with Termary

A native macOS terminal with IntelliJ-style split panes, named groups, SSH, and an in-app browser your coding agent can drive. Here's everything you need to start.

Install

Termary needs macOS 14 (Sonoma) or later. It runs natively on Apple Silicon and Intel.

Termary is launching shortly — the download isn't public yet. Check availability for the release. (A direct .dmg is coming first; Homebrew later.)

Panes, tabs & groups

Termary's layout is one tree: Group → Pane → Tab. A tab is exactly one live shell. A pane is a slot in the split layout and has its own tab strip. A group is a named, colored container holding a whole split layout — keep an api group, an infra group, a scratch group.

The key idea: a shell lives in exactly one place, so when you split, move, or regroup a pane the process never restarts and never loses scrollback. Drag a tab to a pane's edge to split there; drag to its center to move it in; drag a pane's grip onto another pane to swap them.

Splitting & layouts

Splitting is the heart of Termary. Every split keeps the live process running — you're rearranging windows onto shells, not restarting them.

Split with the keyboard

⌘DSplit right — move the active tab into a new pane beside this one
⌘⇧DSplit down
⌘⇧WClose the pane (its tabs collapse into the neighbour)

Split by dragging

  • Drag a tab to a pane's edge (top, bottom, left, right) to split there — the tab lands on that side.
  • Drag a tab to a pane's center to move it into that pane's tab strip instead.
  • Drag a pane's grip (≡ in its strip) onto another pane to swap their positions.

Layout presets

Pick a ready-made arrangement from the layout menu in the toolbar: 2×2, even columns or rows, a main + right split, up to an 8-up grid. A single layout can mix terminals and browser panes side by side.

Broadcast input

Press ⌘⇧B to pick a set of tabs and type once into all of them — handy for running the same command across several SSH hosts at once.

Keyboard shortcuts

⌘TNew tab in the focused pane
⌘WClose tab (collapses the pane if it was the last)
⌘⇧WClose the whole pane
⌘DSplit right — move the active tab into a new pane
⌘⇧DSplit down
⌘1–9Switch to group 1–9
⌘PCommand-history picker
⌘FFind in terminal
⌘⇧BBroadcast input to selected tabs
⌃↑Window overview grid

Double-click a tab title to rename it; double-click a group name to rename the group.

SSH & the vault

Add a saved SSH host from the sidebar's SAVED SSH section. Click a row to connect it into the focused pane; hover to edit or delete.

Saved hosts are stored in an encrypted vault, never in plaintext: a device-only key in the macOS Keychain seals the host list with AES-GCM. Only metadata is kept — host, user, port, key-file path. No passwords are collected and private keys never leave ~/.ssh.

Browser panes

A pane can hold a web page instead of a shell. It lives in the same split tree as any terminal — split it, move it, swap it, broadcast to it — so you can keep your dev server, its logs, and the running site all in one window.

Each browser pane is a real, inspectable browser, not a preview:

  • Network panel — a DevTools-style list of every fetch/XHR with request and response bodies.
  • Console capture — logs and errors, surfaced in the pane and available to your agent.
  • Device mode — render at a phone width with a mobile user-agent; zoom, or "Fit Pane" to resize the split to the device.
  • Web Inspector — Safari's inspector is enabled for deep debugging.
  • Activity — the page's real WebContent CPU/RAM shows in the Activity panel, and you can mute audio per pane.
  • Capture & annotate — screenshot the pane (markers and drawings included) or mark it up — see below.
New · Free

AI agent bridge (MCP)

Run Claude Code or Codex in a terminal pane and let it observe and drive a browser pane in the same window — open pages, click, type, read the console and network, take screenshots, and rearrange panes. Termary ships a native MCP server inside the app.

You Claude Code / Codex terminal pane termary-mcp stdio JSON-RPC AgentBridgeServer loopback 127.0.0.1 · bearer token AppState · BrowserRegistry panes · session Browser pane WKWebView you ask JSON-RPC / stdio HTTP + Bearer dispatch drive results
Tools: browser_* · panes_* · session_* · agents_* (45+). The agent never touches the app directly — every call hops through the bundled MCP server and the loopback bridge.
  1. Turn the bridge on: Settings → Terminal → AI Agent Bridge. It's off by default and binds to loopback (127.0.0.1) with a per-session bearer token.
  2. Register the bundled server with your agent:
    claude mcp add termary -- /Applications/Termary.app/Contents/Resources/termary-mcp
  3. Ask away — e.g. "open the login page and tell me what's in the console." The agent uses browser_*, panes_*, session_*, and agents_* tools (45+ in all).

The tools

The agent gets 45+ tools across four families:

  • browser_*drive a page (open, navigate, click, type, eval, wait, back/forward/reload), read it (snapshot, text, html, console, network, errors, screenshot, cookies), and shape it (viewport, zoom, fit_pane, annotate, annotations).
  • panes_* — arrange the window: tree, open, split, swap, ratio, layout (presets incl. 8-up), list_layouts. Placement is position-aware, so the agent reuses panes instead of piling up duplicates.
  • session_*last and restore the workspace.
  • agents_* — coordinate multiple agents across panes: agents (see what every agent is doing), report (publish your task), spawn (a controller opens a worker in a new pane — optionally in its own git worktree), send (message a worker by label), cue, and the fan-out set — fanout, run_status, merge (see below).

Closing the loop: when an agent changes UI, it drives the page and reads browser_errors / console / network, fixes, and re-checks until clean — verifiable work instead of guessing.

Multiple agents

Several agents can run in different panes and coordinate through the bridge via the agents_* tools: a controller can agents_spawn workers, watch them with agents, and agents_send follow-ups. To race several agents on the same task in isolated worktrees, use fan-out below.

The bridge is loopback-only and disabled until you flip the toggle — nothing is exposed to the network and no agent can reach it without the session token.

The agent bridge and annotation are free — remote control from your phone is Termary Pro.

New · Pro

Multi-agent fan-out

Fan-out gives one prompt to a squad of agents — mix Claude Code and Codex — and isolates each in its own git worktree on its own branch, so they can't step on each other or on your checkout. Watch live diffstats as they race, review each attempt, and squash-merge the winner.

Start a run

  1. Click the fan-out button (🏁) in the toolbar — its badge counts open runs.
  2. Type the task, set how many of each CLI to race, and confirm the repo and base branch.
  3. Workers open in their own panes and start immediately. Each branches from the repo's fetched default branch — never from your possibly-dirty checkout.

Review & merge

  • Worker cards — live state dot plus a running diffstat against the shared base, uncommitted work included.
  • Per-file diffs — read each attempt in full before choosing.
  • Squash-merge the winner — confirmation-gated; it refuses a dirty checkout, an uncommitted winner, or an empty attempt instead of guessing.
  • Loser cleanup — worktrees removed, branches deleted with git branch -d; unmerged work is never force-deleted.

Scripting & the phone

The bundled binary doubles as a CLI — every tool above is a subcommand. Install it once (no sudo), then fan out from any script:

termary agents_fanout --task "add rate limiting to the API" --agents claude,claude,codex

First time: /Applications/Termary.app/Contents/Resources/termary-mcp install-cli symlinks termary into ~/.local/bin. Then termary agents_run_status reports live state + diffstats, termary agents_merge merges the winner, and termary tools lists the whole catalog.

Runs are visible from the iPhone too — worker rows with live state, Watch (the live mirror), and a Controller-gated Merge. See the manual's Fan-out runs guide.

Annotating a page

Sometimes the fastest way to tell an agent what you mean is to point at it. Open the annotation toolbar on a browser pane and:

  • Pick a single element — drops a numbered marker and a comment popover with its selector and computed CSS.
  • Multi-select a group of elements, or mark a free region.
  • Draw with a pen, arrow, box, or text in your choice of color.

Hit Send and Termary packages the structured element data plus an annotated screenshot, hands it to the agent, and types a summary into the focused terminal.

Find, history & ports

⌘F opens find-in-terminal to search the current scrollback. ⌘P opens the command-history picker — fuzzy-search the commands you've typed, scoped to this terminal or shared across all of them.

Termary watches for dev servers: when a process starts listening on a port it surfaces it (via lsof), so you can spot :3000 at a glance and open it straight into a browser pane.

Themes & appearance

Open Settings from the sidebar gear. Pick a terminal palette — Apple Default, Solarized, Dracula, and more — and a code-editor font. The whole app follows the theme, not just the terminal surface.

Appearance can track the system, or be pinned to light or dark independently.

Session restore

Quit and come back to the same workspace. On relaunch Termary restores every group, split, and tab. Local tabs reopen a fresh shell in their last working directory; SSH tabs return idle so a stale connection never silently re-runs ssh — a one-time prompt lets you reconnect them all or pick them off individually.

Question not answered here? Email us or check the changelog.