Self-hosted service
mfat/sshpilot avatar
mfat/sshpilot

SSH Pilot, a graphical SSH client that starts from your existing config

User-friendly, cross-platform SSH connection manager

1,097 stars77 forksPythonGPL-3.0

At a glance

What is it?
SSH Pilot is a GTK 4 SSH and SFTP client for Linux and macOS that works with the ~/.ssh/config you already have, and adds a tabbed terminal, a dual-pane file manager, key management and a set of secret backends. It ships through package repositories on most distributions, and the two backends it can use differ by platform.
Who is it for?
SSH Pilot fits a system administrator or developer who keeps many hosts in ~/.ssh/config and wants a window for them, a file transfer pane and a key manager, without giving up the config file or the host's own ssh binary. It does not fit a user on a distribution older than the listed minimums, and it does not fit someone who needs the xterm.js terminal backend on macOS, because WebKit is Linux only there and the application falls back to VTE.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 3 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 21, 2026, and from our analysis. They are not legal advice.

Editorial analysis

It reads the config file you already wrote

SSH Pilot is a user-friendly SSH and SFTP client for Linux and macOS, and the first feature on the list is the one that decides whether it is useful to you. It works with your existing ~/.ssh/config, so the hosts you have already described are the hosts the application shows, with no import step and no second copy of your inventory. The rest of the feature list builds a complete client around that. The terminal is integrated, with a tabbed interface and split view support, and it works with your favourite terminal apps as well, which is the escape hatch for anyone who prefers their own emulator. Files move through a built-in dual-pane SFTP manager, with SCP upload and download support as well. Keys can be transferred to a server the way ssh-copy-id does, and known hosts and authorized keys are managed locally and remotely. There is also a graphical Docker container manager, snippets for running a saved command quickly, and an extension mechanism through plugins. The intended user is someone who lives in ssh and wants a window instead of a shell.

Secrets come from libsecret, KeePass, Bitwarden or pass

The credential story is the part that distinguishes this client from a plain terminal with a file manager bolted on. SSH Pilot supports several secure storage backends, namely libsecret, KeePass, Bitwarden and Vaultwarden, and pass. On top of that there is backup and restore to and from Bitwarden or Vaultwarden, or from your own servers, and the README says that covers app settings, secrets and keys, so a machine can be rebuilt without losing the credentials that live on it. The dependency list shows the shape of it, with keyring for the secret store integration, cryptography for the key and certificate work, and pykeepass for the KeePass adapter. The pyproject comment on that adapter is worth reading, because it says the import is lazy and that the adapter reports itself unavailable if its own dependencies, lxml, pycryptodomex and argon2-cffi, are missing, in which case the rest of the application is unaffected. In other words, a missing KeePass stack degrades one feature rather than breaking the program.

Six ways to install, and one that never updates itself

The README says that binaries can be downloaded from the releases section, but recommends adding one of the package repositories so that updates arrive automatically. On Ubuntu there is a PPA, and on Debian an APT repository with a GPG key and a sources list entry.

bash
sudo add-apt-repository ppa:mfat/sshpilot
sudo apt update
sudo apt install sshpilot
bash
curl -fsSL https://mfat.github.io/sshpilot-ppa/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/sshpilot-ppa.gpg
echo "deb [signed-by=/usr/share/keyrings/sshpilot-ppa.gpg] https://mfat.github.io/sshpilot-ppa any main" | sudo tee /etc/apt/sources.list.d/sshpilot-ppa.list
sudo apt update
sudo apt install sshpilot

For RPM based systems there is a COPR, and it is two commands.

bash
dnf copr enable mahdif62/sshpilot
dnf install sshpilot

Then there is Flatpak, the AUR with a nightly package, Homebrew for macOS and Linux, and a dmg for macOS on both Apple silicon and Intel. The AppImage is the odd one out and the README is explicit about why, since it bundles GTK 4, libadwaita, VTE, GtkSourceView, WebKitGTK and Python so that the xterm.js terminal backend and the Host Info tab behave the same as in the other packages, and it uses the host's ssh, but there are no automatic updates, so you fetch a new file when a release lands, and it needs FUSE 3 to mount itself, with --appimage-extract-and-run as the fallback on a system without it.

The minimum requirements are recent ones

The requirement tables are the most useful part of the documentation for anyone deciding whether to install this on an older machine. The operating system floor is Debian 13, Ubuntu 24.04, Linux Mint 22, Fedora 43, RHEL and CentOS Stream 10, rolling Arch Linux, and macOS 14 Sonoma. On any other Linux distribution the answer is the Flatpak, because it runs everywhere Flatpak does. The library floor is equally specific, with Python 3.12, GTK 4 at 4.6, libadwaita at 1.5, VTE for the GTK 4 terminal at 0.70, PyGObject at 3.42, pycairo at 1.20.0, cryptography at 42.0, keyring at 24.3, psutil at 5.9.0, pykeepass at 4.0, certifi at 2023.7.22 and GtkSourceView at 5.0. Two of those deserve attention. The GTK 4 stack is a hard requirement rather than a nicety, and the WebKit dependency is not a Python package at all but a system library, with different package names on Debian, Fedora and Arch, so a source build has to install the right one for your distribution.

