Open sourcing syncpick
A small interactive picker for copying selected folders from SSH servers with rsync.
I have had some version of this little SSH and rsync helper for many years. It began as a personal script for the very ordinary job of copying a few folders from a server to my laptop, then quietly grew around the things I kept doing: choosing a source, checking the destination, and remembering the right flags and quoting.
It was never meant to be a product. It was just one of those useful tools that becomes part of your routine, gets adjusted as your setup changes, and keeps earning its place. Recently I decided it was worth giving it a proper clean-up: removing the personal assumptions, making the setup understandable for someone who is not me, adding documentation and tests, and releasing it as syncpick.
syncpick is an interactive fzf picker for copying selected folders from SSH servers with rsync. It is deliberately a small Zsh script rather than a new sync service or a replacement for the tools underneath. You configure a server once, choose it from a list, mark the remote folders you want, and sync them into a local directory.
brew install Cyberlane/tap/syncpick
The intended use is simple. Perhaps there is a home server, NAS, development machine, or a remote box with a few top-level folders you browse regularly. You run syncpick --init, give the profile a name, SSH host, and the remote roots to browse. Then, from the directory where you want the copies to land:
syncpick
The picker only shows directories. > shows the current cursor, while ✓ shows the folders queued with Tab. A queued-folder pane can be toggled when the list is long, and the final screen spells out exactly what will be copied before anything starts. If nothing is queued, Enter simply chooses the folder under the cursor.
That distinction sounds minor, but it is the part of the workflow I value most. rsync is wonderfully capable, and that also means a rushed command can be more consequential than it first appears. I wanted a small layer that made selection visible before the transfer happened, without trying to hide or second-guess rsync itself.
The defaults reflect that. syncpick asks for confirmation before a real transfer, does not remove unmatched local files by default, and uses rsync’s safer temporary-file behaviour. --dry-run is there for checking a larger transfer, while --delete and --inplace are opt-in either for one run or in a profile. There is also --yes (or -y) for scripts or repeatable non-interactive runs; it skips only the final confirmation.
Configuration stays local and intentionally boring. Profiles and recent-profile state use the standard XDG configuration and state directories, created with private permissions. A profile may contain an SSH host, source folders, and a few transfer preferences, but it does not contain passwords, private keys, or passphrases. Authentication remains where it belongs: in SSH configuration, an agent, or the operating system keychain.
Cleaning it up for release also gave me a reason to improve the first-run experience. The guided setup asks for the small amount of information that is needed to get started, detects ssh and rsync from PATH, and leaves the advanced settings for later. On macOS or Linux, the only other dependency is fzf.
syncpick is available under the MIT licence, with source installation instructions as well as the Homebrew tap. If this sounds useful, the README on GitHub has the full setup guide and a short demo of the picker in use.
It is still a modest tool, and I hope it stays that way. The point was not to turn a familiar workflow into a platform; it was to take something I have relied on for years, make it more useful and less personal, and put it somewhere that other people might benefit from it too. If you have a few remote folders to fetch regularly and would rather choose them than reconstruct another long rsync command, I hope it is useful.