ssh-tool

Cross-platform SSH connection manager - terminal, port forwards, vault, all in one window.

UI theme
ssh-tool — Connections
🖥 db-prod-01 live
Host10.0.1.21 Userdeploy inherited from production Port22 inherited Credentialprod-key vault Jumpbastion1 → db-prod-01

Connection tree with inheritance

Hundreds of hosts in nested folders. Username, port, credential and jump chain cascade from the folder down — set them once, every host below picks them up. Live sessions glow green and bubble a count to the parent. Dynamic folders auto-populate from Proxmox, Hetzner and six more providers.

ssh-tool — Terminal
db-prod-01app bastion1app web-prod-01 +
⊕ BROADCAST app
user@db-prod-01:~$ uptime
 14:02 up 89 days, load 0.27
user@db-prod-01:~$ 
⊕ BROADCAST app
user@bastion1:~$ uptime
 14:02 up 42 days, load 0.13
user@bastion1:~$ 
● 3 connected⊕ broadcast: app (2)v0.25.0

Tabs, splits and broadcast input

Multi-tab terminal with horizontal and vertical splits inside a tab. Toggle broadcast and every keystroke fans out to a named group at once — a session can sit in several groups in parallel. Per-session paste guard, themes, search, configurable scrollback built in.

ssh-tool — tcpdump
db-prod-01bastion1
LIVE tcpdump · db-prod-01
Flat Flows 9 Decode 3
dhcp xid 0x3e8f2a1  DISCOVEROFFERREQUESTACK  • 10.0.1.74
   client-mac   b8:27:eb:1a:44:9c
   requested-ip 10.0.1.74
   server-id    10.0.1.1
   lease-time   86400s
   router       10.0.1.1
   dns          10.0.1.1, 1.1.1.1
dns 14:02:21 A app.internal → 10.0.1.30
arp 14:02:22 who-has 10.0.1.21 tell 10.0.1.5 
filter: port 67 or 533 decodedsudo via vault

Live tcpdump with protocol decode

Right-click a host and stream packets into a side panel — sudo fed from the vault, no prompt. Switch between Flat, Flows (grouped by 4-tuple) and Decode views. Tick Verbose and the decoder dissects DHCP transactions (DISCOVER/OFFER/REQUEST/ACK with lease fields), DNS and ARP down to the field level. BPF filter server-side, instant client-side row filter.

ssh-tool — Port forwards
db-prod-01Forwards
TypeBindTargetTraffic
L127.0.0.1:5432db-prod-01:5432⇅ 4.2 MB
R0.0.0.0:8080localhost:3000⇅ 812 KB
D127.0.0.1:1080SOCKS5 dynamic⇅ 19.8 MB
🌐 Launch isolated browser via :1080 temp profile
● 3 forwards activeSOCKS5 :1080

Tunneling: L / R / SOCKS5 + isolated browser

Local, remote and dynamic SOCKS5 forwards per session with live byte counters. One click launches an isolated browser pinned to the SOCKS port on a throwaway profile — reach an internal dashboard through the tunnel without touching your main browser. The in-app HTTP/SOAP probe routes through the same forward.

ssh-tool — Dynamic inventory
lxc-pg-01 PROXMOX running
TypeLXC · node pve-node-01 · VMID 104 vCPU4 RAM8 GiB Uptime11 days
CPU34%
RAM61%
Disk23%
📌 Pin as permanent connection
refreshed 30s agoAPI token in vault

Dynamic inventory folders

Folders that auto-populate from Proxmox VE, Hetzner, DigitalOcean, Linode, Vultr, Scaleway, AWS EC2 and Ansible files. Tag and label filters narrow what shows; stopped guests grey out with a "connect anyway" prompt. Click a host for live CPU/RAM/disk bars, pin one as a permanent connection, or convert the whole folder to static. API tokens live in the vault.

ssh-tool — Themes
db-prod-01bastion1
Catppuccin Mocha
deploy@db-prod-01:~/srv$ ls --color
config  deploy.sh  README.md  data
deploy@db-prod-01:~/srv$ git status
modified:   app.go
deleted:    old.go
deploy@db-prod-01:~/srv$ 
Settings · Terminal · Theme11 themes

Pick a terminal theme

