Private file transfer, straight between two computers.
One command to send, one to receive.
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.
Linux, macOS, FreeBSD — x86 and ARM:
curl -fsSL https://getfsend.alzina.dev | shmacOS — if you prefer Homebrew:
brew install polius/tap/fsendWindows — run this in PowerShell:
irm https://getfsend.alzina.dev/windows | iexOther install methods
From source:
go install github.com/polius/fsend/cmd/fsend@latestOr 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 # powershellSend 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| 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 |
fsend vs croc vs magic-wormhole — a side-by-side table on data path, cryptography, codes, and features.
Bug reports and pull requests welcome — see Development to build from source, or open an issue.
MIT