ringdrop
rdrop is a streamed P2P file transfer tool with ring-based access control, built on iroh and iroh-blobs.
To share a file, tag 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/ring/1). When a peer requests a blob, the sender checks whether that peer's peer-id belongs to any ring the blob is tagged 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
From source (Linux / macOS):
|
If you already have Rust installed:
After installation, rdrop is available from anywhere in your shell. If it isn't, make sure ~/.cargo/bin is in your PATH.
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 --tag or --open is given and the file has no existing tags, a warning is printed. The blob cannot be transferred until it is tagged.
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 associated tags:
Grant or change access
Add a file to one or more rings by tagging:
Share
Start the sharing node and make all authorised blobs available until Ctrl-C:
Keep this running while peers download. The same node serves every blob that has been tagged — there is no per-file serving step.
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 share.
Contributing
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.