Skip to content

Commit 0b341ac

Browse files
committed
docs: revert README to v2.23.0
1 parent fc760e4 commit 0b341ac

1 file changed

Lines changed: 102 additions & 92 deletions

File tree

README.md

Lines changed: 102 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,36 @@
1-
<p align="center">
2-
<img src="demo.gif" alt="purple terminal SSH client demo: searching hosts, managing Docker containers, transferring files, connecting via SSH and syncing cloud providers" width="800">
3-
</p>
4-
5-
<h1 align="center">purple.<br>Terminal SSH client and SSH config manager.</h1>
1+
<h1 align="center">purple.<br>Terminal SSH client with container management,<br>file transfer, cloud sync and AI agent integration.</h1>
62

73
<p align="center">
8-
A terminal client that turns <code>~/.ssh/config</code> into a searchable, taggable host launcher<br>
9-
with cloud sync from 16 providers, container management, file transfer and AI agent integration.<br>
10-
Runs on macOS, Linux and Windows (via WSL).
4+
<strong>Stop scrolling through your SSH config. Start searching it.</strong><br>
5+
A TUI that edits <code>~/.ssh/config</code> directly. Free and open-source. Runs on macOS and Linux.
116
</p>
127

138
<p align="center">
14-
<a href="https://getpurple.sh">Website</a> &middot;
15-
<a href="https://github.com/erickochen/purple/wiki">Wiki</a> &middot;
16-
<a href="#install">Install</a> &middot;
17-
<a href="#features">Features</a>
9+
<a href="https://crates.io/crates/purple-ssh"><img src="https://img.shields.io/crates/v/purple-ssh.svg" alt="purple-ssh crate version on crates.io"></a>
10+
<a href="https://crates.io/crates/purple-ssh"><img src="https://img.shields.io/crates/d/purple-ssh.svg" alt="purple-ssh total downloads"></a>
11+
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT License"></a>
12+
<a href="https://ratatui.rs/"><img src="https://img.shields.io/badge/Built_With-Ratatui-000?logo=ratatui&logoColor=fff" alt="Built With Ratatui"></a>
13+
<a href="https://getpurple.sh"><img src="https://img.shields.io/badge/Website-getpurple.sh-9333ea.svg" alt="purple website"></a>
1814
</p>
1915

20-
<p align="center">
21-
<a href="https://crates.io/crates/purple-ssh"><img src="https://img.shields.io/crates/v/purple-ssh.svg" alt="crates.io"></a>
22-
<a href="https://crates.io/crates/purple-ssh"><img src="https://img.shields.io/crates/d/purple-ssh.svg" alt="downloads"></a>
23-
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT"></a>
24-
<a href="https://ratatui.rs/"><img src="https://img.shields.io/badge/Built_With-Ratatui-000?logo=ratatui&logoColor=fff" alt="Ratatui"></a>
25-
</p>
16+
<p align="center"><img src="demo.gif" alt="purple terminal SSH client demo: searching hosts, managing Docker containers, transferring files, connecting via SSH and syncing cloud providers" width="800"></p>
17+
<p align="center"><em>Searching hosts, connecting via SSH, browsing remote files and syncing cloud providers. All from the terminal.</em></p>
2618

27-
---
19+
## What is purple?
20+
21+
purple is a terminal SSH client and SSH config manager for macOS and Linux. It reads and writes `~/.ssh/config` directly with full round-trip fidelity, preserving your comments, indentation and unknown directives through every edit.
22+
23+
From one terminal interface you can:
2824

