A desktop SSH client with a clean terminal UI — connections, SFTP, port forwarding, and an approval-gated AI agent bridge, with your data kept on your machine and nothing uploaded anywhere.
Releases · AI agent (MCP) · Report a bug
Community edition.A fully local, open-source SSH client — everything runs on your machine, nothing is uploaded, no account required.SSH Ache Teams, an optional way to share connections with your team end-to-end encrypted, is a separate product.
- 💻
Real terminal— full SSH sessions (russh + xterm.js), tabbed, with splittable panes, plus local shell tabs. - 🗂️
Host vault— saved hosts organised in folders with colours and favourites; secrets stored outside the config in a
0600
file (seeSecurity); copy a ready-to-runssh
command for any host. - 🔑
Key Vault— save named SSH private keys once and reuse them across connections. - 🔐
Host-key verification— first-connect fingerprint confirmation,known_hosts
tracking, and a hard refusal with a warning if a host key ever changes (MITM protection). - 📁
SFTP browser— dual-pane local/remote navigation with drag-and-drop transfer of multiple files and whole folders, a replace/skip conflict prompt, and remote create-folder / rename / delete. - 🔀
Port forwarding & SOCKS— local (-L
), remote (-R
), and a dynamic SOCKS5 proxy (-D
), all over the SSH connection. Keepalive keeps idle tunnels alive. - 🛫
Jump hosts (ProxyJump)— reach a host through a saved bastion; the jump host's key is verified too. - 📥
Import— pull existing hosts (and their ProxyJump links) straight into the vault.~/.ssh/config
- 🔄
Reconnect on drop— when a session times out or the network goes, the pane stays where it is and a** Connection lost**prompt offersReconnect(same host, fresh shell, tab and scrollback intact) orClose tab. - 📡
Broadcast input— type once, send to every split pane in a tab (cluster-ssh). - 🔎
Find & on-connect commands—
⌘F
searches the terminal scrollback; each host can run a saved command (e.g.tmux attach
) the moment the shell opens. - 🎨 Themes & settings— terminal themes with live font size, cursor, and scrollback controls. - 💾 Encrypted backup— export and import your hosts and secrets as a password-encrypted file (PBKDF2 → AES-256-GCM). - ⏳ Idle screen lock— optional passphrase lock on the window after a period of inactivity (sessions and forwards keep running behind it). - 🤖 AI agent access (MCP)— an optional, off-by-default MCP server bound to localhost behind a bearer token, with per-host opt-in and per-command in-app approval — plus an opt-in per-host Auto-allow that skips the prompt. Seedocs/MCP.md. - 🖥️ Cross-platform— built with Tauri 2 (Rust) for macOS, Windows, and Linux.
brew install --cask SSH-Ache/sshache/sshache
Grab the latest platform build — .dmg
(macOS), .msi
(Windows), or .AppImage
/ .deb
(Linux) — from the Releases page.
macOS builds are not signed or notarised yet.The first launch is blocked as "unidentified developer" — right-click the app →Opento run it anyway. If you would rather not click through that warning for an app that handles SSH credentials (reasonable), build from source instead.
npm install
npm run tauri build
Building from source requires Rust and the Tauri toolchain. See the Tauri prerequisites for platform-specific setup.
Host-key verification— fingerprints are confirmed on first connect and tracked inknown_hosts
; if a host key ever changes, the connection is refused with a warning to guard against man-in-the-middle attacks. There is no "connect anyway" button.Jump hosts are verified too— a bastion's key is checked before any credential is sent to it.** Encrypted backups**— exported hosts and secrets are sealed with PBKDF2-SHA256 (600k iterations) and AES-256-GCM. Exporting a single connection or a workspacewithouta password leaves the secrets out of the file entirely.Approval-gated AI access— the MCP server is off by default, bound to127.0.0.1
behind a random bearer token, and default-deny per host. Every command needs explicit in-app approval unless you turn onAuto-allow for a specific host, which is off by default and skips the prompt for that host only. Secrets are never exposed to the agent. Details indocs/MCP.md.No cloud— nothing is uploaded and no account is required. The only outbound request the app makes is the GitHub release check for updates.
Passwords, key passphrases and pasted private keys are written to ~/.ssh-ache/secrets.json
, a file created with mode 0600
(owner read/write only) — the same access posture as ~/.ssh/id_rsa
. They are not encrypted at rest. They are mirrored to the OS keychain where that works, and the keychain is read as a fallback, but the file is the primary store: keychain access is tied to an app's code signature and is unreliable on the unsigned builds shipped today.
Practically: anything running as your user can read those secrets, exactly as it can read your ~/.ssh
private keys. Full-disk encryption (FileVault / BitLocker / LUKS) is what protects them at rest. Encrypting this file under the screen-lock passphrase is planned; the idle lock today locks the window, not the file.
Found something? SECURITY.md has the disclosure address.
Tauri 2 (Rust backend) · React + xterm.js (frontend) · russh / russh-sftp · portable-pty · keyring (OS keychain mirror).
Licensed under the Apache License 2.0 — free to use, modify, and distribute, including commercially. See NOTICE for attribution.
If SSH Ache saves you time, you can buy me a coffee ☕.
Noor Ajmir Tanvir
- Website — tanvirmahin.com - GitHub — @TanvirMahin24 - Email — tanvirmahin24@gmail.com