ssh-client — No Agent, No Cloud Account, Just :ssh
Cross-platform desktop SSH client for Windows and Linux, built on Elixir/OTP.
Switching to Windows for day-to-day work meant leaving behind the SSH workflow I had on Linux. Most GUI clients I tried were thin wrappers around the OpenSSH binary — spawn a subprocess, pipe stdin/stdout, parse stderr when something broke. That works until it doesn't: version drift between machines, opaque error messages, and no real control over the protocol layer.
Termius looked promising until I hit the wall of needing a cloud account just to sync local host configs. I wanted a desktop client that talks SSH natively, stores credentials locally, and doesn't phone home.
Why Not Just Shell Out to OpenSSH
Subprocess wrappers inherit every problem of the underlying binary. You don't control the handshake. You parse stderr strings to figure out whether auth failed or the host key changed. You depend on whatever OpenSSH version happens to be installed — different on Windows, WSL, and each Linux distro.
Erlang ships a native :ssh application that implements the SSH protocol directly. No subprocess. No version drift. Errors come back as structured OTP tuples, not strings scraped from stderr.
Erlang's native :ssh application negotiates the protocol directly — no OpenSSH subprocess in the loop.
The Stack
The app is Elixir/OTP with elixir-desktop — Phoenix LiveView rendered in a native webview, so the UI feels like a web app but runs as a desktop binary on Windows and Linux.
- Erlang :ssh — transport and authentication, protocol-native
- Phoenix Channels + xterm.js — interactive terminal over WebSocket
- Windows Credential Manager / Linux libsecret — stored credentials never leave the OS keychain
Agentless Host Telemetry
CPU, memory, and disk usage are pulled over the same :ssh connection via non-interactive exec channels. Run cat /proc/meminfo, parse the output, done. No daemon installed on the remote host. No agent to maintain, patch, or secure.
Getting Existing Config In
Most people already have an ~/.ssh/config with hosts, keys, and jump settings. ssh-client imports OpenSSH config on first launch and maps it into its own host store. Fuzzy search across hostnames and aliases means you don't scroll through a flat list.
Where It Is Now
v0.0.1 is out. Key-based and password auth both work. Development follows a one-issue-per-feature workflow — each feature gets its own branch and PR, merged to main only after CI passes.
It's early, but it's the SSH client I actually wanted when I moved to Windows.