Each pane used to compute and hold its own git branch/diff snapshot, refreshed only by its own events (cwd change, command end, agent turn end). Tabs sitting idle in the same repo kept whatever they last saw, so rows for one directory showed different +/− counts — or none at all when a tab's last probe landed on a clean tree. Snapshots now live in a process-wide GitStatusCache keyed by work-tree root: every pane whose cwd resolves into the same repo reads the same entry, refreshed by whichever pane probed last, and the sidebar observes the cache so all rows repaint together. In-flight probes are deduped per cwd (concurrent triggers fold into one git shell-out, with a rerun if re-triggered mid-flight), and a failed git diff keeps the previous counts instead of rendering the tree as suddenly clean.
tty7
A GPU-rendered terminal in pure Rust.
GPU rendering on Zed's gpui · VT core from Alacritty
Why tty7 · Install · Features · Benchmarks · Keybindings
English · 简体中文
Why tty7
- Fast — about 2× the throughput of Alacritty, Ghostty, or Kitty on the same hardware (benchmarks)
- A modern prompt — completion, syntax highlighting, and history search built in; no plugins to assemble
- Sessions that survive — close the window or quit the app, your shells keep running; no tmux
- Zero config — zsh, bash, fish, and PowerShell work out of the box
Native builds for macOS, Windows, and Linux ship with every release.
Install
Download the build for your platform from Releases:
- macOS —
tty7-<version>-macos-arm64.dmg(Apple Silicon) or…-x86_64.dmg(Intel); open it and dragtty7.appinto Applications. - Windows —
…-windows-x86_64-setup.exe(installer: Start Menu shortcut + uninstall entry), or…-windows-x86_64.zip(portable: unzip and runtty7.exe). - Linux —
…-linux-x86_64.AppImage(recommended: bundles the x11/wayland libraries, so it runs on Fedora / Arch / etc. with no extra packages —chmod +xand run), or…-linux-x86_64.tar.gz(bare binary; extract and run./tty7, needs the usual x11/wayland runtime libraries installed).
Features
At the prompt
- Ghost suggestions — your history completes the whole line as you type; → to accept
- Tab completion that explains — every flag and subcommand with its description, for ~100 common commands
- Syntax highlighting — as you type, nothing to install
- Fuzzy history search — ⌃ R shows what you ran, where, and whether it failed
- History from day one — your existing shell history just works, and carries across sessions
- Real line editing — selection, word motion, undo
In the window
- Tabs & splits — always open in the current directory
- Command palette ⌘ P · scrollback search ⌘ F
- ⌘-click links · desktop notifications
- Eight themes · CJK / IME input
CLI coding agents
tty7 recognizes third-party coding agents running in a pane (Claude Code, Codex, Gemini CLI, Aider, Amp, OpenCode, and ~10 more) and enriches them — it never wraps or replaces the agent.
- Brand avatars — the tab chip / sidebar row shows which agent runs where; custom wrappers map in via
agent_commandsinconfig.json - Live status dot — working (blue) / needs your input (amber) / done (green), driven by agent-reported events over an OSC channel; run Agent: Install Claude Code Hooks from the palette to wire Claude Code up
- Notifications that matter — "needs your permission…" the moment an agent blocks on you, and "finished after Ns" per turn, honoring your notification policy
- Branch at a glance — each sidebar row shows its pane's git branch and working-tree diff (
+N −M), refreshed oncdand when a command finishes - Session resume — panes lost to a reboot re-launch their agent conversation (
claude --resume …) on restore (restore_agent_sessions, on by default) - Context feed — palette commands send the current selection or the repo's
git diffto the running agent as a ready-made prompt
SSH connection manager
A native Rust SSH stack (russh) is the only path — profiles, credentials,
and SFTP without ever shelling out to ssh. There is no system-ssh compat mode.
- QuickConnect — type
user@host[:port]in the palette and connect; IPv6[::1]:portsupported - Saved profiles — full connection config with passwords / passphrases in the OS keychain, never on disk
~/.ssh/configaliases — type one to connect (resolved natively — common fields, best-effort — over russh), or import them as profiles in Settings- GUI auth — in-pane sheets for password, key passphrase, 2FA, and host-key confirmation (new vs. changed)
- Built-in SFTP — a slide-in file panel: browse, upload / download, rename / delete / chmod, drag to Finder
- Port forwarding — Local / Remote / Dynamic, preconfigured or added live, plus ⌘-click
localhost:PORTto auto-forward - Jump hosts & proxies — multi-hop via profile references or
ProxyJump, ProxyCommand, SOCKS5 / HTTP
| Entry point | Connects via |
|---|---|
Saved profiles · QuickConnect · typed user@host[:port] |
Native russh — SFTP · keychain · GUI auth · L/R/D forwards |
~/.ssh/config aliases |
Resolved natively, then russh (Match/canonicalize/GSSAPI unsupported — no fallback) |
Benchmarks
All four terminals measured back-to-back on the 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 IO — 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 daemon 11 MB.
Where the speed comes from:
- The PTY is read at device speed and parsed in large batches, off the render path
- Hot paths are lock-free — a big
catnever waits on drawing - The daemon buffers up to 16 MiB ahead of the window before backpressure applies
Methodology (how each terminal is driven, grid fairness, known pitfalls) and
one-command reproduction live in scripts/bench/ —
run it yourself.
Keybindings
Keys are shown in macOS notation — on Windows and Linux, read ⌘ as Ctrl. Open Settings with ⌘ , to browse or remap them all. The essentials:
| ⌘ T · ⌘ W · ⌘ ⇧ T | new tab · close tab · reopen closed tab |
| ⌘ 1…⌘ 9 · ⌃ ⇥ · ⌃ ⇧ ⇥ | jump to tab 1–9 · next tab · previous tab |
| ⌘ D · ⌘ ⇧ D | split right · split down |
| ⌘ ] · ⌘ [ | next pane · previous pane |
| ⌘ ⌥ ←→↑↓ | focus the pane in that direction |
| ⌘ ⏎ · ⌘ ⇧ ⏎ | toggle fullscreen · maximize / restore the pane |
| ⌘ K | clear the screen and scrollback |
| ⌘ P | command palette |
| ⌘ F | search the scrollback |
| ⌃ R | fuzzy-search shell history |
| ⌘ + · ⌘ − · ⌘ 0 | font size up · down · reset |
Settings → Keybindings lists every shortcut. Click one, press the new keys
(Esc cancels, Backspace resets to default), and it takes
effect immediately. Pane resize and swap have no default keys — bind them here or
run them from the command palette. Prefer tmux muscle memory? Flip the tmux
preset to remap pane/tab actions onto a prefix (default ⌃ B): ⌃ B
C opens a tab, ⌃ B % splits, ⌃ B then an
arrow moves focus. A bare prefix reaches the shell after a brief pause, and
prefix + an unbound key is passed straight through to the terminal.
Built on gpui and alacritty_terminal · Apache-2.0 · Discord · Changelog