purple - Terminal SSH, Tunnel and Container Manager in Rust
Author: Eric Kochen
Description: Open-source terminal SSH manager in Rust. Cloud sync across 16 providers. Fuzzy host search, live tunnel monitoring and fleet-wide Docker and Podman container management.
Keywords: ssh manager, ssh client, ssh config editor, terminal ssh manager, tui ssh, rust ssh tui, ratatui, termius alternative, sshs alternative, ssh bookmarks manager, cloud ssh sync, multi-cloud ssh inventory, ssh tunnel manager, live ssh tunnel monitoring, ssh tunnel dashboard, real-time ssh tunnel, ssh tunnel throughput, ssh swimlane, sftp client, scp file transfer, docker over ssh, podman over ssh, multi-host docker management, docker fleet management, manage docker across servers, compose stack restart, docker logs over ssh, docker exec over ssh, agentless container management, lazydocker alternative, portainer alternative, hashicorp vault ssh, short-lived ssh certificates, mcp server, model context protocol, claude code ssh, claude desktop ssh, mcpb bundle, ssh mcp server, ai agent ssh tool, mcp audit log, devops, sysadmin, homelab

#
One terminal. All your servers.

## Open-source terminal SSH manager for macOS and Linux that keeps ~/.ssh/config in sync with your cloud infra. Spin up a VM, it shows up. Destroy it, it dims. Across 16 cloud providers.

purple
$
Downloading purple v3.12.3 for darwin-arm64...
Installing to /usr/local/bin/purple... done.
$ brew install erickochen/purple/purple
$ cargo install purple-ssh
$ nix profile install github:erickochen/purple

I had a perfectly good SSH config. Clean, well-organized, no complaints. That part worked.

What didn't work was the six other things I needed to do every day. Every container check was `ssh`, `docker ps`, scroll, repeat. Every file transfer was remembering `scp` flags. Every new cloud VM meant opening a console, copying an IP, editing my config by hand. And running the same command across a dozen hosts? That was either a bash loop or a whole Ansible setup for a one-liner.

So I put all of it in one terminal.

🔍 Find anything with one keystroke. Press `:` for Jump, a universal fuzzy search bar across hosts, tunnels, containers, snippets and actions. Searches the SSH `User`, `ProxyJump` and Vault SSH role too, so typing your username finds every server you log in as. Field prefixes `user:`, `proxy:`, `vault:` and `tag:` scope to a single SSH directive. Recent picks persist across sessions. Like Linear's `Cmd+K`, but in your terminal.
☁️ Your ssh config tracks your infra. Spin up a VM on AWS, Azure, GCP, Hetzner, Proxmox VE, Tailscale or 10 other cloud providers and it shows up in your host list. Destroy it and the entry dims. No more hand-editing after every Terraform run.
🐳 Manage every container in your fleet from one tab. Dedicated Containers page. Every Docker and Podman container grouped per host. Shell in, stream logs, restart, stop, exec or cycle a whole compose stack member by member. `Tab` from the Hosts page.
🚇 Watch your SSH tunnels in real time. Dedicated Tunnels page with live throughput, channel events and the apps moving bytes. Local, Remote and Dynamic SOCKS, all in one sortable view. `Tab` from the Hosts page.
📂 Browse and copy files between machines. Dual-pane file explorer. Local filesystem on one side, remote on the other. Handles ProxyJump chains and tunnels.
⚡ Run one command on many hosts. Pick a snippet, select your targets, execute. Results stream in per host.
🔑 Passwords handled for you. Plugs into OS Keychain, 1Password, Bitwarden, pass, the HashiCorp Vault KV secrets engine or a custom script. Credentials are fetched at connect time.
📜 Short-lived SSH certificates. Integrates with the HashiCorp Vault SSH secrets engine. Configure a role per host or per provider, press V to bulk-sign. Cached under ~/.purple/certs with automatic renewal.
🤖 Let AI agents manage your servers. Built-in MCP server with one-click `.mcpb` install for Claude Desktop. Works with Claude Code, Cursor, Windsurf and any MCP-compatible agent. Read-only mode and a JSON Lines audit log are built in.
📬 What's new overlay. Sticky toast and overlay summarizing releases since you last opened. Press n to reopen.
Cloud providers

- AWS EC2
- Azure
- DigitalOcean
- GCP
- Hetzner
- i3D.net
- Leaseweb
- Linode
- Oracle Cloud
- OVHcloud
- Proxmox VE
- Scaleway
- Tailscale
- TransIP
- UpCloud
- Vultr

FAQ
PURPLE(1)General Commands ManualPURPLE(1)
Does purple modify my SSH config?
Only when you explicitly add, edit, delete or sync. All writes are atomic with automatic backups. Comments, indentation and unknown directives are preserved.
Does it need a daemon or background process?
No. Single binary. Run it, use it, close it.
Does it send my config anywhere?
No. Your config never leaves your machine. Provider sync calls cloud APIs to fetch server lists. The TUI checks GitHub for new releases on startup (cached 24 hours). That's it.
How do I manage Docker containers across multiple servers from one terminal?
Press `Tab` from the Hosts page until you reach the dedicated Containers page. Every Docker and Podman container across your fleet appears in one list, grouped per host. The detail panel summarises engine version, runtime, sync age and running counts when the cursor sits on a divider. `Enter` shells in. `l` tails the last 200 log lines. `K` restarts. `S` stops. `e` runs a one-off command. `Ctrl-K` cycles a compose stack member by member. `R` refreshes every host in parallel. No agent, no web UI, no extra ports. Auto-detects Docker or Podman.
Can purple replace Lazydocker for multi-host workflows?
Yes. Lazydocker is built for one local host. purple's Containers page lists every container across every cached SSH host in one view: shell in, stream logs, restart, stop, exec or cycle a whole compose stack. `R` refreshes the whole fleet in parallel. `K` or `S` on a host divider sweeps every running container on that host at once. The detail panel reads `docker inspect` once and remembers, so image digest, restart policy, mounts, network and healthcheck render instantly as you arrow through.
Can AI assistants use purple?
Yes. Run `curl -fsSL getpurple.sh | sh`, then `purple mcp` to start the MCP server. Claude Code, Cursor, Windsurf and other agents get five tools: list_hosts, get_host, run_command, list_containers and container_action. Pass `--read-only` to restrict it to list_hosts, get_host and list_containers. Every call is logged to `~/.purple/mcp-audit.log` by default (JSON Lines, mode 0o600, run_command body redacted). Claude Desktop users can install the `.mcpb` bundle from GitHub releases for a one-click setup. Full setup guide on the wiki.
How do I troubleshoot connection problems?
Run with `--verbose` to enable debug logging, then `purple logs --tail` in another terminal. Logs are written to `~/.purple/purple.log` with fault domain prefixes: `[external]` for remote/tool errors, `[config]` for local config issues. Set `PURPLE_LOG=trace` for maximum detail.
purple v3.12.32026-05-12PURPLE(1)
`$ curl -fsSL getpurple.sh | sh`