Notable, user-facing changes per release. Follows Keep a Changelog; versions follow SemVer.
0.11.0 — 2026-07-27
sshelf import --tailscale— import your Tailscale tailnet: every eligible machine becomes a searchable sshelf host in one command. Runs your owntailscaleCLI (tailscale status --json) and maps each peer's MagicDNS name to the host name, its FQDN to the hostname (stable across IP churn; the Tailscale IP when MagicDNS is off), your tailnet to a site, and its ACL tags to sshelf tags. Mullvad exit nodes and machines shared in from other tailnets are left out, expired nodes are skipped, and offline machines are imported (being asleep is temporary). Add-only: hosts and sites that already exist are never touched, so re-running adds 0 — and, as ever, nothing under~/.sshis written. sshelf still makes no network calls of its own: the CLI runs only when you type the command, never at startup or in the background.$SSHELF_TAILSCALE_BINpoints at the binary if it isn't on yourPATH(the macOS app doesn't add it). No new dependencies.
sshelf importnow reports how many parsed hosts were skipped as duplicates, and prints any site it creates.
0.10.0 — 2026-07-12
sshelf export— project the host database as an ssh_config fragment, written to~/.config/sshelf/ssh_config; add oneIncludeline to~/.ssh/configyourself (sshelf still never edits it, or anything under~/.ssh). Plainssh/scp/sftp, rsync, git, and anything that reads SSH config — VS Code Remote-SSH, JetBrains Gateway — then resolve sshelf hosts by name, with users, ports, identities, jump hosts, and inherited site defaults included. Exact-o Key=Valueextra-args translate to real directives; other raw flags stay visible as a comment. Once the file exists it refreshes automatically on every hosts change (add/edit/delete, import, site changes); output is deterministic and diff-friendly.--stdoutprints the fragment instead of writing. No new dependencies.
- Docs: the site now opens with a full user guide — install, quickstart, per-feature pages, CLI reference, configuration, FAQ — and the README is a shorter landing page that links into it. No behavior changes.
0.9.0 — 2026-06-23
- Install from crates.io —
cargo install sshelf(published automatically on each release). - RedHat/Fedora
.rpmpackages (x86_64 + aarch64) attached to every release, built as a static musl binary so they run on any RPM distro (Fedora, RHEL/Rocky/Alma, openSUSE) regardless of glibc.
0.8.0 — 2026-06-23
- Two-factor (2FA) hosts — flag a host (add/edit form, or
sshelf add … --2fa) whose login needs an interactive verification code (TOTP / keyboard-interactive). On connect, sshelf shows a popup to enter the current code and supplies it to the prompt through the sameSSH_ASKPASShelper that supplies a stored password — fixing connects that previously failed, because a stored-secret connect runs withSSH_ASKPASS_REQUIRE=force(which routes the code prompt to the helper with no terminal fallback).sshelf <host>from the CLI prompts on the terminal. Manual entry only — no TOTP seeds are stored. No new dependencies.
0.7.0 — 2026-06-22
- Background port forwarding (
Ctrl-fon a host): a popup to start a Local (-L), Remote (-R) or Dynamic (-DSOCKS) SSH tunnel, reusing the host's auth exactly as connect does (keys / agent / ProxyJump / stored password, plus site defaults). The forward runs as a detached background process that keeps running after you quit sshelf, and a bind/auth failure (port in use, privileged port, server refused) is reported in the popup. A new forwards manager (F4) lists every active forward across hosts with its pid and age and stops any (d/k→y); the list refreshes live and is reconciled against the running processes on each launch, so it only ever shows forwards that are still actually running. Tracked inforwards.json. No new dependencies.
0.6.0 — 2026-06-20
- Sites — group hosts (one site per host, e.g. a data center / project), distinct from the
many-valued free-form tags. A site can carry optional shared SSH defaults — user, port,
ProxyJump (bastion), identity — that member hosts inherit at connect time where the host
leaves a field unset (the host always wins; auth stays per-host). The list groups by site
when idle and shows a
·site·column +site:NAMEfilter while typing. Manage sites with F3 (create/edit/delete + their defaults); assign one in the add/edit form. CLI:sshelf sites [--json],sshelf sites add NAME [-u/-p/-J/-i], andsshelf add --site NAME. Stored inhosts.tomlas[[site]]— old files load unchanged.
0.5.0 — 2026-06-16
- Dual-pane file transfer (
Ctrl-ton a host): a two-pane browser — local files on one side, the host's on the other — to copy files and folders either direction over SFTP, with fuzzy search on both sides and live progress. Authenticates once via ansshControlMaster that reuses the host's existing auth (keys / agent / ProxyJump, or a stored password throughSSH_ASKPASS), then runssftpover it — no PTY, no per-file re-prompt, and~/.ssh/configis never touched.Tabswitches panes,→/Enteropens a directory,Ctrl-ssends the selection,Esccancels; a same-named destination is skipped (not overwritten) and symlinks are flagged and skipped. No new dependencies. --transfer-log <FILE>(also$SSHELF_TRANSFER_LOG): append the transfer screen'sssh/sftpcommands and their errors to a file for debugging — no secrets are logged.
0.4.0 — 2026-06-14
sshelf addopens the TUI add form when run bare, and adds a host non-interactively when given arguments (NAME+--hostnamerequired;--user/--port/--auth/--identity/--jump/ --tag/--extra, and--password-stdinto store a secret without it touching argv). Auth is inferred from--identity/--password-stdin. Replaces the previous placeholder message.sshelf list --json— machine-readable output (each host's fields plus its generatedsshcommand), always valid JSON; a stable surface for scripts and integrations.sshelf -— reconnect to the most-recently-used host.- Dynamic shell completion of saved host names (
clap_completeengine). Enable withsource <(COMPLETE=<shell> sshelf); completes the<host>of direct-connect,print-command, andset-password. - CI: a dependency-audit job (
cargo audit) and an MSRV (1.88) check.
- README states the no-network posture explicitly: no telemetry, no account, no network calls of sshelf's own.
SECURITY.mdnow lists concrete private-reporting channels (GitHub security advisories + email) and documents the vault-mode environment tradeoff.
- The vault master passphrase (
SSHELF_VAULT_PASSPHRASE) is no longer inherited by the exec'dsshfor hosts with no stored secret. (For hosts that use a stored secret in vault mode it remains available to the askpass helper, which requires it — now documented.)
0.3.0 — 2026-06-12
- Print command:
sshelf print-command <host>prints the generated, shell-quotedssh …command for a saved host without connecting or updating frecency — the CLI equivalent of the TUI'sCtrl-yyank. (#3)
- Generated/yanked command strings now expand identity-file
~before shell-quoting, so a quoted path (e.g. one containing spaces) stays copy-paste runnable. (#3)
0.2.0 — 2026-06-07
- Direct connect:
sshelf <host>connects to a saved host by name or id without opening the TUI — same connect path as the TUI (frecency recorded, stored secret auto-supplied). A miss suggests the closest matching names. - List filtering:
sshelf list [query]filters with the same syntax as the TUI search box — fuzzy text and/ortag:NAMEtokens (e.g.sshelf list tag:prod).
0.1.0 — 2026-06-06
Initial public release.
- Fuzzy-search TUI launcher for saved SSH hosts (type to filter,
Enterto connect), atuin-style, with tag filters (tag:NAME) and frecency ordering. - Connect hands the terminal to
sshviaexec()— on logout you're back at your shell. - Add/edit/delete via a single-screen, auth-aware form;
.pem-aware key picker with an in-TUI file browser; quick-add with sensible defaults. - Password / key-passphrase auto-supply via
SSH_ASKPASS: secrets live in the OS keyring (macOS Keychain / Linux Secret Service) or anage-encrypted vault for headless use — never inhosts.toml, never on the command line. - Jump-host chains (
-J), custom ports, extra ssh flags per host. - Read-only import from
~/.ssh/config(sshelf import,Ctrl-o). Ctrl-yyanks the generatedsshcommand;F2settings (hosts-file location);sshelf completions <shell>andsshelf man.- Packaging: Homebrew tap, shell installer, Debian/Ubuntu
.deb(x86_64 + arm64, macOS + Linux).