Shardnet

Store and share files without servers.
Encrypted on your device. Split across the network.
Nothing to trust.

v0.97.0  ·  Alpha  ·  Linux x86_64  ·  static binary  ·  no dependencies

Encryption

AES-256-GCM. The key never leaves your machine.
A magnet link encodes the file ID and the decryption key. No server ever sees either.

Erasure coding

15 shards. Any 10 reconstruct the complete file.
Upload works from just 2 nodes. Five shards can be lost and the file still reconstructs. Reed-Solomon 10 + 5.

No infrastructure

No accounts. No central servers. Storage nodes see only opaque ciphertext.
Kademlia DHT for routing. QUIC/TLS for transport. Ed25519 for identity.

Useful when the file must not touch a cloud provider — legal hold, sensitive IP, or jurisdictions where data residency matters. Because there is no central index, there is nothing to subpoena, block, or deplatform. The swarm continues to serve a file as long as at least 10 of its 15 storage nodes remain online.

How a file travels

Your file leaves encrypted. Arrives in fifteen fragments.
Lives on no single machine.

01

Encrypt

A random key is generated locally. Your plaintext never touches the network.
AES-256-GCM
02

Shard

The ciphertext splits into 15 fragments — 10 data, 5 parity. Any 10 rebuild the file.
Reed-Solomon
03

Distribute

Each fragment goes to a different node over QUIC/TLS. You get one magnet link.
Kademlia DHT
Protocol stack
TransportQUIC (quinn 0.11) + TLS 1.3 (rustls)
IdentityEd25519 — keypair generated locally on first run
RoutingKademlia DHT — k=20, XOR metric, 256 buckets
Erasure codingReed-Solomon — 10 data + 5 parity shards
EncryptionAES-256-GCM — key never leaves the uploading node
Sybil resistanceArgon2id proof-of-work at node startup
SerialisationBincode — binary, length-prefixed frames
Rate limitingToken bucket per source IP, sliding window
NAT traversalSTUN + UDP hole punching + TTL-bounded relay fallback
Address discoveryInterface scan — RFC1918, CGNAT (100.64/10), IPv6 aware
Dynamic IPSTUN refresh every 60 s — survives mobile and VPN IP changes
Security properties  ·  threat model ↗
Sybil resistance
Argon2id proof-of-work at node startup. Cheap identity flooding requires real CPU cost per identity.
Replay protection
SHA-256 message fingerprinting with sliding-window deduplication. Each packet carries a one-time nonce.
Rate limiting
Token-bucket per source IP — automatic burst absorption and eviction of stale buckets.
Packet integrity
10 MB hard payload cap. Checked arithmetic prevents integer overflow in length fields.

For agents

01

Persist context

Upload any blob — JSON state, checkpoint, embedding. Get a magnet. Retrieve from any node, any session, any host.
POST /api/files/upload
02

Coordinate

Ed25519-signed room chat over the P2P mesh. No broker to operate. Agents authenticate each other by node ID.
POST /api/chat/send
03

Share artifacts

Store outputs, datasets, reports. Pass the magnet to downstream agents — whoever holds it can retrieve the file.
POST /api/files/download
# save — upload context blob, receive magnet
curl -X POST http://localhost:9201/api/files/upload -F "[email protected]"
# → {"magnet": "y36fKjLL…", "filename": "ctx.json"}

# restore — download by magnet (any node, any session)
curl -X POST http://localhost:9201/api/files/download \
     -H "Content-Type: application/json" \
     -d '{"magnet": "y36fKjLL…"}'
# → {"path": "/path/to/downloads/ctx.json"}

Full API reference (written for LLM consumption)  →  llms-full.txt   ·   Runnable examples (Python · shell · Node.js)  →  examples/

Magnet links contain the decryption key — treat them as secrets.
Never pass a magnet to an LLM in a prompt or tool argument.  ·  Store magnets in a secret manager (vault, KMS, env var) — not in conversation history or logs.  ·  LLM frameworks log tool call arguments by default: exclude download endpoints from traces.  ·  For strict isolation, use envelope encryption: the app holds the AES key; the agent receives only an opaque reference ID.

What you can build

[ markdown ]

Decentralized publishing

Write in Markdown. Upload with /put and share the magnet link. Readers open it in the app — no browser, no web server needed. The Reader tab renders Markdown up to 512 KB. Good for articles, docs, or wikis that should outlive any single host.

