ringdrop 0.2.1

P2P streamed file transfer with ring-based access control, built on iroh and bao protocols
Documentation

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):

curl -fsSL https://raw.githubusercontent.com/rikettsie/ringdrop/main/install.sh | bash

If you already have Rust installed:

cargo install ringdrop

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 with others so they can add you to their rings:

rdrop id

Manage rings

rdrop 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 ring

Import and manage files (blobs)

Import a file or directory into the local blob store and produce a ticket:

rdrop import <file-name>                    # shortcut, warns if untagged
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 subcommand

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:

rdrop blob list

Remove a blob from the local store and all its associated tags:

rdrop blob remove <file-name>
rdrop blob remove <hash>

Grant or change access

Add a file to one or more rings by tagging:

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>   --open

Serve

Start the sharing node and serve all authorised blobs until Ctrl-C:

rdrop serve

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

rdrop receive rdrop://ABCDEF... [--dest ./downloads]

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 rdrop serve      # info-level logs for all ringdrop code
RUST_LOG=debug rdrop serve              # debug logs including iroh internals

This applies to every command, not just serve.

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.