l0ng-ai 2e6f9cab4f perf(protocol): put a frame's header and payload on the wire in one write (#713)
`write_frame` sent the length, the kind byte and the payload as three
separate `write_all` calls. The pane socket is a loopback `TcpStream` with
`TCP_NODELAY` set, so each of those was its own segment and its own wakeup
on the far side: the client woke from `read()` about twice per frame just
to reassemble a header it had already been told the shape of. The daemon
frames every ConPTY read, so under output that is tens of thousands of
extra syscalls a second on each end.

Write the 5-byte header and the payload as one `write_vectored` instead.
The bytes on the wire are identical, and a writer with no native vectored
write still terminates on the loop's fallback — it just costs what it
used to.

Measured on a Ryzen 9 9950X (32 threads, integrated Radeon), release
build, one pane in a 2182x1361 window, a generator emitting 20000
80-column lines/s (1.64 MB/s), three 25-second samples each. CPU is % of
one core; "reads/frame" is `TTY7_TRACE`'s client socket reads divided by
its frame count.

| | tty7-app (GUI) | daemon | conpty host | total | reads/frame |
|---|---|---|---|---|---|
| before | 22.0 | 3.8 | 2.3 | 28.1 | 1.90 |
| after | 17.7 | 3.1 | 2.5 | 23.3 | 0.93 |

Socket reads per frame halve, and CPU at a fixed output rate falls 17%.
Under an unbounded flood the pipeline instead gets faster — 35.7 MB/s
before, 47.0 MB/s after — so that case is not rate-matched and is not
claimed as a CPU win.

This does not on its own explain #713: at the rate that issue describes
(a held Return, ~30 lines/s) tty7 costs about 11% of one core here either
way. It is a real cost on the output path regardless.
2026-09-07 19:31:09 +08:00
2026-09-04 17:42:08 +08:00
2026-09-04 17:42:08 +08:00
2026-09-04 17:42:08 +08:00

tty7

tty7

A terminal workbench: persistent sessions, remote work, agents.

Pure Rust · GPU rendering on Zed's gpui · VT core from Alacritty


CI Version Platforms License Discord

English · 简体中文


tty7 with a tab sidebar of agent sessions across several repos, running Claude Code

Why

A background server owns your shells and panes — not the window. Everything below follows from that.

  • Performance — ~2× the throughput of Alacritty, Ghostty, or Kitty (benchmarks)
  • Persistent sessions — quit or reboot; your shells and supported agent sessions keep running, no tmux
  • Agent-aware — Claude Code, Codex & co.: status, notifications, and git context for every repo at once
  • Scriptable by agents — one agent opens a pane for another, hands off a task, waits, and reads the result, with or without the GUI running
  • Editor-grade input — suggestions, completion, highlighting, history search, with no plugin to install
  • Remote development — files, repos, panes, and git data stay on the remote machine, over a native SSH stack
  • Git beside the terminal — source control, diffs, and worktrees without leaving the window

Install

Native builds for macOS, Windows, and Linux on Releases:

macOS …-macos-arm64.dmg · …-x86_64.dmg drag into Applications
Windows …-setup.exe · portable ….zip
Linux …-x86_64.AppImage chmod +x and run — X11/Wayland libraries bundled

What's inside

Agent-aware per-pane detection (19 CLIs) · status dot · notifications · branch + diff · tray icon when input is needed · resume after reboot · tab sidebar grouped by repository
CLI + Skills bundled tty7 CLI · agent skill · run streams a command and exits with its code · split · send · wait --until free · capture
Editor-grade input ghost suggestions from history · explained tab completion · syntax highlighting · multi-line editing · click places the caret · ⌃ R fuzzy history
Window tabs & splits · ⌘ P palette · ⌘ F scrollback search · ⌘ J panel with process tree and listening ports · 13 themes, your own YAML, iTerm2 import · IME
Shell integration injected when a pane starts, nothing to install · prompt marks · working directory · exit codes · command-finished notifications · zsh, bash, fish, PowerShell, WSL, remote panes
Remote workspaces remote files, repos, changes, diffs, worktrees, tabs, and panes · reconnect from any client and continue where you left off
SSH native russh stack: profiles with keychain secrets · SFTP panel · port forwarding · jump hosts · one-time, unprivileged tty7-server install
Git panel follows the focused pane · stage, commit, amend, branch, push, stash · side-by-side or unified diffs · commit graph with cherry-pick, revert, and reset · a new worktree opens its own tab

Supported agents

Detection is free: brand avatar, branch + diff, tab title. Status takes one click under Settings → Agents to install that agent's hook, and brings the status dot, notifications, the tray icon, tty7 wait, and resume after a reboot. Fork needs both — the agent's own fork command, and the hook that tells tty7 which session to fork.

The full support matrix, all nineteen
Agent Detected Status · resume Fork
Claude Code ✓ ✓ ✓
Codex ✓ ✓ ✓
Grok ✓ ✓ ✓
OpenCode ✓ ✓ ✓
Oh My Pi ✓ ✓ ✓
Droid ✓ ✓ ✓
Qwen Code ✓ ✓ ✓
Goose ✓ ✓ ✓
Gemini ✓ ✓
Copilot ✓ ✓
Kimi Code ✓ ✓
Pi ✓ ✓
Aider ✓
Amp ✓
Cursor ✓
Auggie ✓
Hermes ✓
Vibe ✓
Antigravity ✓

None of them are wrapped or proxied — the agent you start is the agent you get, in a normal PTY, with its own interface. An agent launched through a wrapper script can be mapped to one by name with agent_commands in config.json.

Documentation

Full documentation lives in docs/ — keyboard shortcuts · config.json · CLI reference. The agent-facing CLI interface is also documented in skills/tty7/SKILL.md.

Install the skill with:

npx skills add l0ng-ai/tty7    # install
npx skills update tty7         # update later

Benchmarks

Same machine, same day, same 155×40 grid — Apple M1 Pro, macOS 26.3.1, five-run averages (2026-07-04):

tty7 Alacritty Ghostty Kitty
Plaintext I/O — 11 MB cat (lower = better) 95 ms 239 ms 179 ms 185 ms
DOOM-fire frame rate (higher = better) 888 fps 485 fps 552 fps 617 fps
Cold-launch memory 116 MB¹ 105 MB 128 MB 130 MB

¹ GUI 105 MB + the persistent server 11 MB.

Methodology and one-command reproduction: scripts/bench/.


S
Description
A terminal workbench in pure Rust: shells, persistent sessions, SSH, coding agents. GPU-rendered on Zed's gpui, VT core from Alacritty.
Readme Apache-2.0
51 MiB
Languages
Rust 97.3%
TypeScript 1.4%
Shell 0.4%
CSS 0.4%
PowerShell 0.2%
Other 0.1%