Make native russh the default for every non-compat SSH entry point and confine the shell-out `ssh` path to a frozen compat escape hatch (PRD §3.1). Entry-point routing (ui::app): - Typed "SSH: Add Connection…": a bare `user@host[:port]` now takes the native QuickConnect path; only arg-bearing `ssh … -flags` lines (and bare tokens that only name a config alias) fall to the compat shell-out. - `~/.ssh/config` alias rows route through a documented `open_compat_alias` funnel (same funnel as `use_system_ssh` profiles) and their palette subtitle now reads `~/.ssh/config · system ssh`. - `open_managed_ssh_spec` documented as the single compat funnel; its only callers are the three deliberate escape hatches. Freeze audit: module-level freeze notes on `SshSpec`, `build_managed_ssh_command`/`SPAWN_MANAGED_SSH`, and `daemon::forward` (ControlMaster loopback). Verified `daemon::forward` is reachable only from compat panes (server branches `EnsureLoopbackForward` on `RemoteKind`); no non-compat code depends on shell-out. FR-C5 compat gating with a visible reason: SFTP toggle on a compat pane now opens a short "unavailable" notice instead of silently no-op'ing; the Ports panel shows a muted compat-mode line; managed L/R/D add-form stays native-only. Docs: Path policy section in ssh-native-architecture.md (WS6/WS7 seams marked resolved); SSH connection manager feature section in README + README.zh-CN.
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
SSH connection manager
A native Rust SSH stack (russh) is the default path — profiles, credentials, and
SFTP without shelling out to ssh.
- 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
- 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, ProxyCommand, SOCKS5 / HTTP
| Path | When | Features |
|---|---|---|
| Native (russh) | Profiles + QuickConnect — the default | SFTP · keychain · GUI auth · L/R/D forwards |
| System ssh (compat) | use_system_ssh profiles · ~/.ssh/config aliases · typed ssh … with flags |
Frozen escape hatch — OpenSSH is the source of truth; SFTP / GUI auth / managed forwards off |
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