e1f93704fe fix(sidebar): Move to Group is a submenu listing every sidebar group (#1063)
* fix(sidebar): Move to Group is a submenu listing every sidebar group

The tab menu's Move to Group listed only pinned groups, laid out flat on
the grounds that there are never many. A sidebar that auto-groups by repo
holds dozens of groups, none of which could be picked. It is now a submenu
with every group the sidebar draws, in sidebar order, the tab's current one
checked, then Ungrouped (back to auto grouping) and New Group. Picking an
auto group pins it, as its header's pin does, and keeps the tab there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(sidebar): Move to Group review fixes

- Ungrouped row replaced by Remove from Group, enabled only for a tab kept
  in a group; move_targets is pure (no locale lookup) over GroupKey.
- move_tab_to: an auto group is pinned with the tab in one edit
  (pin_auto_group_with), gpui-tested.
- A separator splits pinned from auto groups; targets are taken before the
  submenu borrows cx.
- No CHANGELOG hunk; the description carries it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(sidebar): Move to Group comment and pin_auto_group_with tidy

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(sidebar): Move to Group's labels line up with the tab menu

One left-checked row makes gpui_component reserve a check column on every
row of that menu, so the whole submenu sat an icon's width right of the tab
menu it hangs off. Putting the check on the right keeps the labels at the
parent's inset.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(sidebar): pinning a repo whose folder is kept joins the kept group

A tab dragged out of a folder group while still in the repo is drawn
under the repo's auto group, beside the folder group keeping the same
directory. Move to Group lists both; picking the auto one (or its
header's pin) pushed a second folder group on the same path, two
identical headers splitting the folder's tabs by list order. Join the
kept group instead, as pin_folder already does.

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com>
2026-10-01 15:18:06 +08:00
2026-09-29 12:58:21 +08:00

tty7

The terminal that outlives its window.

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


CI Version Platforms License

English · 简体中文


One-minute tour of tty7: agents across repos, one agent driving another through the CLI, the prompt editor, diffs, dragging panes, and sessions that survive quitting the app


Most terminals tie your shells to a window. Close the window and the shells die with it. So people run tmux inside their terminal to keep them alive, which works, but it means learning a second set of keys and keeping a second config file, just to get around the window.

tty7 takes a simpler approach. The shells belong to a server running in the background, and the window only shows them. Close the window and nothing happens to the shells. Most of what's interesting about tty7 follows from that one decision.

Quitting doesn't kill anything

Quit tty7 and every shell keeps running. Your build doesn't notice.

A reboot is different. The processes are gone, because that's what a reboot does. But each pane comes back with its layout and the last of what was on screen, and supported agents pick up the same conversation where they left off.

You don't need tmux for any of this, and there's nothing to configure.

→ What survives what

Agents that run agents

A lot of people now run several coding agents at once, in several repos. Which means spending the day switching between windows to see which one finished and which one is waiting for an answer. That's not work a person should have to do.

tty7 recognizes 26 coding CLIs, including Claude Code, Codex, Gemini, Cursor, and OpenCode, and puts all of them in one sidebar: whether each is working or waiting, a notification when one needs you, and its branch and diff. You can see at a glance which one wants you.

Once an agent's status is something a program can ask about, the one asking doesn't have to be you. It can be another agent. The whole loop is four commands, with no framework, and it works whether or not the GUI is open:

PANE=$(tty7 split --v)                                       # give the worker a pane
tty7 send "$PANE" 'claude "add tests for the parser"' --enter
tty7 wait "$PANE" --until waiting,done --changed --timeout 600  # until it's done or stuck
tty7 capture "$PANE" --plain                                 # read what happened

tty7 doesn't wrap the agents or sit between you and them. The agent you start is the real one, running in an ordinary PTY. Simple things are more likely to keep working.

→ Orchestrating agents · agent skill · full support matrix

Remote is the same thing

A remote workspace is the same server, running on the other machine. The window here just shows it. Tabs, panes, the file tree, git, and diffs all live over there, and no files get synced. Connect from a different laptop and everything is where you left it.

So remote isn't really a separate feature. It's the local case with the server somewhere else.

The SSH client is tty7's own, written in Rust, so it doesn't depend on the system's ssh. It has profiles with keychain secrets, jump hosts, SFTP, and automatic port forwarding. The remote tty7-server installs once and doesn't need root.

→ Remote workspaces

Speed

Speed isn't the point of tty7, but it shouldn't be a weakness either, and it turns out not to be. cat on an 11 MB file takes 95 ms; the next fastest terminal we measured takes 179. DOOM-fire runs at 888 fps; the next best manages 617. The method and scripts are public, and one command reproduces them.

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

Apple M1 Pro, macOS 26.3.1, 155×40 grid, five-run averages, 2026-07-04. ¹ GUI 105 MB + the persistent server 11 MB. Methodology and one-command reproduction: scripts/bench/.

Everything else

The rest is details, but details are most of what makes a tool pleasant to use. The prompt has suggestions from your history, tab completion that explains each option, syntax highlighting, and real multi-line editing, and ⌃ R searches your history. ⌘ P searches everything. ⌘ J opens a side panel with processes, ports, files, changes, and GitHub issues and PRs. Shell integration works in zsh, bash, fish, PowerShell, and WSL without installing anything.

→ Full documentation · keyboard shortcuts · config.json · CLI reference

Install

Native builds on Releases:

macOS .dmg for Apple silicon or Intel — drag into Applications
Windows -setup.exe, or the portable .zip
Linux .AppImage — chmod +x and run; X11/Wayland libraries bundled

Give your agents the CLI skill:

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

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. Past sessions are read from the agent's own history files and listed in Search Everywhere, where ⏎ resumes one.

The full support matrix
Agent Detected Status · resume Fork Past sessions
Claude Code ✓ ✓ ✓ ✓
Codex ✓ ✓ ✓ ✓
TraeCode ✓ ✓ ✓
Grok ✓ ✓ ✓
OpenCode ✓ ✓ ✓ ✓
Oh My Pi ✓ ✓ ✓ ✓
Prime Agent ✓ ✓ ✓
Droid ✓ ✓ ✓ ✓
Qwen Code ✓ ✓ ✓ ✓
Goose ✓ ✓ ✓
Qoder CLI ✓ ✓ ✓ ✓
Qoder CN CLI ✓ ✓ ✓ ✓
CodeBuddy ✓ ✓ ✓ ✓
Gemini ✓ ✓ ✓
Copilot ✓ ✓ ✓
Kimi Code ✓ ✓ ✓
Pi ✓ ✓ ✓
Crush ✓ ✓
Antigravity ✓ ✓
Cursor ✓ ✓ ✓
Aider ✓
Amp ✓
Auggie ✓
Hermes ✓
Vibe ✓
Empryo ✓

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
43 MiB
Languages
Rust 97.4%
TypeScript 1.4%
Shell 0.4%
CSS 0.4%
PowerShell 0.2%
Other 0.1%