Files
ssh-protocol-handler-win/SshHandlerRs
Claude a671325a34 Add Rust prototype of the ssh:// protocol handler
Raw Win32 rewrite (windows-rs + a native dialog resource, no GUI
framework) of SshHandler, aimed at eliminating .NET's ~150MB
self-contained payload and CLR startup cost for what's just a
click-triggered dialog + process launch. Release build cross-compiles
to a ~250KB binary. Same behavior as the WinForms version: registry
setup mode, target parsing/editing dialog, legacy-algorithm option,
launches ssh.exe via ShellExecuteW.

Verified functionally under Wine (registry-setup prompt and the
connect dialog both render and round-trip correctly); real Windows
cold-start numbers still need to be gathered on actual hardware.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYCT2RpUjFfBfp6CD4rREw
2026-09-08 16:20:44 +00:00
..

ssh-handler (Rust)

A from-scratch rewrite of SshHandler (the .NET/WinForms ssh:// protocol handler) in Rust, targeting raw Win32 (via windows-rs) instead of a managed GUI framework. Same behavior, same registry keys, same dialog layout — just without the .NET runtime.

Why: the WinForms build's self-contained publish is ~150MB and pays CLR startup cost on every single ssh:// link click. This version has no runtime, no GC, no JIT — cold start is just process creation plus a native dialog box. Release build is ~250KB.

Building

Cross-compiling from Linux (what CI does):

rustup target add x86_64-pc-windows-gnu
sudo apt install mingw-w64
cargo build --release --target x86_64-pc-windows-gnu

Or natively on Windows with the MSVC toolchain:

cargo build --release

The dialog is a native Win32 resource (resources/ssh_handler.rc), compiled via embed-resource in build.rs — no GUI toolkit dependency.

Behavior

  • No arguments: setup mode. Checks for admin rights, confirms with the user, then writes the ssh:// protocol registration under HKEY_CLASSES_ROOT.
  • ssh://user@host argument: handler mode. Parses the target (defaulting the username to the current Windows user if omitted), shows a small dialog to confirm/edit the target and optionally enable "legacy mode" (older KEX/HostKey/MAC/cipher algorithms for old SSH servers), then launches ssh.exe -A -C ... user@host via ShellExecuteW.