29-
Single binary. No daemon. No async runtime. Written in Rust with 5000+ tests. Edits `~/.ssh/config` directly with full round-trip fidelity. Your comments, indentation, unknown directives, CRLF line endings and Include files are preserved through every edit. Free, open-source, MIT licensed. Works in any terminal emulator that supports ANSI escape codes including iTerm2, Terminal.app, Alacritty, kitty, WezTerm, Warp and Windows Terminal.
25+
- **Search and connect** to any host instantly with fuzzy search and frecency sorting
26+
- **Sync servers** from 16 cloud providers (AWS, Azure, DigitalOcean, GCP, Hetzner, i3D.net, Leaseweb, Linode, OCI, OVHcloud, Proxmox, Scaleway, Tailscale, TransIP, UpCloud and Vultr)
27+
- **Manage containers** over SSH (Docker and Podman, no agent required)
28+
- **Browse remote files** in a split-screen explorer and copy with a keystroke
29+
- **Run command snippets** across one host, a selection or all hosts at once
30+
- **Retrieve SSH passwords** automatically (OS Keychain, 1Password, Bitwarden, pass, HashiCorp Vault or a custom command)
31+
- **Integrate with AI agents** via MCP (Model Context Protocol). Claude Code, Cursor and other AI assistants can query hosts, run commands and manage containers
32+
33+
Written in Rust. Single binary, no daemon, no runtime required. 5000+ tests. MIT license.
3034

3135
## Install
3236

@@ -35,72 +39,81 @@ curl -fsSL getpurple.sh | sh
3539
```
3640

3741
<details>
38-
<summary>Homebrew, Cargo or build from source</summary>
42+
<summary>Other install methods</summary>
43+
3944
<br>
4045

41-
**Homebrew** (macOS)
46+
**Homebrew (macOS)**
47+
4248
```bash
4349
brew install erickochen/purple/purple
4450
```
4551

4652
**Cargo** (crate name: `purple-ssh`)
53+
4754
```bash
4855
cargo install purple-ssh
4956
```
5057

5158
**From source**
59+
5260
```bash
5361
git clone https://github.com/erickochen/purple.git
5462
cd purple && cargo build --release
5563
```
5664

5765
</details>
5866

67+
## Quick start
68+
69+
```bash
70+
purple # 1. Launch the TUI
71+
# 2. Press a to add a host, or I to import from known_hosts
72+
# 3. Press S to configure a cloud provider
73+
# 4. Press / to search, Enter to connect
74+
```
75+
76+
Press `?` on any screen for context-sensitive help.
77+
78+
For detailed guides, keybindings and CLI reference see the [wiki](https://github.com/erickochen/purple/wiki). For AI systems: [llms.txt](https://getpurple.sh/llms.txt) contains complete context including architecture and feature details.
79+
80+
---
81+
5982
## Features
6083

61-
**Instant search and connect** &mdash; Find any host in under a second, no matter how large your config. Instant fuzzy search across aliases, hostnames, users, tags and providers. Frecency sorting surfaces your most-used and most-recent hosts. Navigate with `j`/`k`, connect with `Enter`.
84+
### Search and connect
6285

63-
**16 cloud providers** &mdash; Sync servers from **AWS EC2**, **Azure**, **DigitalOcean**, **GCP (Compute Engine)**, **Hetzner**, **i3D.net**, **Leaseweb**, **Linode (Akamai)**, **Oracle Cloud Infrastructure (OCI)**, **OVHcloud**, **Proxmox VE**, **Scaleway**, **Tailscale**, **TransIP**, **UpCloud** and **Vultr** directly into `~/.ssh/config`. Sync adds new hosts, updates changed IPs and optionally removes deleted servers. Provider tags are synced separately from your own tags and always mirror the remote. Your tags are never modified by sync. Press `S` to configure a provider.
86+
Find any host in under a second, no matter how large your config. Instant fuzzy search across aliases, hostnames, users, tags and providers. Navigate with `j`/`k`, connect with `Enter`. Frecency sorting surfaces your most-used and most-recent hosts.
6487

65-
**Container management over SSH** &mdash; Manage Docker and Podman containers on any server. No agent required on the remote server, no extra ports. Start, stop and restart without leaving the terminal. Auto-detects Docker or Podman. Container data is cached and shown in the detail panel after first fetch. Press `C` on any host.
88+
### Cloud provider sync
6689

67-
**Remote file explorer** &mdash; Split-screen file browser. Your local filesystem on the left, the remote server on the right. Navigate directories, select files and copy them between machines with `Enter`. Works through ProxyJump chains, password sources and active tunnels. Press `f` on any host.
90+
Pull servers from **AWS EC2**, **Azure**, **DigitalOcean**, **GCP (Compute Engine)**, **Hetzner**, **i3D.net**, **Leaseweb**, **Linode (Akamai)**, **Oracle Cloud Infrastructure (OCI)**, **OVHcloud**, **Proxmox VE**, **Scaleway**, **Tailscale**, **TransIP**, **UpCloud** and **Vultr** directly into `~/.ssh/config`. Sync adds new hosts, updates changed IPs and optionally removes deleted servers. Provider tags are synced separately from your own tags and always mirror the remote. Your tags are never modified by sync. Press `S` to configure a provider.
6891

69-
**Command snippets** &mdash; Save frequently used commands and run them on one host, a selection of hosts or all visible hosts at once. Press `r` to run a snippet, `Ctrl+Space` to multi-select hosts. Snippets support `{{param}}` placeholders with optional defaults. Values are shell-escaped automatically.
92+
### Docker and Podman containers
7093

71-
**SSH password management** &mdash; Configure a password source per host and purple retrieves passwords automatically on connect via SSH_ASKPASS. Supported sources: **OS Keychain**, **1Password** (`op://`), **Bitwarden** (`bw:`), **pass** (`pass:`), **HashiCorp Vault** (`vault:`) or any custom command. Press `Ctrl+D` in the picker to set a global default.
94+
Press `C` on any host to see all containers over SSH. Start, stop and restart without leaving the terminal. Auto-detects Docker or Podman. No agent required on the remote server, no extra ports. Container data is cached and shown in the detail panel after first fetch.
7295