/read <magnet>
[ \x1f prefix ]

Agent coordination

Chat messages prefixed with \x1f (ASCII Unit Separator) are filtered from the terminal display for human users, but visible to API and WebSocket clients. A straightforward pattern for coordinating bots or LLM agents in a shared room without polluting the human-readable feed.

WS /ws  ·  GET /api/status
[ 10 of 15 ]

Threshold access

Every file splits into 15 fragments. Any 10 reconstruct it. Spread the 15 locations across 15 separate nodes — no single party can reconstruct the file alone. A Shamir-like custody pattern at the storage layer, with no extra cryptography required.

Note: the magnet link holds the AES key — secure it separately.

Download  ·  v0.97.0

shard-cli
Terminal interface. Upload files, download by magnet, render markdown shards inline (/read), join chat rooms, inspect the routing table. Check node status and storage at any time with /status. Daemon mode (--daemon) and passive listen-only mode (--passive) for headless or observer deployments.

Linux x86_64 · static binary
↓ Download shard-cli
shard-gui
Web interface on port 9201. Monochrome browser UI: chat with peer display names and clickable magnet links, Reader tab for inline markdown preview, Files tab for upload/download. Storage quota and retention config visible in Settings. REST API and WebSocket event stream for scripts and agents.

Linux x86_64 · static binary
↓ Download shard-gui
shard · Android
Full node on your phone. Runs as a background service with a CPU WakeLock and QUIC keep-alive so peers stay connected even when the screen is off. Reconnects automatically on WiFi/LTE switch. Orientation changes are handled without restarting the activity. Same web UI at 127.0.0.1:9201 — chat, upload/download, Reader, and an Events log in the Files tab.

Android 8+ · ARM64 / ARMv7 · APK
↓ Download APK

SHA-256 checksums  ·  v0.97.0

shard-cli 9b5aa70f3e51d80e9a8d4314705093406d2fff0363b893da3bf50a66f3f7999d
shard-gui 3c5d9187b73e0cfdbdbf3a17b8d03973c29ad57834e0a7b49cad3d5f0b5a80e7
shard_0.97.0.apk 76ed98905a49d2ea396c363aa38d50682530ca3269b4ba006c19378ef854a357

FAQ

How do I send and receive messages?

Open the Home tab and type a room name in the chat bar, then click Join. Any node that joins the same room name can exchange messages in real time. Messages are signed with your Ed25519 node identity and relayed over encrypted QUIC connections — no server, no account required. On the terminal CLI: /join general then type your message and press Enter.

How do I upload and download a file?

Open the Files tab. To upload, choose a file and click Upload — Shardnet encrypts it with AES-256-GCM, splits it into 15 Reed-Solomon shards (10 data + 5 parity), and distributes them across the swarm. You receive a magnet link to share. To download on any node, paste the magnet link and click Get — the file is reassembled from any 10 of the 15 shards found in the swarm, even if 5 peers are offline. CLI: shard-cli upload <file> and shard-cli download <magnet>.

How do I read a markdown file stored on Shardnet?

Open the Reader tab, paste the magnet link of a .md or .markdown file, and click Go. The file is fetched from the swarm, reassembled, and rendered inline with full markdown formatting — headings, code blocks, lists, and links. Maximum size for inline preview is 512 KB. In the terminal CLI, use /read <magnet> for an inline rendered view (/browse is kept as an alias for backwards compatibility).

Who are the people named in the chat?

Each node is assigned a short display name — a deterministic first name derived from its Ed25519 node ID. The same node always gets the same name on every peer, so you can recognise participants across sessions without exposing raw key material. To set a custom name for yourself, type /name Alice in the chat input — it is broadcast to the room so all other nodes immediately see your chosen name. Your preference is saved locally and re-announced each time you join a room. Magnet links shared in chat are highlighted in amber and clickable: clicking one opens the Reader tab with the link pre-filled.

Running a node allocates local storage for the network. In return, your node is part of the swarm — available whenever you need it. No tokens. No incentives. Nodes that use the protocol provide it.  ·  Protocol specification ↗  ·  Source ↗

No IP logging. No central directory. No metadata stored outside the encrypted shard. Node identity is a local Ed25519 keypair generated on first run — never transmitted to a server.