/acp

Minimalistic personal P2P file transfer: CLI tool and service@edge

Primary LanguageGoMIT LicenseMIT

acp

demo.gif

Highlights (aka "Why making another file-transfer tool?"):

  • Designed for personal use; no need to copy-paste a token / code for each transfer
  • Rendezvous service runs distributively on serverless edge function, a robust solution with low latency worldwide. (How does this work?)

Other features:

  • End-to-end encryption (ChaCha20-Poly1305)
  • P2P connection: LAN or WAN, with NAT transversal
  • Compression (gzip)
  • Cross platform: Linux, macOS, Windows
  • Support transfering multiple files and directories

See also comparison table with similar tools.

Get started

Linux, macOS

On any of your machine, run

curl -fsS https://acp.deno.dev/get | sh

It sets up the current machine by downloading an executable and generating an identity. By default the install path is /usr/local/bin; you can change it by curl -fsS 'https://acp.deno.dev/get?dir=/path/to/bin' | sh At the end, it prints out the command for setting up your other machines. You can run acp --setup any time you want to see the command.

Windows

Currently there is no installation script for PowerShell (PR welcomes :) You can download the released executable and put it on your Path. Then run acp --setup to generate an identity.

Usage

# sender
acp path/to/files

# receiver
acp # for receiving to pwd or
acp -d path/to/dest

You can run the sender and receiver in arbitrary order. Whenever both sides are up and running, they will attempt to establish a P2P connection. If you see messages such as rendezvous timeout, at least one side is behind a firewall or a strict NAT that prohibits P2P connection.

For advanced configuration and self-hosting (it's free & takes only 5 minutes!), check out the docs here.

Similar projects

trzsz scp acp pcp croc
can share files to other people /
receiver needs to enter a token
O O
LAN O O O O O
WAN (local ↔︎ remote) O O O P O
WAN (remote ↔︎ remote) P O P O
relay P O
p2p O O O
distributive O O

O: supported; P: partial support or limited usablity; (void): not supported or not relevant

Don't judge a tool based on its apparent set of features. This table only lists a few features, intending to differentiate the target scenarios of these tools.

Acknowledgement

Apart from the dependencies listed in go.mod, this project is also built upon

  • Deno Deploy exposes low-level connection infomation and provides a fantastic BroadcastChannel API that makes "serverless" TCP hole-punching possible
  • mholt/archiver: tar/untar implementation
  • libp2p/go-reuseport: address reuse for TCP hole-punching
  • egoist/bina: installation script