2025-08-27 16:56:42 +01:00
<div align="center">
<img src="./docs/logo.png" alt="lazyssh logo" width="600" height="600"/>
</div>
2025-08-13 10:39:40 +01:00
---
2025-08-27 16:56:42 +01:00
Lazyssh is a terminal-based, interactive SSH manager inspired by tools like lazydocker and k9s — but built for managing your fleet of servers directly from your terminal.
<br/>
2025-08-31 10:01:37 +01:00
With lazyssh, you can quickly navigate, connect, manage, and transfer files between your local machine and any server defined in your `~/.ssh/config` . No more remembering IP addresses or running long scp commands — just a clean, keyboard-driven UI.
2025-08-27 19:51:26 +01:00
2025-08-30 15:53:31 +01:00
---
2025-08-27 16:56:42 +01:00
2025-08-13 10:39:40 +01:00
## ✨ Features
2025-08-30 15:53:31 +01:00
### Server Management
2025-08-27 16:56:42 +01:00
- 📜 Read & display servers from your `~/.ssh/config` in a scrollable list.
2025-09-19 03:36:08 +08:00
- ➕ Add a new server from the UI with comprehensive SSH configuration options.
- ✏ Edit existing server entries directly from the UI with a tabbed interface.
2025-08-27 16:56:42 +01:00
- 🗑 Delete server entries safely.
- 📌 Pin / unpin servers to keep favorites at the top.
- 🏓 Ping server to check status.
2025-08-14 11:51:07 +01:00
2025-08-27 16:56:42 +01:00
### Quick Server Navigation
- 🔍 Fuzzy search by alias, IP, or tags.
- 🖥 One‑ keypress SSH into the selected server (Enter).
- 🏷 Tag servers (e.g., prod, dev, test) for quick filtering.
- ↕️ Sort by alias or last SSH (toggle + reverse).
2025-08-13 10:39:40 +01:00
2025-09-19 03:36:08 +08:00
### Advanced SSH Configuration
- 🔗 Port forwarding (LocalForward, RemoteForward, DynamicForward).
- 🚀 Connection multiplexing for faster subsequent connections.
- 🔐 Advanced authentication options (public key, password, agent forwarding).
- 🔒 Security settings (ciphers, MACs, key exchange algorithms).
- 🌐 Proxy settings (ProxyJump, ProxyCommand).
- ⚙️ Extensive SSH config options organized in tabbed interface.
### Key Management
- 🔑 SSH key autocomplete with automatic detection of available keys.
- 📝 Smart key selection with support for multiple keys.
2025-08-14 11:51:07 +01:00
2025-08-27 16:56:42 +01:00
### Upcoming
- 📁 Copy files between local and servers with an easy picker UI.
2025-09-19 03:36:08 +08:00
- 🔑 SSH Key Deployment Features:
2025-08-31 10:01:37 +01:00
- Use default local public key (`~/.ssh/id_ed25519.pub` or `~/.ssh/id_rsa.pub` )
2025-08-30 15:53:31 +01:00
- Paste custom public keys manually
- Generate new keypairs and deploy them
2025-08-31 10:01:37 +01:00
- Automatically append keys to `~/.ssh/authorized_keys` with correct permissions
2025-08-30 15:53:31 +01:00
---
2025-08-31 10:01:37 +01:00
## 🔐 Security Notice
lazyssh does not introduce any new security risks.
It is simply a UI/TUI wrapper around your existing `~/.ssh/config` file.
- All SSH connections are executed through your system’ s native ssh binary (OpenSSH).
- Private keys, passwords, and credentials are never stored, transmitted, or modified by lazyssh.
- Your existing IdentityFile paths and ssh-agent integrations work exactly as before.
- lazyssh only reads and updates your `~/.ssh/config` . A backup of the file is created automatically before any changes.
- File permissions on your SSH config are preserved to ensure security.
2025-09-12 19:32:09 +01:00
## 🛡️ Config Safety: Non‑ destructive writes and backups
- Non‑ destructive edits: lazyssh only writes the minimal required changes to your ~/.ssh/config. It uses a parser that preserves existing comments, spacing, order, and any settings it didn’ t touch. Your handcrafted comments and formatting remain intact.
- Atomic writes: updates are written to a temporary file and then atomically renamed over the original, minimizing the risk of partial writes.
- Backups:
- One‑ time original backup: before lazyssh makes its first change, it creates a single snapshot named config.original.backup beside your SSH config. If this file is present, it will never be recreated or overwritten.
- Rolling backups: on every subsequent save, lazyssh also creates a timestamped backup named like: ~/.ssh/config-<timestamp>-lazyssh.backup. The app keeps at most 10 of these backups, automatically removing the oldest ones.
2025-08-30 15:53:31 +01:00
## 📷 Screenshots
<div align="center">
### 🚀 Startup
<img src="./docs/loader.png" alt="App starting splash/loader" width="800" />
Clean loading screen when launching the app
---
### 📋 Server Management Dashboard
<img src="./docs/list server.png" alt="Server list view" width="900" />
Main dashboard displaying all configured servers with status indicators, pinned favorites at the top, and easy navigation
---
### 🔎 Search
<img src="./docs/search.png" alt="Fuzzy search servers" width="900" />
Fuzzy search functionality to quickly find servers by name, IP address, or tags
---
2025-09-19 03:36:08 +08:00
### ➕ Add/Edit Server
2025-08-30 15:53:31 +01:00
<img src="./docs/add server.png" alt="Add a new server" width="900" />
2025-09-19 03:36:08 +08:00
Tabbed interface for managing SSH connections with extensive configuration options organized into:
- **Basic** - Host, user, port, keys, tags
- **Connection** - Proxy, timeouts, multiplexing, canonicalization
- **Forwarding** - Port forwarding, X11, agent
- **Authentication** - Keys, passwords, methods, algorithm settings
- **Advanced** - Security, cryptography, environment, debugging
2025-08-30 15:53:31 +01:00
---
### 🔐 Connect to server
<img src="./docs/ssh.png" alt="SSH connection details" width="900" />
SSH into the selected server
</div>
2025-08-13 10:39:40 +01:00
---
2025-08-27 19:51:26 +01:00
## 📦 Installation
2025-08-13 10:39:40 +01:00
2025-08-30 22:54:33 +01:00
### Option 1: Homebrew (macOS)
2025-08-27 16:56:42 +01:00
2025-08-27 19:51:26 +01:00
```bash
2025-08-30 22:54:33 +01:00
brew install Adembc/homebrew-tap/lazyssh
```
2025-08-27 19:51:26 +01:00
2025-08-30 22:54:33 +01:00
### Option 2: Download Binary from Releases
2025-08-27 19:51:26 +01:00
2025-08-30 22:54:33 +01:00
Download from [GitHub Releases ](https://github.com/Adembc/lazyssh/releases ). You can use the snippet below to automatically fetch the latest version for your OS/ARCH (Darwin/Linux and amd64/arm64 supported):
```bash
# Detect latest version
LATEST_TAG = $( curl -fsSL https://api.github.com/repos/Adembc/lazyssh/releases/latest | jq -r .tag_name)
# Download the correct binary for your system
curl -LJO "https://github.com/Adembc/lazyssh/releases/download/ ${ LATEST_TAG } /lazyssh_ $( uname) _ $( uname -m) .tar.gz"
# Extract the binary
tar -xzf lazyssh_$( uname) _$( uname -m) .tar.gz
# Move to /usr/local/bin or another directory in your PATH
sudo mv lazyssh /usr/local/bin/
# enjoy!
2025-08-27 19:51:26 +01:00
lazyssh
```
2025-08-30 22:54:33 +01:00
### Option 3: Build from Source
2025-08-27 19:51:26 +01:00
```bash
# Clone the repository
git clone https://github.com/Adembc/lazyssh.git
cd lazyssh
# Build for macOS
make build
./bin/lazyssh
# Or Run it directly
make run
```
2025-08-14 11:51:07 +01:00
---
2025-08-27 16:56:42 +01:00
## ⌨️ Key Bindings
2025-09-03 09:22:58 +02:00
| Key | Action |
| ----- | ----------------------------- |
| / | Toggle search bar |
| ↑↓/jk | Navigate servers |
| Enter | SSH into selected server |
| c | Copy SSH command to clipboard |
| g | Ping selected server |
| r | Refresh background data |
| a | Add server |
| e | Edit server |
| t | Edit tags |
| d | Delete server |
| p | Pin/Unpin server |
| s | Toggle sort field |
| S | Reverse sort order |
| q | Quit |
2025-08-27 16:56:42 +01:00
2025-09-19 03:36:08 +08:00
**In Server Form:**
| Key | Action |
| ------ | -------------------- |
| Ctrl+H | Previous tab |
| Ctrl+L | Next tab |
| Ctrl+S | Save |
| Esc | Cancel |
2025-08-27 16:56:42 +01:00
Tip: The hint bar at the top of the list shows the most useful shortcuts.
---
2025-08-30 15:53:31 +01:00
## 🤝 Contributing
2025-08-27 16:56:42 +01:00
2025-08-30 15:53:31 +01:00
Contributions are welcome!
- If you spot a bug or have a feature request, please [open an issue ](https://github.com/adembc/lazyssh/issues ).
- If you'd like to contribute, fork the repo and submit a pull request ❤️.
We love seeing the community make Lazyssh better 🚀
2025-08-27 16:56:42 +01:00
2025-09-19 09:36:00 +01:00
### Semantic Pull Requests
This repository enforces semantic PR titles via an automated GitHub Action. Please format your PR title as:
- type(scope): short descriptive subject
Notes:
- Scope is optional and should be one of: ui, cli, config, parser.
Allowed types in this repo:
- feat: a new feature
- fix: a bug fix
- improve: quality or UX improvements that are not a refactor or perf
- refactor: code change that neither fixes a bug nor adds a feature
- docs: documentation only changes
- test: adding or refactoring tests
- ci: CI/CD or automation changes
- chore: maintenance tasks, dependency bumps, non-code infra
- revert: reverts a previous commit
Examples:
- feat(ui): add server pinning and sorting options
- fix(parser): handle comments at end of Host blocks
- improve(cli): show friendly error when ssh binary missing
- refactor(config): simplify backup rotation logic
- docs: add installation instructions for Homebrew
- ci: cache Go toolchain and dependencies
Tip: If your PR touches multiple areas, pick the most relevant scope or omit the scope.
2025-08-27 16:56:42 +01:00
---
2025-08-30 15:53:31 +01:00
## ⭐ Support
If you find Lazyssh useful, please consider giving the repo a **star** ⭐️ and join [stargazers ](https://github.com/adembc/lazyssh/stargazers ).
☕ You can also support me by [buying me a coffee ](https://www.buymeacoffee.com/adembc ) ❤️
2025-08-30 22:54:33 +01:00
<br/>
<a href="https://buymeacoffee.com/adembc" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" width="200"></a>
2025-08-30 15:53:31 +01:00
---
2025-08-27 16:56:42 +01:00
## 🙏 Acknowledgments
- Built with [tview ](https://github.com/rivo/tview ) and [tcell ](https://github.com/gdamore/tcell ).
- Inspired by [k9s ](https://github.com/derailed/k9s ) and [lazydocker ](https://github.com/jesseduffield/lazydocker ).