# ferry

salix@host:~/projects/ferry

Ferry is a set of native apps for working over SSH, for Android and GNOME. You save each machine once โ€” its address, user, authentication and observed operating system โ€” and it turns into one-tap terminal sessions, SFTP file browsing, background transfers and a live Docker and Podman fleet. Everything lives in a vault on hardware you control, not in an account somewhere.

That vault is a real KeePass database, KDBX4, protected by a master password. You can keep several vaults on one machine โ€” Personal, Work โ€” each with its own file and password. OpenSSH private keys are stored as protected attachments, and Ferry reads and writes the KeeAgent.settings format shared with KeePassXC and Strongbox. On Android there’s an optional biometric unlock, but the master password remains the recovery path. Sync runs over your own WebDAV server, and the encrypted vault copy is all that ever travels: Ferry never syncs decrypted records.

The terminal side behaves like you’d hope. A dropped session reconnects with backoff, persistent tmux terminals keep their programs running through disconnects, vault locks and closed windows, and one jump host can be reached through a direct-tcpip channel. SFTP browsing covers remote file editing and permission changes, with uploads and downloads moving through a background queue and recursive folder transfers treated as one job.

The part I’m proudest of: Ferry talks to each host’s Docker or Podman HTTP API over SSH itself โ€” no agent, no exposed TCP port. It follows engine events, so container lists update as things start, crash or turn unhealthy; stacks are edited and deployed Dockge-style, and image updates are checked against the registry without pulling. Desktop notifications report crash loops.

Android APKs and Linux Flatpaks are published with releases, and the stable apps also live in the Salix F-Droid and Flatpak repositories, with signed nightlies that install beside them. Like most things here, it’s a personal project and the code is source available: read it and learn from it on the forge, but reusing or redistributing it isn’t granted by default.

~$