* feat(search): list more agents' past sessions, and fork, copy or hide one The Sessions tab listed Claude Code and Codex only, and a row could only be resumed. - Past sessions of Gemini CLI, Qwen Code, Pi, Oh My Pi, Kimi Code, Copilot CLI, Droid, Qoder CLI and CodeBuddy are read from where each keeps them (honouring QWEN_HOME, COPILOT_HOME, KIMI_CODE_HOME, …), with the name the agent or user gave the session, else the first prompt. Context blocks agents prepend (<system-reminder> and kin) no longer hide a prompt. - Cmd/Ctrl-E on a session row opens its actions: Resume, Fork Session (agents that can fork, with the configured launch flags), Copy Session ID, and Remove from List. Removing keeps the search open, drops the row at once and remembers it in `hidden_agent_sessions`; the agent's own history is not touched. OpenCode and Cursor keep sessions in SQLite and are not read yet. Claude-Session: https://claude.ai/code/session_01JRqYZ9E153WpSHGS2AW3BM * feat(search): list remote workspaces' sessions, and OpenCode and Cursor The Sessions tab only ever read this computer, and left out the two agents that keep their history in SQLite. - agent_history moves into tty7-core, and the scan goes through the Host: a local workspace reads this machine in-process, a remote one asks its server (new ControlRequest::AgentSessions; CONTROL_VERSION 11 -> 12, so each remote host takes one Update Server). Resumed or forked sessions open on that machine, in the directory they ran in. The last answer is kept per host so the tab does not open empty. - OpenCode: top-level, unarchived sessions from opencode*.db (or $OPENCODE_DB); a placeholder title gives way to the first prompt. - Cursor CLI: chats under ~/.cursor/chats (or $CURSOR_CONFIG_DIR), named from meta.json or store.db. Cursor files a chat only under the md5 of its directory, so it is placed by matching open tabs' and other sessions' directories; chats nothing matches are left out, since they could not be resumed anywhere. - SQLite is bundled (rusqlite), opened read-only, falling back to an immutable read when the writer's WAL cannot be shared. Claude-Session: https://claude.ai/code/session_01JRqYZ9E153WpSHGS2AW3BM * test(search): wait for the real scan before seeding sessions The search's own scan runs on a real thread. On CI it landed after the test seeded its rows and replaced them, so the edit gesture found no row. The test now waits for the scan first. Assertion messages no longer print session ids (CodeQL rust/cleartext-logging). Claude-Session: https://claude.ai/code/session_01JRqYZ9E153WpSHGS2AW3BM * fix(search): harden the past-session scan and note it in the changelog - Honour CLAUDE_CONFIG_DIR for Claude Code's projects, as the hooks installer already does. - Read a Codex rollout's head as bytes: the 2 MiB cap can split a multi-byte character, and read_line then dropped the whole session. - Escape `%` and `#` (not only `?`) in the immutable SQLite URI fallback, so a database under such a directory still opens. - Refuse a session id starting with `-`: ids now come from file and directory names on disk, and one would be read as a flag by the resume or fork command. - Update the unreleased Sessions changelog entry for the new agents, remote workspaces, the Cmd-E actions and the v12 dialect bump. * fix(search): spell the immutable SQLite fallback as file:///C:/ on Windows SQLite reads file:C:/x as a relative path, so the fallback open (and its test) failed on Windows. An empty authority and a leading slash name the file on every platform. * test(search): keep ? out of the fixture directory name on Windows Windows file names cannot hold a '?', so the fixture's create_dir_all failed there before the fallback was ever opened.
tty7
A terminal workbench: persistent sessions, remote work, agents.
Pure Rust · GPU rendering on Zed's gpui · VT core from Alacritty
English · 简体中文
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
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 (25 CLIs) · status dot · notifications · branch + diff · tray icon when input is needed · resume after reboot · tab sidebar grouped by repository, with pinned groups |
| 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 Search Everywhere · ⌘ 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 |
Supported agents
Detection is free: brand avatar, branch + diff, tab title.
Status takes one click under Settings → Integrations 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 twenty-five
| Agent | Detected | Status · resume | Fork |
|---|---|---|---|
| Claude Code | ✓ | ✓ | ✓ |
| Codex | ✓ | ✓ | ✓ |
| TraeCode | ✓ | ✓ | ✓ |
| Grok | ✓ | ✓ | ✓ |
| OpenCode | ✓ | ✓ | ✓ |
| Oh My Pi | ✓ | ✓ | ✓ |
| Prime Agent | ✓ | ✓ | ✓ |
| Droid | ✓ | ✓ | ✓ |
| Qwen Code | ✓ | ✓ | ✓ |
| Goose | ✓ | ✓ | ✓ |
| Qoder CLI | ✓ | ✓ | ✓ |
| CodeBuddy | ✓ | ✓ | ✓ |
| Gemini | ✓ | ✓ | |
| Copilot | ✓ | ✓ | |
| Kimi Code | ✓ | ✓ | |
| Pi | ✓ | ✓ | |
| Crush | ✓ | ✓ | |
| Antigravity | ✓ | ✓ | |
| Cursor | ✓ | ✓ | |
| Aider | ✓ | ||
| Amp | ✓ | ||
| Auggie | ✓ | ||
| Hermes | ✓ | ||
| Vibe | ✓ | ||
| Empryo | ✓ |
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.
Every agent on your PATH is also a row in Search Everywhere (Agent: Claude Code, …)
that opens it in a new tab; agent_launch sets the command line it starts with.
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/.
Built on gpui and alacritty_terminal · Apache-2.0 · Discord · Changelog