Eleven curated palettes — Catppuccin Mocha/Latte, Dracula, Solarized dark/light, Gruvbox dark/light, Nord, One Dark and Tomorrow Night — set per app, applied live to every pane. Plus three UI themes (dark, light, high-contrast), configurable font, size and scrollback.

Built for daily use

Tree with folder inheritance

Manage 300+ connections in nested folders. Credentials, jump hosts, and SSH options cascade down. Drag & drop, multi-select, Ctrl+K quick palette.

Dynamic inventory

Auto-populated folders that pull live from Proxmox VE, Hetzner Cloud, DigitalOcean, Linode, Vultr, Scaleway, AWS EC2 and Ansible files. Tag/label filters, hide-stopped, on-demand refresh, pin-one-host, convert-folder-to-static.

Encrypted vault

Passwords, keys and API tokens sealed with Argon2id + XChaCha20-Poly1305. Machine-bound auto-unlock (DPAPI on Windows, machine-id on Linux), idle auto-lock, strength meter.

Live external secret backends

Reference a secret in KeePass, Vaultwarden / Bitwarden, or Infisical directly - the password or SSH key is read from the source at connect time and never copied into ssh-tool. KeePass reads a .kdbx (local or remote over WebDAV / SFTP, read-only); Bitwarden decrypts items from the server, organizations and collections included; Infisical reads secrets by project, environment and path. Sign-in is by API key (KeePass and Bitwarden also seal a master in the vault); each backend is reachable behind a WireGuard profile. Reads are fresh, and when the source is briefly unreachable the last value seen is served, flagged stale, rather than breaking a connect.

Interactive username and 2FA prompts

Leave a connection without a username and pick it at connect time - handy when one key logs into several accounts. When the server asks for a typed password or a verification code (keyboard-interactive / PAM 2FA), or a stored key is rejected, ssh-tool prompts and passes your answer through instead of failing. Configured auth is tried first; jump hosts keep their fixed credentials.

Tabs, splits, broadcast

Multi-tab terminal with horizontal/vertical splits, paste guard, themes, search. Broadcast input to multiple named groups in parallel - one session can broadcast to several groups at once.

Detach and redock windows

Tear off panes to separate windows, then snap them back. Tray icon, minimise-to-tray, close-to-tray.

Port forwards + isolated browser

Local, remote and dynamic SOCKS5 forwards. One click launches an isolated browser pinned to the SOCKS port. "Give internet" reverse-proxies an offline server's HTTP traffic out through your machine - no squid needed.

Debug with an LLM (MCP)

Share a live SSH session with an external LLM client (Claude Code, LM Studio, any MCP server) so it can read the terminal, pull logs, search and open your saved connections, and propose commands. Off by default and local-only: no session is reachable until you share it, read-only commands auto-run, and state-changing ones need your approval - or pick auto-run (YOLO) mode for hands-off work, where only catastrophic commands still prompt. Terminal output is treated as untrusted data, and every action is recorded in an activity log.

Share a session to a browser

Let a colleague watch - or, with your approval, type into - a live session from a plain web browser, no ssh-tool on their side. You pick the tabs, the network interface, and read-only vs full control; every guest waits for your OK, and you confirm a short word-code with them so a leaked link is worthless. Encrypted over a self-signed certificate; splits, tab switches, and added tabs follow through live. LAN or over your own VPN - no cloud relay.

Userspace VPN profiles

Route a connection's first SSH hop through WireGuard, NetBird or Tailscale without a TUN adapter, admin rights, or system routes. Assign a profile to a folder and the whole tree rides the tunnel. Auto-mode dials direct when you're on-site, tunnel when remote. NetBird and Tailscale ship as optional plugins.

opkssh auth, native

OpenPubkey SSH certificates issued via OIDC, no external binary or filesystem dance. Cert and key live in the vault.

Live tcpdump + network insights

Streamed packet capture inline with per-protocol decode, sudo via saved credential when needed. A live analyzer flags routing and wrong-interface problems (0.0.0.0-bound replies from the wrong source IP, half-open TCP, ICMP unreachable, ARP off-subnet) and a one-click route check confirms the kernel's actual egress. Captures run in the background and survive detaching the tab to its own window.

HTTP / SOAP probe

One-off REST or SOAP requests with auto-detected route via an active SOCKS forward. Endpoints behind VPN become reachable in-app.

Workspaces & snippets

Named bundles of tabs restore your usual six terminals in one click - or let the app offer to reopen the last session's tabs at startup. Snippet palette fires reusable commands into the active session.

