Skip to content

polius/fsend

Repository files navigation

fsend

Peer-to-peer, end-to-end encrypted file transfer.

checks Release License

fsend demo: the sender runs 'fsend drone-4k.mov' and gets a share code; the receiver runs 'fsend <code>', accepts, and the file lands in ~/Downloads.

One command to send, one to receive.

About

fsend is a command-line tool that lets any two computers transfer files and folders straight to each other.

  • Peer-to-peer — bytes go straight from sender to receiver at your own internet speed (relay only as a fallback)
  • End-to-end encrypted — TLS 1.3 between the peers, authenticated by the share code (PAKE); even the fallback relay never sees the file
  • No ports to open — works on any network, no router or firewall setup
  • Send anything — files, folders, multiple at once, stdin streams, or literal text
  • Resumable — a dropped transfer continues where it left off on the next send (with a fresh code), instead of starting over
  • Skips what's already there — re-send a folder and only the new or changed files transfer
  • Password-protected — gate any transfer with --pass; receiver supplies it to unlock
  • Post-quantum — X25519 + ML-KEM-768 (NIST); designed so future quantum computers can't decrypt today's transfers
  • Self-hostable — deploy your own pairing server + relay with Docker compose
  • Runs anywhere — single static binary on Linux, macOS, FreeBSD, Windows; x86 and ARM

Install

Linux, macOS, FreeBSD — x86 and ARM:

curl -fsSL https://getfsend.alzina.dev | sh

Windows — run this in PowerShell:

irm https://getfsend.alzina.dev/install.ps1 | iex

Both installers verify the release's SHA-256 checksum before installing.

Other install methods

From source:

go install github.com/polius/fsend/cmd/fsend@latest

Or grab a release binary from the releases page.

Examples

Send a file — fsend hands you a share code:

$ fsend report.pdf
  Sending report.pdf  ·  1 file  ·  2.4 MB

  On the other machine, run:

      fsend abc-defg-jkm

Receive — run that code, and the file lands in the current folder:

$ fsend abc-defg-jkm

More ways to send:

fsend ./project                    # a whole folder
fsend a.txt b.txt c.txt            # several at once
pg_dump mydb | fsend               # a stream from stdin
fsend --text "wifi: hunter2"       # a literal string
fsend report.pdf --pass            # gated behind a password

…and to receive:

fsend --yes abc-defg-jkm              # skip the confirmation prompt
fsend --out ~/Downloads abc-defg-jkm  # save to a specific folder

Documentation

How it works Three transfer modes, raced concurrently — and why
Security Threat model — what the server can and cannot see
Usage Every flag, env var, and exit code
Self-hosting Run your own pairing server in three steps
Development Build and test from source
Troubleshooting Common errors and what to do about them

Comparison

fsend vs croc vs magic-wormhole — a side-by-side table on data path, cryptography, codes, and features.

Contributing

Bug reports and pull requests welcome — see Development to build from source, or open an issue.

License

MIT

About

Peer-to-peer, end-to-end encrypted file transfer from the command line. Share a code, send anything, no accounts.

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Contributors