trm

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.

Or build from source
zig build -Doptimize=ReleaseFast ⎘
4–9
panes visible at once

Editor, server, tests, logs, docs — no hidden tabs, no memorizing which window is where.

0
context switches

Every pane has a live AI summary. See what changed without switching focus. Your brain stays in flow.

1
config file per project

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.

trm (host process)
URL Detector in-process
Attention Icon in-process
Send Text Indicator in-process
Quick Actions in-process
Your Plugin subprocess stdin/stdout JSON
🛡

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.

Host → Plugin (stdin)
{"type":"terminal_output","pane":0,"text":"...","hash":"abc"}
{"type":"notification","name":"needsAttention","pane":0}
{"type":"stop"}
Plugin → Host (stdout)
{"type":"ready"}
{"type":"state","overlay":"server_url_banner","panes":{"0":["http://localhost:3000"]}}
{"type":"error","message":"regex failed"}

Quick Start

1

Download

Grab the latest release from GitHub:

Download for macOS

Or build from source:

git clone https://github.com/keyvez/trm.git
cd trm
zig build -Doptimize=ReleaseFast
2

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"
3

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.