ffsend
Securely share files from the command line using client-side encryption and a self-hostable Send server.
ffsend is a fully featured command-line client for the
Send file sharing service. Files are
encrypted entirely on the client using 128-bit AES-GCM before being uploaded, so
the server never sees the plaintext content. Uploaded files are accessible via a
shareable link for a configurable number of downloads (default: 1) or a maximum
of 24 hours, after which they are permanently deleted. The default public host
is send.vis.ee, operated by the author; self-hosting is fully supported.
Features
- Client-side encryption — files are encrypted with 128-bit AES-GCM and signed with HMAC-SHA-256 before leaving your machine; the host never holds the decryption key.
- Configurable expiry — set a download limit (1–20) and an expiry time (up to 24 hours) per upload.
- Optional password protection — add a password on top of the share link for an extra layer of security.
- Directory uploads — automatically archives a directory before uploading and extracts it on download.
- History tracking — keeps a local record of your uploads so you can inspect, update, or delete them later.
- QR code generation — renders a QR code for the share URL directly in the terminal.
- URL shortening — optionally shortens the share link before printing it.
- Clipboard integration — copies the share URL to the clipboard
automatically (
xcliporxselrequired on Linux). - Scriptable —
--no-interact,--yes,--quiet, and environment variable overrides make it straightforward to use in shell scripts. - Alias binaries — symlink the binary as
ffputorffgetfor even shorter upload/download commands.
Installation
cargo install ffsend# Debian / Ubuntu
# No official apt package. Use the cargo command above, or download a
# pre-built static binary from the releases page:
# https://github.com/timvisee/ffsend/releases
# Look for ffsend-v*-linux-x64-static
# Fedora
dnf install ffsend
# macOS
brew install ffsend
# Arch Linux
# Use the AUR (precompiled binary recommended)
yay -S ffsend-bin
# Nix
nix-env -iA nixpkgs.ffsend
On Linux, clipboard support requires xclip or xsel:
# Debian / Ubuntu
apt install xclip
# Fedora / RHEL
dnf install xclipUsage
Uploading
# Upload a file — prints a share URL
ffsend upload my-file.txt
# Limit to a single download and expire after 10 minutes
ffsend upload --downloads 1 --expiry-time 10m my-file.txt
# Prompt for a password, archive the directory, and copy the URL to clipboard
ffsend upload --password --archive --copy project/
# Upload to a self-hosted Send instance
ffsend upload --host https://send.example.com/ my-file.txtDownloading
# Download a file using the share URL
ffsend download https://send.vis.ee/#sampleShareUrl
# Download a password-protected file
ffsend download --password https://send.vis.ee/#sampleShareUrlManaging uploads
# View your upload history
ffsend history
# Fetch metadata about a shared file
ffsend info https://send.vis.ee/#sampleShareUrl
# Change the password of an existing upload
ffsend password https://send.vis.ee/#sampleShareUrl
# Delete an upload before it expires
ffsend delete https://send.vis.ee/#sampleShareUrl
# Check if a file still exists
ffsend exists https://send.vis.ee/#sampleShareUrlAlias binaries
Create symlinks named ffput and ffget to invoke upload and download without
a subcommand:
ln -s $(which ffsend) ~/.local/bin/ffput
ln -s $(which ffsend) ~/.local/bin/ffget
# Then just:
ffput report.pdf
ffget https://send.vis.ee/#sampleShareUrlConfiguration
Defaults can be overridden with environment variables, avoiding the need to repeat flags in scripts:
export FFSEND_HOST=https://send.example.com/ # use your own server
export FFSEND_DOWNLOAD_LIMIT=1 # always default to 1 download
export FFSEND_EXPIRY_TIME=3600 # default expiry: 1 hour
export FFSEND_NO_INTERACT=1 # never prompt (for scripts)
export FFSEND_COPY=1 # always copy URL to clipboardScripting example
#!/bin/sh
set -e
# Upload quietly and capture the URL
URL=$(ffsend --no-interact --yes upload --quiet build/output.tar.gz)
# Share it
echo "Download at: $URL"
# Remove the file once the recipient confirms receipt
ffsend --no-interact delete "$URL"ffsend vs magic-wormhole
Both tools offer encrypted, ephemeral file transfer from the terminal.
| Feature | ffsend | magic-wormhole |
|---|---|---|
| Transfer mechanism | Upload to a server, share a URL | Direct or relayed peer-to-peer |
| Recipient needs the tool | ❌ (browser download works) | ✅ |
| Download limit / expiry | ✅ | ❌ |
| Password protection | ✅ | ✅ (via wormhole code) |
| NAT traversal | ❌ | ✅ |
| Self-hostable backend | ✅ | ✅ |
| History tracking | ✅ | ❌ |