A real Linux terminal in a tool window, and a submenu to reach it

Featurekamo-internal
Shipped
September 3, 2026 at 6:10 PM UTC
Author
Kamo
Commit
0d26a4b

The Linux Desktop nav option becomes a menu instead of a launch — Remote Desktop with its sizes, Remote Terminal — exactly as the softphone owns call, voicemail and text. One registry change does it: `kind: 'action'` becomes `kind: 'tool'`, and NavToolButton already renders a submenu in all three placements while toolSections is already the shared source for the nav and the home launchpad, so the two cannot drift. THE TERMINAL. xterm.js against a real PTY on the member's own dev machine, so it is a terminal and not a command runner: alt-screen apps (vim, htop, less), 24-bit colour, mouse reporting, bracketed paste, wide and combining glyphs, clickable OSC 8 links. Nothing is interpreted on the way through — keystrokes are bytes to the PTY and output is bytes back — which is the only way a terminal is ever actually compatible with what people run in one. On top of the emulator: a status chip that pulses rather than relying on colour alone, a title that follows the shell's own OSC sequence so it tracks cd and the running command, copy-on-select with Ctrl+Shift+C/V, Ctrl+Shift+F search, Ctrl +/-/0 zoom, and a palette that follows the viewer's theme. The shell outlives the window. It runs under tmux keyed on the window id, so a refresh, a dropped connection or a tool-window restore reattaches to the same session with its scrollback and its running command — which is also why a dropped socket reconnects with backoff instead of reporting a failure. The transport lives in **************** free of React and of xterm, so backoff and the frame split are testable without a DOM. THE STORED DESKTOP SIZE IS GONE, and with it DesktopResolutionPicker. It was set on a settings page four screens from every launch and read out of localStorage, so "why did it open small?" had no answer anywhere near the thing that opened small. The size is now chosen in the same click that opens the desktop; openKamoDesktop takes it explicitly and a caller with no opinion passes `fit`, which is what the default always was. Three defects found and fixed in self-review, all silent: the shortcut handler was attached by an effect that fires before the async emulator exists, so it never bound at all; closing a window while its ticket request was in flight still opened a socket afterwards, leaving a shell attached to nothing that the per-member cap went on counting; and the search decorations omitted ISearchOptions' two REQUIRED overview-ruler colours. Typing the xterm refs instead of `any` is what caught the last one. 405 test files / 5049 tests pass, the 14 guards are clean, tsc is clean, and the real production build succeeds — a green tsc alone proves nothing here. Dictionary pushed first (115c267f); verified against a fresh clone the way CI does it, since local messages/ is gitignored.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing