ringdrop
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/1). 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.
Features
- 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
Install
| 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.
Usage
Print your peer-id
Share your peer-id (i.e. your node public id) with others so they can add you to their rings:
Manage rings
Import and manage files (blobs)
Import a file or directory into the local blob store and produce a ticket:
If 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:
Remove a blob from the local store and all its ring associations:
Grant or change access
Associate a file with one or more rings:
Start the daemon
rdrop serves blobs through a background daemon. Start it once; it keeps running until you stop it:
The daemon serves every blob that has been associated with a ring — there is no per-file serving step to do.
Receive a file
Re-run the same command to resume an interrupted transfer.
Activate more logging
By default only warnings are printed. Set RUST_LOG to get more detail:
RUST_LOG=ringdrop=info RUST_LOG=debug
This applies to every command, not just the daemon.
Contributing
If you have ideas/contributions or anything is not working the way you expect (in which case, please include an output with RUST_LOG=debug) and feel free to open an issue or PR.
After cloning, activate the pre-commit hooks (it runs cargo fmt --check and cargo clippy before every commit, and tag verifications before every push):
Dependencies
ringdrop 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 |
License
MIT — see LICENSE.