Dawn Winery Distributed Files Sharing Protocol
  • Rust 97.5%
  • Nix 2.5%
Find a file
2026-02-21 17:09:30 +02:00
dwshare-cli feat(cli): add "available" to storage command 2026-02-20 18:55:52 +02:00
dwshare-gtk feat(gtk): gtk client preparations 2026-02-21 17:09:30 +02:00
dwshare-lib feat(lib): tweak bulk download default param values again 2026-02-20 20:49:28 +02:00
.envrc init commit 2026-01-22 13:47:34 +02:00
.gitignore init commit 2026-01-22 13:47:34 +02:00
Cargo.lock feat(gtk): gtk client preparations 2026-02-21 17:09:30 +02:00
Cargo.toml feat(gtk): gtk client preparations 2026-02-21 17:09:30 +02:00
flake.lock init commit 2026-01-22 13:47:34 +02:00
flake.nix feat(gtk): gtk client preparations 2026-02-21 17:09:30 +02:00
LICENSE init commit 2026-01-22 13:47:34 +02:00
README.md docs: update readme 2026-02-18 12:18:19 +02:00

Dawn Winery's Data Sharing Protocol

Dwshare is a fully decentralized, KISS-following data sharing protocol. Unlike BitTorrent, dwshare doesn't have trackers, "torrent files", metadata, and it doesn't allow to share filesystem trees.

Instead of files and folders we share BLOBs - immutable slices of binary data of any kind. Each blob is split into chunks - segments of 48 KiB (49152 bytes), and each chunk's content is hashed using blake3 hash function. After that, each blob gets its own address hash, which is calculated as hash(hash(chunks[1]) || hash(chunks[2]) || ... || hash(chunks[n])).

Each dwshare instance is a peer-to-peer network node. They share information about existing blobs with each other. Each peer can query list of other peers that announced blobs with given address hash, and each peer can query list of chunks' hashes for the given blob's address hash. This means that we don't need to know hash of each chunk - only the blob's address hash. Since it's produced from concatenation of all the chunks' hashes then we can easily verify received chunks list.

Since the chunk's size is fixed on the protocol level the same blobs will always produce the same chunks and address hashes.

All the communication is performed over UDP, by default on port 23090.


The project is licensed under GPL-3.0-or-later