rdrop is a streamed P2P file transfer tool with ring-based access control, built on iroh-blobs and iroh-rings.
To share a file, associate it with one or more rings and get back an rdrop:// ticket to hand to peers.
Only peers who are members of those rings can download it.
Transfers resume automatically if interrupted — no verified data is re-transferred after a crash or disconnect.
Access control is enforced at the connection level via an ALPN protocol (/iroh-rings/0). When a peer requests a blob, the sender checks whether that peer's peer-id belongs to any ring the blob is associated with. If not, the transfer is denied before any data is sent.
- Ring-based access control — share with specific peers or groups via private rings, or open to everyone
- Crash-safe resumption — BLAKE3 bitfield tracks verified chunks; interrupted downloads pick up where they left off
- Verified streaming — every 16 KiB chunk is verified against the BLAKE3 hash tree before being written to disk
- Directory support — import and share entire directories as a single ticket
| Platform | Quick command |
|---|---|
| Linux | cargo install ringdrop |
| macOS | brew tap rikettsie/tap && brew install rdrop |
| Windows (PowerShell) | scoop bucket add rikettsie https://github.com/rikettsie/scoop-bucket; scoop install rdrop |
For prerequisites, alternative methods, and troubleshooting see install/INSTALL.md.
Share your peer-id (i.e. your node public id) with others so they can add you to their rings:
rdrop idrdrop ring new <ring-name> # create a private ring
rdrop ring list # list all rings
rdrop ring add <ring-name> <peer-id> # add a peer to a ring
rdrop ring add <ring-name> <peer-id> --nickname <nickname> # with a display label
rdrop ring remove <ring-name> <peer-id> # remove a peer
rdrop ring members <ring-name> # list peers of a ringImport a file or directory into the local blob store and produce a ticket:
rdrop import <file-name> # shortcut, warns if not associated with any ring
rdrop import <file-name> --open # publicly accessible
rdrop import <file-name> --tag <ring-name> # restrict to a ring
rdrop blob import <file-name> --open # same, via blob subcommandIf no --ring or --open is given, then the file is not associated with any ring and a warning is printed. The blob cannot be transferred until it is associated with a ring.
If the file was already imported, the existing rings are summarised instead.
rdrop blob groups all blob lifecycle operations. rdrop import is a shortcut for rdrop blob import.
List all local blobs with their ring tags and share ticket:
rdrop blob listRemove a blob from the local store and all its ring associations:
rdrop blob remove <file-name>
rdrop blob remove <hash>Associate a file with one or more rings:
rdrop tag <file-name> --ring <ring-name> # restrict to a ring
rdrop tag <file-name> --open # anyone with the ticket
rdrop tag <hash> --ring <ring-name> # same, by BLAKE3 hash
rdrop tag <hash> --openrdrop serves blobs through a background daemon. Start it once; it keeps running until you stop it:
rdrop daemon start # start in the background
rdrop daemon status # show status and node ID
rdrop daemon stop # stop the daemonThe daemon serves every blob that has been associated with a ring — there is no per-file serving step to do.
rdrop receive rdrop://ABCDEF... [--dest ./downloads]Re-run the same command to resume an interrupted transfer.
By default only warnings are printed. Set RUST_LOG to get more detail:
RUST_LOG=ringdrop=info rdrop daemon start # info-level logs for all ringdrop code
RUST_LOG=debug rdrop daemon start # debug logs including iroh internalsThis applies to every command, not just the daemon.
After cloning, activate the pre-commit hooks (it runs cargo fmt --check and cargo clippy before every commit, and tag verifications before every push):
git config core.hooksPath .githooksringdrop is built on:
| Crate | Role |
|---|---|
| iroh | QUIC transport, NAT traversal, relay fallback |
| iroh-blobs | BLAKE3 chunking, FsStore, verified streaming |
| bao-tree | bao encoding/decoding, ChunkRanges, bitfield conversion |
| redb | Embedded persistent store for the ring registry |
| tokio | Async runtime |
MIT — see LICENSE.