73-
**AI agent integration (MCP)** &mdash; purple ships an MCP server that lets Claude Code, Cursor and other AI agents query your SSH hosts, run remote commands and manage containers over JSON-RPC 2.0. Five tools: `list_hosts`, `get_host`, `run_command`, `list_containers` and `container_action`.
96+
### Command snippets
7497

75-
**SSH tunnel management** &mdash; Local, remote and dynamic forwards (LocalForward, RemoteForward, DynamicForward). Start and stop tunnels from the TUI. Active tunnels run as background processes and are cleaned up on exit. Press `T` on any host.
98+
Save frequently used commands and run them on one host, a selection of hosts or all visible hosts at once. Press `r` to run a snippet, `Ctrl+Space` to multi-select hosts. Snippets support `{{param}}` placeholders with optional defaults. Values are shell-escaped automatically.
7699

77-
**Tags** &mdash; Organize hosts by environment, team or project. Filter with the tag picker (`#`) or `tag:web` in search.
78-
**Bulk import** &mdash; From hosts files or `~/.ssh/known_hosts`. Press `I` in the TUI or use `purple import` from the CLI.
79-
**SSH key management** &mdash; Browse keys with metadata (type, bits, fingerprint) and see which hosts use each key.
80-
**TCP ping** &mdash; Connectivity check per host or all at once.
81-
**Clipboard** &mdash; Copy the SSH command (`y`) or full config block (`x`).
82-
**Atomic writes** &mdash; Temp file, chmod 600, rename. Automatic backups (last 5).
83-
**Host key reset** &mdash; Detects changed host keys after a server reinstall and offers to remove the old key and reconnect.
84-
**Auto-reload** &mdash; Detects external config changes and reloads automatically.
85-
**Detail panel** &mdash; Split-pane view with connection info, activity sparkline, tags, provider metadata, tunnels, snippets and containers. Toggle with `v`.
86-
**Self-update** &mdash; `purple update` downloads the latest release and replaces the binary. The TUI shows update notifications.
87-
**Shell completions** &mdash; Bash, zsh and fish via `purple --completions`.
88-
**Minimal UI** &mdash; Monochrome with subtle color for status messages. Works in any terminal, any font. Respects [NO_COLOR](https://no-color.org/).
100+
### Remote file explorer
89101

90-
## Quick start
102+
Press `f` on any host to open a split-screen file explorer. Your local filesystem on the left, the remote server on the right. Navigate directories, select files and copy them between machines with `Enter`. Works through ProxyJump chains, password sources and active tunnels.
91103

92-
```bash
93-
purple # Launch the TUI
94-
# Press a to add a host, or I to import from known_hosts
95-
# Press S to configure a cloud provider
96-
# Press / to search, Enter to connect
97-
```
104+
### SSH tunnel management
105+
106+
Press `T` on any host to manage tunnels (LocalForward, RemoteForward, DynamicForward). Start and stop tunnels from the TUI. Active tunnels run as background processes and are cleaned up on exit.
107+
108+
### SSH password management
109+
110+
Configure a password source per host and purple retrieves passwords automatically on connect via SSH_ASKPASS. Supported sources: **OS Keychain**, **1Password** (`op://`), **Bitwarden** (`bw:`), **pass** (`pass:`), **HashiCorp Vault** (`vault:`) or any custom command.
98111

99-
Press `?` on any screen for context-sensitive help. For detailed guides, keybindings and CLI reference see the [wiki](https://github.com/erickochen/purple/wiki). For AI systems: [llms.txt](https://getpurple.sh/llms.txt) contains complete context including architecture and feature details.
112+
### AI agent integration (MCP)
100113

101-
## MCP setup
114+
purple ships an MCP server that lets Claude Code, Cursor and other AI agents query your SSH hosts, run remote commands and manage containers over JSON-RPC 2.0. Five tools: `list_hosts`, `get_host`, `run_command`, `list_containers` and `container_action`.
102115

103-
Add to `~/.claude/settings.json` for Claude Code:
116+
**Claude Code.** Add to `~/.claude/settings.json`:
104117

105118
```json
106119
{
@@ -115,11 +128,25 @@ Add to `~/.claude/settings.json` for Claude Code:
115128

116129
The client starts `purple mcp` automatically. No manual server process needed. For Cursor, Claude Desktop and other clients see the [MCP Server](https://github.com/erickochen/purple/wiki/MCP-Server) wiki page.
117130

118-
## Cloud providers
131+
### Additional features
132+
133+
- **Tags** Organize hosts by environment, team or project. Filter with the tag picker (`#`) or `tag:web` in search
134+
- **Bulk import** From hosts files or `~/.ssh/known_hosts`. Press `I` in the TUI or use `purple import` from the CLI
135+
- **SSH key management** Browse keys with metadata (type, bits, fingerprint) and see which hosts use each key
136+
- **Round-trip fidelity** Comments, indentation, unknown directives, CRLF line endings and Include files all preserved
137+
- **TCP ping** Connectivity check per host or all at once
138+
- **Clipboard** Copy the SSH command (`y`) or full config block (`x`)
139+
- **Atomic writes** Temp file, chmod 600, rename. Automatic backups (last 5)
140+
- **Host key reset** Detects changed host keys after a server reinstall and offers to remove the old key and reconnect
141+
- **Auto-reload** Detects external config changes and reloads automatically
142+
- **Detail panel** Split-pane view with connection info, activity sparkline, tags, provider metadata, tunnels, snippets and containers. Toggle with `v`
143+
- **Minimal UI** Monochrome with subtle color for status messages. Works in any terminal, any font. Respects [NO_COLOR](https://no-color.org/)
144+
- **Shell completions** Bash, zsh and fish via `purple --completions`
145+
- **Self-update** `purple update` downloads the latest release and replaces the binary. The TUI shows update notifications
119146

120-
<details>
121-
<summary>CLI setup for all 16 providers</summary>
122-
<br>
147+
---
148+
149+
## Cloud providers
123150

124151
| Provider | Auth | CLI setup |
125152
|----------|------|---------|
@@ -132,7 +159,7 @@ The client starts `purple mcp` automatically. No manual server process needed. F
132159
| **Leaseweb** | API key | `purple provider add leaseweb --token YOUR_API_KEY` |
133160
| **Linode (Akamai)** | API token | `purple provider add linode --token YOUR_TOKEN` |
134161
| **Oracle Cloud (OCI)** | `~/.oci/config` file | `purple provider add oracle --token ~/.oci/config --compartment OCID` |
135-
| **OVHcloud** | App key + secret + consumer key | `purple provider add ovh --token AK:AS:CK --project PROJECT_ID` |
162+
| **OVHcloud** | Application key + secret + consumer key | `purple provider add ovh --token AK:AS:CK --project PROJECT_ID` |
136163
| **Proxmox VE** | API token + cluster URL | `purple provider add proxmox --url https://pve:8006 --token TOKEN` |
137164
| **Scaleway** | Secret key | `purple provider add scaleway --token YOUR_TOKEN --regions fr-par-1` |
138165
| **Tailscale** | Local CLI (no token) or API key | `purple provider add tailscale` |
@@ -142,56 +169,35 @@ The client starts `purple mcp` automatically. No manual server process needed. F
142169

143170
See the [Cloud Providers](https://github.com/erickochen/purple/wiki/Cloud-Providers) wiki page for per-provider setup details, stale host management and auto-sync configuration.
144171

145-
</details>
172+
---
146173

147174
## FAQ
148175

149-
<details>
150-
<summary>Does purple modify my existing SSH config?</summary>
151-
<br>
176+
**Does purple modify my existing SSH config?**
152177
Your config is only modified when you explicitly add, edit, delete or sync a host. All writes are atomic with automatic backups. Auto-sync runs on startup for providers that have it enabled (toggle per provider, on by default except Proxmox).
153-
</details>
154178

155-
<details>
156-
<summary>Will purple break my comments or formatting?</summary>
157-
<br>
179+
**Will purple break my comments or formatting?**
158180
No. purple preserves comments, indentation and unknown directives through every read-write cycle. Consecutive blank lines are collapsed to one.
159-
</details>
160181

161-
<details>
162-
<summary>Does purple need a daemon or background process?</summary>
163-
<br>
164-
No. Single binary. Run it, use it, close it.
165-
</details>
182+
**Does purple need a daemon or background process?**
183+
No. It's a single binary. Run it, use it, close it.
166184

167-
<details>
168-
<summary>Does purple send my SSH config anywhere?</summary>
169-
<br>
185+
**Does purple send my SSH config anywhere?**
170186
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 for 24 hours). No config data is transmitted in either case.
171-
</details>
172187

173-
<details>
174-
<summary>Can I use purple with Include files?</summary>
175-
<br>
176-
Yes. Hosts from Include files are displayed but never modified. Includes are resolved recursively (up to depth 16) with tilde and glob expansion.
177-
</details>
188+
**Can I use purple with Include files?**
189+
Yes. Hosts from Include files are displayed in the TUI but never modified. purple resolves Include directives recursively (up to depth 16) with tilde and glob expansion.
178190

179-
<details>
180-
<summary>Can I use purple on Windows?</summary>
181-
<br>
182-
purple runs on macOS, Linux and Windows (via WSL). Install inside your WSL distribution with <code>curl -fsSL getpurple.sh | sh</code>. Windows Terminal renders the TUI correctly.
183-
</details>
191+
**Can I use purple on Windows?**
192+
purple runs on macOS, Linux and Windows (via WSL). Install inside your WSL distribution with `curl -fsSL getpurple.sh | sh`. Windows Terminal renders the TUI correctly.
184193

185-
<details>
186-
<summary>Why is the crate called purple-ssh?</summary>
187-
<br>
188-
The name <code>purple</code> was taken on crates.io. The binary is still called <code>purple</code>.
189-
</details>
190-
191-
<br>
194+
**Why is the crate called `purple-ssh`?**
195+
The name `purple` was taken on crates.io. The binary is still called `purple`.
192196

193197
See the [FAQ](https://github.com/erickochen/purple/wiki/FAQ) wiki page for more questions.
194198

199+
---
200+
195201
## Security
196202

197203
Report vulnerabilities through [GitHub Security Advisories](https://github.com/erickochen/purple/security/advisories/new). See [SECURITY.md](SECURITY.md) for scope, disclosure policy and what to include.
@@ -200,6 +206,10 @@ Report vulnerabilities through [GitHub Security Advisories](https://github.com/e
200206

201207
Found a bug or have a feature request? [Open an issue on GitHub](https://github.com/erickochen/purple/issues).
202208

209+
## Built with
210+
211+
Written in Rust. 5000+ tests (unit, integration, property-based and HTTP mocking). Zero clippy warnings. No async runtime. Works in any terminal emulator that supports ANSI escape codes including iTerm2, Terminal.app, Alacritty, kitty, WezTerm, Warp and Windows Terminal (via WSL).
212+
203213
<p align="center">
204214
<a href="LICENSE">MIT License</a>
205215
</p>

0 commit comments

Comments
 (0)