trm
All the context you need, in one place.
Your editor, server, tests, and docs — all visible at once in a GPU-rendered grid. Stop alt-tabbing between terminals. Start seeing your entire project in one glance.
zig build -Doptimize=ReleaseFast
⎘
Editor, server, tests, logs, docs — no hidden tabs, no memorizing which window is where.
Every pane has a live AI summary. See what changed without switching focus. Your brain stays in flow.
Drop a trm.toml in your repo. Grid layout, pane commands, watermarks — your whole workspace boots in one command.
Everything You Need, Nothing Hidden
AI Command Palette
Ask AI to run commands, explain errors, or control your terminal. Streaming responses, pane addressing with #0 or #watermark, and a floating status bar that tracks progress when the palette is dismissed.
Live AI Summaries
Each pane gets a live summary of its terminal output, updated automatically by the LLM. See at a glance what every pane is doing.
Replies Read Aloud
A speaker button reads the agent’s reply aloud in the best neural voice on your Mac — fully local, code named rather than spelled out, and the sentence being spoken marked on the page as it goes.
GPU Rendering
Ghostty's battle-tested Metal/OpenGL renderer with background images, custom shaders, and 120fps. Zero tearing, efficient redraw.
Quick Terminal
A terminal that drops from the top of the screen on ⌃`, global so it answers from any app — and ⌃⌥` drops one down on another machine instead, reattaching the shell you left there.
Multi-Pane Grid
Jagged grid where every row can have its own column count: drag the dividers to resize, drag a pane onto another to stack or swap it, or into a second window to move it there. ⌘-click any pane to peek it full size. Each pane wears one slim bar across its top that widens when you point at it: drag it to move the pane, click it to peek, ⌃-click it to park.
Another Agent, Right Here
⌘⇧N opens a pane whose shell runs on another machine, in a session that outlives the window. ⌃⌘⇧N opens it where the pane you are in already is — same machine, same folder — and starts the same agent with the same flags, fresh rather than resuming the other one’s conversation. Press it from a Command Center row and the new pane opens beside that row’s pane while you stay on the board.
LLM-Built Extensions
Describe an extension in plain language and trm's LLM builds it: "notify me when any pane prints BUILD FAILED." Simple automations become declarative if-this-then-that rules (no code, can't leak); complex ones become supervised out-of-process programs with enforced capabilities, memory caps, and crash-restart — in any language. Hot-reloads on edit.
Detachable Sessions
Every pane runs under its own session daemon, on by default: quit trm, kill -9 it, or close the lid and the shells keep running — relaunch and it reattaches instantly, no questions asked.
Agents Survive a Reboot
A reboot kills every session daemon, so trm records which conversation each pane’s agent was having and restarts it with --resume: not the process back, but the thirty turns back.
trm on your iPhone
An agent that asked you something at 11pm is blocked until someone answers. Scan a QR code once and your phone has the same board: who’s stuck, what each just said, and a box to reply into any of them.
Command Center
One panel for every agent in every window — what each is saying now, a dot for blocked / working / idle with whatever needs you sorted to the top, and a reply box on every row so you answer without going there. Briefing mode writes each row in plain English — what changed, what the numbers were, what is still unfinished — rather than listing the commands the terminal is already showing, and the full-view button gives the board the whole window when it stops being a strip beside the work and becomes the work.
Worktree Panes
A worktree is a branch you can be in two places at once. New Worktree… creates it, opens a pane there and parks it on the shelf — and one an agent made gets a pane too, since it has no way to tell you it made one.
Issue Outline
Any project with an ISSUES.md beside an issues/ folder gets a checklist window that reads it as the outline it already is: click any @tag to filter, mark the one to do next, and hand it to an agent that has genuinely stopped.
Session Browser
⌘⇧S lists every live session grouped by the window it belongs to — including the ones on your other Macs — each with a preview, so work that outlived its window is findable instead of lost.
Pane Sidebar
⌘⌃H — or ⌃-click the pane’s bar — parks a pane on a shelf at the edge: it keeps running, same shell and same agent mid-task, while the grid expands into the space. Each tile says what the pane is running and what its agent last said. Click one to bring it back, ⌘-click to read it where it is, double-click its name to rename it.
Pane Overlaying
Stack panes in layers — run a terminal over a web page, overlay notes on a log viewer. Toggle focus between foreground and background.
Plugin System
9 built-in plugin types with an extensible registry. Terminal, WebView, Notes, File Browser, Git Status, and more.
Smart Text Selection
Ctrl+click to select a URL or path in one click, even across wrapped lines. Ctrl+drag to extend across line breaks. No more broken selections.
Pane Watermarks
Tag each pane with a large faint label — environment names, server tags, or project identifiers. Set via config or dynamically via AI.
Text Tap API
Unix socket API for external control. Subscribe to output, send input, execute actions via JSON. Scriptable automation built in.
Claude Code Notifications
Native macOS notifications when Claude Code is waiting for input or finishes working. Uses the Text Tap socket — no osascript needed. Each notification is attached to the pane it came from, so clicking it raises that window and focuses the exact pane — even with several agents running at once. Drop-in hook script included.
Agent Overview Pane
A reading pane bound to the agent in a pane — Claude Code or Codex — showing what it said as real Markdown, what it ran and what failed, with ‹ › to page back through earlier turns. Select it and the keyboard is its own: ← → page turns, ↑ ↓ scroll the reading.
Replies as Cards
A long answer is several things at once, so the overview splits it by the agent’s own headings — what was wrong, the fix, verification, the blocker — with anything it is waiting on sorted to the bottom.
Overviews for Plain Shells
A shell has the same shape as a conversation, so a pane with no agent gets an overview too: every command is a turn, its output the reply, and the failed lines picked out of the noise.
Context Usage Tracking
Real-time Claude Code context window gauge with color-coded warnings. Track daily and weekly token usage with persistent history. Auto-compact alerts built in.
Agent Monitor
Real-time activity tracking for AI agents running in your panes. See one-liner summaries like “Reading config.zig” or “Running tests” in a floating status pill — even when the command palette is closed.
Inline Webview Panes
HTTP/HTTPS links open inside a webview pane in the grid instead of jumping to your browser. Stay in context while reading docs, PRs, or dashboards.
Server URL Detection
Automatically detects dev-server URLs in terminal output and shows a clickable banner. One click opens the server in an inline webview. Supports custom regex patterns for tunnels and proxies.
Send to Pane
Type keystrokes into any pane from an external process. User taps feedback in a Flutter app → MCP server fires → process_queue appears in the Claude Code pane — under one second, fully automatic. Works with shell scripts, Dart, or any Unix socket client.
Quick Actions
Save frequently-used commands as persistent pill buttons on any pane. Select text, right-click, name it — one click to re-run. Stored in .trm-actions.toml with hot-reload and session persistence.
Notification Rings
Panes needing attention glow with an animated blue ring that pulses until you focus them. Never miss when a build finishes or a test fails in a background pane.
CLI & Socket API
Full trm CLI with subcommands: notify, send, list-panes, open-browser, and more. Automate your workflow from shell scripts, CI, or any tool that speaks JSON over a Unix socket.
Split Browser Pane
Open a browser alongside your terminal with Cmd+Shift+L. Preview docs, dashboards, or local servers without leaving the grid. Navigable from the CLI or socket API.
Agent Browser Control
AI agents can script the split browser: evaluate JS, snapshot the accessibility tree, click elements, fill forms — all over the Text Tap socket. Build browser-in-the-loop workflows without external tools.
cmux-Compatible API
Speaks cmux protocol on the same socket. Tools built for cmux — like Claude Code hooks — automatically work with trm. Enumerate surfaces, identify focus, send keys and text, all via structured JSON-RPC.
One-Command Claude Workspace
start-claude.sh opens a multi-pane grid, launches Claude Code in the last pane, and auto-focuses it after a configurable delay — ready to code in under 5 seconds.
Stays Light, For Days
Leave trm running for a week with a dozen busy panes — memory stays flat. Periodic scrollback snapshots only re-read a pane when its output actually changes, so idle panes cost nothing and trm doesn't balloon over long uptime.
Crash-Safe Plugin Isolation
Plugins run as subprocesses. If one crashes, trm keeps running. No reload, no restart, no lost work.
Isolated Processes
Each subprocess plugin runs in its own process with stdin/stdout JSON pipes. A crash is just a pipe EOF — the host detects it instantly.
Auto-Restart
Crashed plugins restart with exponential backoff (2s, 4s, 8s). After 60 seconds of stable running, the retry counter resets. Three strikes and the plugin stays down — your terminal stays up.
Any Language
Subprocess plugins are standalone executables. Write them in Python, Rust, Go, or anything else. Read JSON from stdin, write state to stdout. That's the whole API.
{"type":"terminal_output","pane":0,"text":"...","hash":"abc"}
{"type":"notification","name":"needsAttention","pane":0}
{"type":"stop"}
{"type":"ready"}
{"type":"state","overlay":"server_url_banner","panes":{"0":["http://localhost:3000"]}}
{"type":"error","message":"regex failed"}
Quick Start
Download
Grab the latest release from GitHub:
Or build from source:
git clone https://github.com/keyvez/trm.git
cd trm
zig build -Doptimize=ReleaseFast
Create a config
# ~/.config/trm/trm.toml
title = "My Project"
rows = 2
cols = 2
[[panes]]
title = "Editor"
cwd = "~/projects/myapp"
watermark = "EDIT"
[[panes]]
title = "Server"
initial_commands = ["npm run dev"]
[[panes]]
title = "Tests"
initial_commands = ["zig build test"]
[[panes]]
type = "webview"
title = "Docs"
url = "http://localhost:3000"
Launch
# From your project directory
trm
# Or specify a config file
trm --config path/to/config.toml
How trm Compares
| Feature | trm | Ghostty | iTerm2 | WezTerm |
|---|---|---|---|---|
| GPU-accelerated rendering | Metal / OpenGL (Ghostty) | Metal / OpenGL | Metal (partial) | OpenGL / Metal |
| Multi-pane grid layout | Native grid | Splits | Split panes | Splits / tabs |
| AI command palette | Streaming + pane addressing | No | No | No |
| Live AI summaries | Per-pane, auto-updating | No | No | No |
| Smart text selection | Ctrl+click URL / cross-line drag | No | No | No |
| Pane watermarks | Config + AI-settable | No | No | No |
| Pane overlaying | Foreground / background layers | No | No | No |
| External control API | Text Tap (Unix socket) | No | AppleScript / Python | CLI / IPC |
| Plugin system | 10 built-in types + registry | No | No | Lua scripting |
| Embedded web views | WKWebView | No | No | No |
| Server URL detection | Auto-detect + custom patterns | No | No | No |
| Quick actions | Persistent command pills | No | No | No |
| Crash-safe plugin isolation | Subprocess sandboxing | No plugins | No | No |
| Broadcast input | Yes | No | Yes | No |
| Config format | TOML | Key-value | Plist / GUI | Lua |
| Language | Zig | Zig | Obj-C / Swift | Rust |
Stop switching. Start seeing.
Set up your first multi-pane workspace in under a minute.