Batch exec

Run a one-off command across a multi-selection of hosts. Aggregate view with stdout, stderr and exit per host.

VNC console, in-app

Open a Proxmox VM, LXC, or node console - or any VNC host - as a tab, rendered by noVNC inside the app with no external client, no X server, no install. Proxmox guests reuse your inventory API token (vncproxy + vncwebsocket, self-signed clusters supported); node shells use a realm login; generic hosts dial the RFB port directly or tunnel it through the connection's SSH session. Fit scaling, Ctrl+Alt+Del; the optional VNC password lives in the vault.

Encrypted sync - your server or your cloud

Sync the whole profile - connections, credentials, vault, icons, settings - between machines over a WebDAV or SSH/SFTP server you control, or your own Dropbox, OneDrive or Google Drive account. Sealed with argon2id + XChaCha20-Poly1305 before upload; the store only ever holds ciphertext. Cloud backends sign in with OAuth + PKCE using your own app credentials, so there is no shared app or rate limit. SFTP auth reuses a vault credential or a key/password you type in, so a fresh machine can bootstrap. Auto-sync pushes on change; incoming changes apply live with no restart and, optionally, in the background while you work.

Session recording + player

Record a session's terminal output to standard asciicast v2 .cast files - output only, keystrokes never touch disk. Built-in player with seek, speed and idle-skip; files also play in asciinema or any web cast player.

Verified self-update

In-app updates stream with a progress bar and are sha256-checked against the release manifest before the binary is swapped. Leftovers from the previous version are cleaned up automatically.

Import from your old tool

Bring 600+ Devolutions RDM entries in one pass, your ~/.ssh/config with ProxyJump chains intact, PuTTY / KiTTY registry exports, SuperPuTTY Sessions.xml, or MobaXterm session files - and import PuTTY .ppk private keys directly (converted to OpenSSH on the way in). All imports are additive and safe to re-run.

Local-shell connections

Save a local terminal as a tree entry, not just an SSH host: pick a shell (or auto) and a command it runs on open. A telnet client to a console server, a serial console (screen /dev/ttyUSB0), a REPL, docker exec, or Claude Code on a double-click. Name it, tag it, give it an icon, favourite it - it opens like any connection, and exiting the shell closes the tab. Nothing SSH gets in the way: no host, port, credential or forwards on a local entry.

Android app

The same Go core, vault and SSH stack on an Android phone (arm64, DeX-ready). Biometric vault unlock backed by the device Keystore, a single-pane touch layout with system-back navigation, an on-screen key bar (Esc/Tab/Ctrl/arrows/^C^D...), pinch-to-zoom font size, and a foreground service that keeps SSH sessions alive when backgrounded. opkssh login opens the system browser; ssh-tool:// deep links open the app. Sideload the APK - no store account needed.

Liveness probe

See at a glance which hosts are up: a reachability dot on connection rows inside folders you have open. Probes only what's expanded, routes through a connection's WireGuard profile or an open bastion, and never brings a tunnel up just to check. Dynamic-inventory hosts optional.

Live log tail, parsed

Follow journalctl, a file, a Docker/Podman container, or a whole Compose stack in one panel. Lines are parsed and coloured by severity (JSON, syslog, nginx access, or a level keyword); a smart filter goes beyond grep - level>=warn, status=500, -noise, quoted phrases - with autocomplete, and a group toggle collapses repeats into one counted row. Flip to raw any time. Detaches to its own window and auto-reconnects.

Snippet variables

Reusable command snippets with ${var} / ${var:default} placeholders that prompt for values before firing into the active session (broadcast-aware).

Install

Windows

  1. Download ssh-tool-windows-amd64.exe (31.9 MB)
  2. Chrome and Firefox will warn — the binary is not code-signed yet. Why.
  3. Run it. SHA256 is published next to the download for verification.

sha256 65e65be3fa5da3b2fd42ebc04bcfde2aa2b559bff815f8704f6103f596d57179

Linux

  1. Download ssh-tool-linux-amd64 (30.8 MB)
  2. Mark it executable: chmod +x ssh-tool
  3. Run it. SHA256 is published next to the download for verification.

sha256 cecb937b7f4435d450537c401a645f50bb1be2b62d34ae61291ee3d91214143e

macOS coming soon

Universal build planned once Apple Developer ID is sorted.