sendrecv is a Go CLI for repeat SSH-based file transfer between known devices. It keeps the transfer workflow in one binary while relying on ssh and rsync only at runtime.
v1 currently targets macOS and Linux. Windows support and a built-in TUI are out of scope for this release.
sendandrecvsubcommands built around host presets- interactive host picking in
send, withfzffirst and Go fallback - TOML config with per-host defaults
- configurable send transfer mode:
auto,raw, orarchive - automatic raw vs archive decision logic in
automode - Go-native
tar.gzarchive packing and unpacking - optional auto-extract on the destination side
- strip-common-prefix path mode by default
- opt-in
--preserve-tree --dry-runand--verbosedoctorchecks for required tooling- documented Yazi integration, including the companion plugin
See docs/install.md.
Simplest install is Homebrew
brew install connorpink/tap/sendrecvLinux deb/rpm and MacOS packages also exist.
sendrecv config init
$EDITOR ~/.config/sendrecv/config.toml
sendrecv config validate
sendrecv hosts
sendrecv send file.mp4
sendrecv send --no-compress ./big-folder
sendrecv send --transfer-mode raw ./big-folder
sendrecv send ./dir
sendrecv send --remote-host laptop ./dir
sendrecv recv laptop nested/file.txtThe local machine needs:
sshrsync
The local machine needs ssh and rsync, and the remote machine also needs rsync because transfers run through remote rsync over SSH. If the remote host does not expose rsync on PATH, set remote_rsync_path for that host in the config.
For archive-mode recv, the remote machine must also have a compatible sendrecv binary available on PATH, in a standard Homebrew location, or at the configured sendrecv_path.
For archive-mode send, remote sendrecv is optional:
- if remote
sendrecvexists and extraction is enabled, the archive is unpacked remotely - if remote
sendrecvis missing but remotetarandgzipexist,sendrecvfalls back to shell extraction on the remote host - if neither extraction path is available,
sendrecvuploads the archive directly intoremote_dirand prints the final archive path - raw single-file transfers for incompressible files still work with just
sshandrsync
send also supports --transfer-mode auto|raw|archive, and --no-compress is a shorthand for --transfer-mode raw. You can make that the default with defaults.send_transfer_mode = "raw" in config.
Archive-mode remote execution uses:
sendrecv pack --output <archive> --base <dir> <members...>sendrecv unpack --archive <archive> --dest <dir>
These are normal CLI commands and can be called over SSH by another sendrecv instance.
sendrecv doctor remote <host> checks:
- remote
rsync - remote
sendrecv - remote
tar - remote
gzip remote_dirreadinessremote_temp_dirreadiness
If remote_rsync_path is configured, remote doctor checks that exact command/path and reports configuration-specific failures.
That makes it possible to see whether the host can do raw transfers only or full archive send/recv flows.
See docs/config.md and examples/config.toml.
Yazi is optional. The CLI remains the source of truth and Yazi should call sendrecv, not reimplement it.
The recommended path is the companion plugin, connorpink/sendrecv:
ya pkg add connorpink/sendrecvThe plugin reads hosts from sendrecv hosts --json, chooses a host inside Yazi, and launches sendrecv send --remote-host ... as a background task. See docs/yazi.md.
The package boundaries and transfer flow are documented in ARCHITECTURE.md.
