Building an SSH Terminal: Eight Problems Between ssh and a Working Prompt
Eight articles on one cross-platform SSH client: bytes on the wire, keys in the UI, and how a signed release actually ships. Each piece can be read alone. Code is from MistTerm v1.2.26 (Rust, AGPL), not the build on the download page. 中文版
- From Bytes to Glyphs: How a Terminal Emulator Actually Works
Half an ESC[ cannot be dropped. The VT state machine, grid semantics, and drawing CJK wide characters in egui. - SSH Flow Control, and Why an SSH Client Must Keep Reading While It Writes
A client that only writes deadlocks with the remote program. Keep reading when the window hits zero, and keep that drain off the GUI thread. - What Happens When You Paste into a Terminal: Bracketed Paste, the 4095-Byte Line, and UTF-8 Boundaries
Filter bracketed-paste markers. Linux canonical lines stop at 4095 bytes; chunks have to land on UTF-8 boundaries. Readline 8.1 turns bracketed paste on by default. - Why Non-ASCII Input Breaks over SSH: Locales, SendEnv and the `env` Request
Output looks fine; typed non-ASCII turns into garbage, and Backspace deletes half a character. What OpenSSH actually forwards, and how to send a real UTF-8 LANG. - Finding ZMODEM in a Terminal Byte Stream: How `rz`/`sz` Works Inside an SSH Client
Frame headers, why detection waits until the user submits sz/rz, and why the remote file name cannot be trusted. - Command Auditing in an SSH Terminal: What the Client Can See, and What Only the Server Can Enforce
The client can warn. Enforcement belongs on the server (sshd ForceCommand); in-band markers can be forged. - An Auto-Updater That Doesn't Trust Its Download Server: minisign, Verify-Before-Parse and Rollback Protection
Verify the minisign signature before parsing anything. Trust comes from the signature, not the download host, and an old signed manifest must not replay. - Shipping One Rust Codebase to Windows, macOS and Linux: Universal Binaries, Vendored OpenSSL, musl and a Gated Signing Step
lipo for the macOS universal binary, a glibc floor measured from the binary, a static musl CLI, and a signing job the build runners never see.