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. 中文版

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.