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 (xclip or xsel required 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 ffput or ffget for 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 xclip

Usage

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.txt

Downloading

# 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/#sampleShareUrl

Managing 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/#sampleShareUrl

Alias 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/#sampleShareUrl

Configuration

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 clipboard

Scripting 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.

Featureffsendmagic-wormhole
Transfer mechanismUpload to a server, share a URLDirect 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