l0ng-aiandl0ng-ai 3c5f14f71c fix(icons): draw the plus on the same optical bound as the rest of the set (#577)
* fix(icons): draw the plus on the same optical bound as the rest of the set

Every icon tty7 draws itself sits on one optical bound: 3.4..20.6 of a 24
viewBox, 19.3 units of ink once the round caps are counted. `plus` was the
exception at 6..18, 14.1 units — 59% of the box where the rest fill 77-80%,
and tighter even than the stock lucide glyph it replaced.

That was compensated at the call site instead, by handing the three chrome
tiles that carry a `+` a 16px glyph (`TILE_GLYPH_LINE`) where every other
tile in the same row gets 13. It worked where it was applied and nowhere
else: the port-forward section's `+` sits in a 24px tile, which has no
`_LINE` step to grow into, so it rendered at 7.6px of ink against the 10.5px
of the icons around it.

Redraw the asset onto the bound and the compensation is no longer needed
anywhere — the three call sites go back to plain `chrome_tile`, and the 24px
tile is fixed for free.

Scaling a glyph up buys stroke as well as extent, which is the part that is
easy to miss: at 16px the old art also drew 16/13 wider, so moving the `+`
to 13px thinned it by a fifth even as it got longer. A cross is two hairlines
with no fill to hide behind, so the weight had to come back in the art's own
`stroke-width`, and the value is eyeballed rather than derived — 1.0 CSS px
reads thin against the closed shapes beside it, 2.0 reads heavy-handed, and
1.75 is where it settled after walking the range on a 2x screen.

`TILE_GLYPH_LINE` stays for stock lucide `close`, which has the same tight
geometry and is not ours to redraw.

* fix(icons): keep the plus's extra weight to the 16/13 the call site was buying

The redraw put `plus` on the family's optical bound and then took its
`stroke-width` to 3.2308 — 1.75 CSS px at a 13px glyph, settled by eye
against `panel-left`, `panel-right` and `ellipsis` in the titlebar row.
Those are the three call sites the redraw was checked at, and they are
the three whose neighbours are closed shapes carrying solid fills. The
other three are not:

- Source Control's row strip draws `plus` (Stage) directly beside stock
  `undo-2` (Discard) at an 11px glyph, and pairs it with stock `minus`
  (Unstage) one group up. Both stock glyphs stroke 2. At 3.2308 the `+`
  came out 1.48 CSS px against their 0.92 — the stage button reads as
  the emphasised one in a strip where nothing is emphasised, and a
  stage/unstage pair stops looking like a pair.
- The switcher's Add SSH Host row draws it at 16px in the same gutter
  column as `search`, which is ours and strokes 2.1.
- Settings → SSH puts it next to stock `search` and stock `ellipsis`.

Reading a size heavy is the same failure as reading a size small, so
the weight goes to the one value that is derived rather than chosen:
2.1 × 16/13 = 2.5846, the family's own stroke times the scale-up the
three chrome tiles were already applying. At `TILE_GLYPH` that renders
at 1.4 CSS px, which is exactly what the titlebar `+` has always drawn
at — so nothing that was verified on screen moves, and the three tiles
that never had a `_LINE` step to grow into stop being overdrawn. The
arm ends move to 4.9846..19.0154 to keep the round-cap tips on whole
pixels at the new weight; the ink extent is unchanged at 16.6.

The test now derives the weight from `panel-left`'s own `stroke-width`
instead of carrying an eyeballed band, and checks both arms rather than
the vertical one — a cross edited on one axis passed before.

---------

Co-authored-by: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com>
2026-08-13 14:49:33 +08:00
2026-08-12 18:41:37 +08:00
2026-08-12 18:41:37 +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 License Discord

English · 简体中文


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

Why

  • 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
  • Editor-grade input — suggestions, completion, highlighting, history search
  • Remote development — files, repos, panes, and git data stay on the remote machine
  • Native SSH — profiles, SFTP, port forwarding, and jump hosts
  • Agent-aware — Claude Code, Codex & co.: status, notifications, git context
  • CLI + Skills — agents create panes, run commands, and inspect output

Install

Native builds for each platform 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

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 · nine themes · IME
Agent-aware per-pane detection (18 CLIs): status dot · notifications · branch + diff · resume after reboot · tray icon when input is needed
Remote workspaces remote files, repos, changes, diffs, worktrees, tabs, and panes · reconnect from any client and continue where you left off
CLI + Skills bundled tty7 CLI · agent skill · pane/workspace control · real PTY commands · output, process, port, and agent status
SSH native russh stack: profiles with keychain secrets · SFTP panel · port forwarding · jump hosts · one-time, unprivileged tty7-server install

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
34 MiB
Languages
Rust 99.1%
Shell 0.5%
PowerShell 0.2%
Inno Setup 0.1%