NAME
dssh — The only SSH connection manager you'll ever need. TUI & CLI. ssh_config, SQLite or both.
SYNOPSIS
go install github.com/madLinux7/dssh/cmd/dssh@latestINFO
DESCRIPTION
The only SSH connection manager you'll ever need. TUI & CLI. ssh_config, SQLite or both.
README
dssh — Dead Simple SSH (connection manager)
The only SSH connection management tool you'll ever need. CLI & TUI. No dependencies, no manual file editing.
Four core features: Create, Connect, Edit, Delete. Dead-simple and cross-platform.
Store connections in SQLite, your ssh_config file, or both — your choice.
Passwords are encrypted using a master passphrase (you should consider using pubkeys only tho ;)).

TUI navigation demo

TUI connect demo

CLI instant connect demo
Table of Contents
Features
Core:
- Fancy TUI ✨ — run
dsshwith no args to connect and manage all your connections - Instant connect 🚀 —
dssh myserverand you're in - Create Wizard 🪄 — easily add new connections without memorizing flags
- Edit ✏️ — no need to delete and re-add connections, just edit them
Also:
- Multiple storage backends 🗄️ — use SQLite (
~/.dssh/dssh.db), yourssh_configfile, or both - Launch into a directory 📂 — optionally land in a specific remote directory on connect
- Password encryption 🔒 — AES-256-GCM + Argon2id, protected by a master passphrase
- Cross-platform 💻 — Linux, macOS, Windows, FreeBSD (amd64 + arm64)
- Dead simple migration 📦 — moving to a new machine? Just take
~/.dssh/dssh.dbwith you. That's it.
How it works
dssh is a thin wrapper around your system's ssh binary:
- Key auth —
syscall.Execreplaces the dssh process with ssh (zero overhead, full terminal control) - Password auth — ssh runs as a child process with
SSH_ASKPASSto supply the decrypted password (nosshpassneeded) - Data — connections stored in SQLite (
~/.dssh/dssh.db), yourssh_configfile, or both - Crypto — AES-256-GCM encryption with Argon2id key derivation for stored passwords
Connection Modes
On first launch, dssh asks you to choose a connection mode:

| Mode | Description |
|---|---|
| SQLite only | Connections stored in ~/.dssh/dssh.db (default) |
| ssh_config only | Connections read from and written to your ssh_config file |
| Both | Use SQLite and ssh_config side by side, toggle with CTRL+L |
When using ssh_config or both, you pick a destination file:
- Main file —
~/.ssh/config - Directive —
~/.ssh/config.d/dssh - Custom path — any file you choose
If the file doesn't exist, dssh offers to create it for you.
Change your mode anytime with dssh config. View current settings with dssh config get (or dssh config show).
Note: Password auth is only available when saving to SQLite. ssh_config entries always use key auth.
Usage
Command Reference
| Command | Description |
|---|---|
dssh | Launch interactive connection picker |
dssh <name> | Connect to a saved host by name |
dssh <name> -- <args> | Connect with extra args forwarded to ssh |
dssh add [-p PORT] [-d DIR] <name> <target> [password] | Save a new connection |
dssh rm <name> | Delete a saved connection |
dssh list / dssh ls | List all saved connections |
dssh create / dssh new | Interactive form to create a connection |
dssh edit | Edit an existing connection |
dssh delete | Delete a connection (TUI, triple-confirm) |
dssh config | Configure connection mode (SQLite / ssh_config / both) |
dssh config get / dssh config show | Show current configuration |
dssh reset | Delete all data (double confirmation) |
dssh --version | Print version |
TUI Navigation
| Key | Action |
|---|---|
Tab / Shift+Tab | Switch between tabs |
↑ / ↓ | Navigate lists |
Enter | Select / confirm |
Ctrl+L | Toggle SQLite / ssh_config list (both mode) |
Ctrl+T | Toggle key / password auth (create/edit) |
ESC / Q | Quit |
Quick start - Let's Go!
# Add a connection (will use default pubkey identity) dssh add myserver root@192.168.1.10Connect
dssh myserver
You're in!
Permanently delete the connection (no confirmation asked)
dssh rm myserver
# Open the TUI where you can basically do anything
dssh
Run dssh with no arguments to launch the TUI.
Add a connection
# user@host (port 22 by default) dssh add myserver root@192.168.1.10Custom port
dssh add myserver -p 2222 root@192.168.1.10
SSH URI syntax
dssh add myserver ssh://root@192.168.1.10:2222
Start in a specific remote directory
dssh add myserver -d /var/www root@192.168.1.10
With password (will prompt for master passphrase)
dssh add myserver root@192.168.1.10 'my-ssh-password'
Connect to a host
# Direct connect by name dssh myserverPass extra args to ssh
dssh myserver -- -v -L 8080:localhost:80
Create (TUI)
Launch the TUI wizard to create a connection interactively.
dssh create
dssh new # alias

