Skip to content
poliusPublic

About

Peer-to-peer, end-to-end encrypted file transfer from the command line.

Topics

Resources

Security policy

Stars

22 stars

Watchers

0 watching

Forks

Repository files navigation

fsend

Private file transfer, straight between two computers.

checks Release License Public server status

fsend demo: the sender runs 'fsend backup.zip' and gets a share code; the receiver runs 'fsend <code>', accepts, and the file lands in ~/Downloads.

One command to send, one to receive.

Why fsend

fsend moves a file from one computer to another with as little ceremony as possible. No account, no upload step, no ports to open — just two commands and a short share code.

  • Direct by default — the bytes stream straight from sender to receiver at your own internet speed. A relay is used only when a direct path can't be found.
  • End-to-end encrypted — TLS 1.3 between the peers, authenticated by the share code (PAKE). Even the fallback relay only ever sees ciphertext.
  • No network setup — works behind NAT and firewalls. Nothing to configure.
  • Send anything — a file, a folder, several at once, a stdin stream, or a literal string.
  • Resumable — if a transfer drops, the next send picks up where it left off instead of starting over.
  • Skips what's there — re-send a folder and only the new or changed files move.
  • Optional password — gate any transfer with --password.
  • Post-quantum — X25519 + ML-KEM-768 (NIST), so today's transfers stay private against future quantum computers.
  • Runs anywhere — one static binary for Linux, macOS, FreeBSD and Windows, on x86 and ARM. Self-host the pairing server if you like.

Install

Linux, macOS, FreeBSD — x86 and ARM:

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

macOS — if you prefer Homebrew:

brew install polius/tap/fsend

Windows — run this in PowerShell:

irm https://getfsend.alzina.dev/windows | iex
Other install methods

From source:

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

Or grab a release binary from the releases page.

Tab-completion (optional)

Add the line for your shell to its rc file ($PROFILE on PowerShell):

eval "$(fsend completion zsh)"                                 # zsh
eval "$(fsend completion bash)"                                # bash
fsend completion fish | source                                 # fish
fsend completion powershell | Out-String | Invoke-Expression   # powershell

Examples

Send a file, a folder, several at once, a stdin stream, or a literal string:

fsend ./project                    # a whole folder
fsend a.txt b.txt c.txt            # several files at once
pg_dump mydb | fsend               # a stream from stdin
fsend --text "wifi: hunter2"       # a literal string
fsend backup.zip --password        # 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
fsend --out - abc-defg-jkm | tar xz   # stream to stdout and pipe it

How it works

Watch the fsend video — a 90-second walkthrough of how it works

Documentation

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

Topics

Resources

Security policy

Stars

22 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages