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/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.
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 --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:
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 associated with a ring — 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.