macOS gets a different terminal backend

The macOS story is not a straight port, and the README says so. WebKit is Linux only and is not available on macOS through Homebrew, which means the xterm.js backend does not work there and the application uses the VTE backend instead. The visual difference is that the browser based terminal and the Host Info tab, which the AppImage description says behave the same everywhere, are not the same on macOS. Development on macOS needs a long list of Homebrew packages, gtk4, libadwaita, pygobject3, py3cairo, vte3, gobject-introspection, adwaita-icon-theme, pkg-config, glib, graphene, icu4c, sshpass and gtksourceview5. The Homebrew formula itself is build from source, so a first install pulls the GTK 4 stack and compiles a Python virtual environment with the runtime dependencies, and the documentation says to launch the application from a terminal inside an active desktop session, with Wayland or X11 plus dbus on Linux and native on macOS.

The Python packaging has rules about what pip may install

The pyproject file is careful, and the comments in it explain why. The version is dynamic and read from the sshpilot package's __init__.py by the setuptools build through an AST parse rather than an import, so that the wheel version cannot drift from the application version again. The runtime dependencies are PyGObject, pycairo, cryptography, keyring, psutil, certifi, PyYAML and pykeepass, and the file also declares optional extras. The test extra pulls pytest, pytest-cov, pytest-xdist, jsonschema and paramiko, with a comment that paramiko is used by test_combined_auth.py as a mock SSH server and is not a runtime dependency, because the file manager uses the native OpenSSH ssh -s sftp subprocess instead. The mcp extra exists for the optional MCP servers and is kept out of the base install to keep it lean. The rule that matters most for anyone building from source is stated in requirements.txt, which says plainly not to install PyGObject or pycairo through pip, since the distribution provides them as system packages, and a pip install would build them from source and need a C toolchain and GTK development headers.

The repository holds several programs, not one

The top level listing shows a project with more than one executable in it. There are src/ for the application code, ssh/ for the SSH related material, and three separate components named sshpilot-core, sshpilot-agent and sshpilot-daemon, plus sshpilot-mcp-dev for the Model Context Protocol servers. The packaging side is substantial, with a debian/ directory, a flatpak/ directory, an io.github.mfat.sshpilot.yaml manifest, a packaging/ directory, a meson.build at the root alongside the setuptools build in pyproject.toml, and po/ for translations. There are also tests, docs, a cfg/ and a data/ directory, pytest.ini and two requirements files for development and for the GUI tests, a pre-commit configuration and an .oss-scanner directory. The release cadence is fast, with v6.2.9 on 2026-10-05, v6.3.0 on 2026-10-09 and v6.3.1 on 2026-10-13, and the last push on 2026-10-15, so a client that talks to servers and stores credentials is being changed every few days. The licence is GPL-3.0.

Editorial conclusion

SSH Pilot fits a system administrator or developer who keeps many hosts in ~/.ssh/config and wants a window for them, a file transfer pane and a key manager, without giving up the config file or the host's own ssh binary. It does not fit a user on a distribution older than the listed minimums, and it does not fit someone who needs the xterm.js terminal backend on macOS, because WebKit is Linux only there and the application falls back to VTE. Verify three things before installing: that your distribution or macOS version meets the minimum table, since the floor is Debian 13, Ubuntu 24.04, Fedora 43, RHEL 10 and macOS 14, which rules out a lot of older machines, which secret backend you want to use, because KeePass support is optional and degrades to unavailable when its own dependencies are missing, and whether you want the terminal rendered by VTE or by the browser based backend, since the AppImage bundles both and the choice changes what you can do with a terminal.

Frequently asked questions

What is SSH Pilot?

It is a user-friendly SSH and SFTP client for Linux and macOS that works with your existing ~/.ssh/config. It includes a tabbed terminal with split view, a dual-pane SFTP file manager, SCP support, key transfer, known hosts and authorized keys management, a Docker container manager and snippets, and it is extensible through plugins.

How do I install SSH Pilot on Ubuntu?

Add the PPA with sudo add-apt-repository ppa:mfat/sshpilot, run sudo apt update and then sudo apt install sshpilot. The README recommends a package repository rather than the releases page so that updates arrive automatically.

Which secret storage backends does SSH Pilot support?

It supports libsecret, KeePass, Bitwarden and Vaultwarden, and pass, and it can back up and restore to Bitwarden or Vaultwarden or to your own servers, covering app settings, secrets and keys. The KeePass adapter is optional and reports itself unavailable if its own dependencies are missing, without affecting the rest of the application.

Is the terminal backend the same on macOS and Linux?

No. WebKit is Linux only, so the xterm.js backend is not available on macOS and the application uses the VTE backend there instead. The AppImage bundles GTK 4, libadwaita, VTE, GtkSourceView, WebKitGTK and Python so the backends behave the same as in the other Linux packages, and it uses the host's ssh.

Official sources

  1. License: GPL-3.0
  2. mfat/sshpilot on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/mfat-sshpilot.svg)](https://hysenlabs.com/projects/mfat-sshpilot)

Was this useful?