Skip to content

Get started

dssh wraps your system ssh binary with a TUI, a tiny CLI, and a SQLite store at ~/.dssh/dssh.db. Zero daemons, one static binary, nothing to edit by hand unless you want to.

  • ssh client in PATH (OpenSSH on Linux/macOS/BSD, OpenSSH for Windows on Win10+)
  • A terminal that handles TrueColor + Unicode for the TUI — you probably have one installed unless you avoided updates since 2016
  • Only if building from source: Go 1.26+
Terminal window
# Unix (Linux, macOS, FreeBSD)
curl -fsSL https://raw.githubusercontent.com/madLinux7/dssh/main/install.sh | sh
Terminal window
# Windows PowerShell
irm https://raw.githubusercontent.com/madLinux7/dssh/main/install.ps1 | iex

Unix installs to ~/.local/bin (override with INSTALL_DIR=/custom/path). Windows installs to %LOCALAPPDATA%\dssh and patches PATH.

Verify the install:

Terminal window
dssh --version

The first time you launch dssh, a one-time dialog asks where to keep connections. Pick whichever fits — you can change it later with dssh config.

Mode Stores connections in When to pick it
SQLite ~/.dssh/dssh.db (encrypted passwords supported) Clean slate, you want passwords + portability in one file
ssh_config ~/.ssh/config or a path you choose You already live in ssh_config and want to keep it the source of truth
Both SQLite and ssh_config, toggle with Ctrl+L Mixed: keep team-shared hosts in ssh_config, personal/password hosts in SQLite

When picking ssh_config or Both, you’ll also choose a destination file: the main ~/.ssh/config, a directive file like ~/.ssh/config.d/dssh, or any custom path. If the file doesn’t exist, dssh offers to create it.

  1. Add a host via CLI — quickest path, uses your default pubkey:

    Terminal window
    dssh add myserver root@192.168.1.10

    Or go interactive with the wizard:

    Terminal window
    dssh create
  2. Connect — name alone, nothing else:

    Terminal window
    dssh myserver

    You’re in. On Unix, dssh syscall.Execs into ssh — zero wrapper overhead, full terminal control.

  3. List what you have:

    Terminal window
    dssh ls
    NAME USER HOST PORT AUTH DIR JUMP
    myserver root 192.168.1.10 22 key - -
  4. Optional: organize with groups:

    Terminal window
    dssh group create Home
    dssh add nas --group Home root@192.168.1.20
    dssh list --group Home

    Groups must exist before dssh add --group. See the grouping guide for TUI workflows, assignment, and source-scope details.

For hosts without key auth, save the password encrypted:

Terminal window
dssh add prod-box deploy@10.0.0.5 'hunter2'

First time you save a password, dssh prompts you to create a master passphrase. That passphrase drives Argon2id key derivation; the resulting AES-256-GCM key encrypts every stored password. Your passphrase itself is never written to disk — a verification token proves correctness on later unlocks.

Prefer key auth whenever you can — it’s faster to launch (process replacement, not a child) and leaves no secret at rest.

No arguments, no sub-command — just:

Terminal window
dssh

Four tabs — Create, Connect, Edit, and Delete — start in a two-pane layout. Use Tab / Shift+Tab to change pane focus and / to change tabs where allowed.

Press Ctrl+P to collapse or expand the right grouping pane; the preference persists between sessions. Press ? to hide or show the contextual key hints.

In Connect, the Edit list, and Delete, the right pane filters connections by group. In Create and an active Edit form, it becomes Assign Groups; use Space to toggle assignments and Ctrl+S to save from either pane.

Select (No Groups) to remove the group filter and show all connections. See the TUI keys reference for group management, complete controls, and context-specific behavior.

Collapsing the grouping pane resets the filter to (No Groups). If you collapse it while creating or editing a connection, any unsaved group-assignment changes are discarded.