The wizard supports both key-based and password-based authentication. For password auth, you'll be prompted to create a master passphrase on first use.
Edit (TUI)
Launch the TUI directly on the Edit tab to modify an existing connection.
dssh edit
Delete (TUI)
Launch the TUI directly on the Delete tab. Requires pressing Enter 3 times on the same item to confirm.
dssh delete
List connections (CLI)
dssh list
dssh ls # alias
NAME USER HOST PORT AUTH DIR
mike-pulse-001 nomad 10.51.140.154 22 key -
myserver root 192.168.1.10 22 password -
rpg-server npc 192.168.188.7 22222 key /var/larp
sharp-nexus-001 deploy 10.105.210.233 22 key -
skylink root skylink.vps 22 key -
Remove a connection (CLI)
dssh rm myserver
Remove a connection instantly. No confirmation asked.
Configure mode
Switch between SQLite, ssh_config, or both at any time.
dssh config

View current settings:
dssh config get
parse_mode: both
ssh_config_parse_destination: ~/.ssh/config.d/dssh
parse_both_view_mode: sqlite
parse_both_default_save_target: sqlite
Reset everything
Wipe all saved connections, encrypted passwords, and settings (deletes the SQLite database). Requires two confirmations to prevent accidents.
dssh reset
This will delete ALL saved connections, passwords, and settings. Continue? (yes/no): yes
Are you sure? This cannot be undone. Type 'reset' to confirm: reset
All data has been reset
Installation
Linux
AUR (Arch)
yay -S dssh
paru -S dssh
Other package managers following soon!
MacOS
Homebrew
brew install madLinux7/tap/dssh
Windows
winget
winget install madLinux.dssh
scoop
# add scoop bucket (if not done already)
scoop bucket add madLinux7_scoop-bucket https://github.com/madLinux7/scoop-bucket
# install dssh
scoop install madLinux7_scoop-bucket/dssh
Local User Install & Update script
Linux / macOS / FreeBSD:
curl -fsSL https://raw.githubusercontent.com/madLinux7/dssh/main/install.sh | sh
Installs to ~/.local/bin by default. Override with INSTALL_DIR=/custom/path.
Windows (PowerShell):
irm https://raw.githubusercontent.com/madLinux7/dssh/main/install.ps1 | iex
Installs to %LOCALAPPDATA%\dssh and adds it to your PATH automatically.
From GitHub Releases
Download the latest binary for your platform from Releases and place it in your $PATH.
# Example for Linux amd64
curl -L https://github.com/madLinux7/dssh/releases/latest/download/dssh-linux-amd64 -o dssh
chmod +x dssh
sudo mv dssh /usr/local/bin/
From source
Requires Go 1.26+.
go install github.com/madLinux7/dssh/cmd/dssh@latest
Build locally
git clone https://github.com/madLinux7/dssh.git
cd dssh
# Build only with optimized -ldflags
make build
# Build and compress binary (upx needed)
make release
✨ Acknowledgements ✨
dssh has no need for reinventing the wheel — thanks to the maintainers and contributors of these amazing projects:
- Bubble Tea by Charm — pretty sick TUI framework
- Bubbles by Charm — ready-to-go TUI components (lists, text inputs) so I don't need to reinvent the wheel
- Lip Gloss by Charm — style definitions that make the terminal look ✨ pretty ✨
- Cobra by Steve Francia — the CLI framework powering every
dsshcommand - modernc.org/sqlite by Jan Mercl — pure-Go SQLite driver that lets you ship a single static binary with zero CGO
- golang.org/x/crypto by the Go team — Argon2id key derivation keeping your passwords safe
- golang.org/x/term by the Go team — secure terminal password reading without echo
- UPX by Markus Oberhumer, Laszlo Molnar & John Reiser - Reducing the Linux release binary size by an insane 64%! (9.0MB -> 3.3MB)