Version 1.3 · MPL-2.0 · Unaudited

You pay for the connection. Everything past it should belong to everyone.

A free, decentralised network where anyone can launch their own domain, share files with no account and no identity attached, and stay reachable when the Internet is not. If you already pay to be online, what is inside it should not be for sale.

CipherAES-256-GCM
NamesEd25519, self-certifying
RoutingSphinx + Loopix
CostNothing, ever
★ Star on GitHub
01: What it is

A network for sharing things, with nobody in the middle

Send someone a file. Put a website online. Both work without an account, without paying anyone, and without asking permission, and they keep working when the Internet does not.

Send a file You get a link. Whoever you give it to can open it. The server holding the file cannot: it only ever sees scrambled bytes, and the part of the link that unscrambles them never reaches it.
Publish a site You get an address ending in .capsule. Nobody sold it to you, nobody renews it, and nobody can hand it to someone else: the address is your key.
No Internet? Still works Two laptops on the same wifi find each other with no DNS and no uplink. With no network at all, a capsule becomes one file you carry on a memory stick.
Blocked? Still works A bridge is a server the network does not list. To anyone scanning for it, it answers like an ordinary empty website.
Nothing to sign up for No account, no email, no phone number, no identifier of any kind. There is nothing to log in to and nothing to delete afterwards.

Underneath, one idea does the work: a server should be able to hold your data without being able to read it, and the thing that unlocks it should never travel the same road. Files are encrypted in your browser; the key rides in the part of a link that browsers never send to a server.

01Encrypt before uploadAES-256-GCM
02Key in the link fragmentnever sent
03Relays anyone can runone command
04Split k-of-n across relaysReed–Solomon
05Pad to a size classsize hidden
06Strip file metadataEXIF, XMP, ZIP
07Route through a mix--mix
08Publish a .capsule sitesite publish
09Reach a blocked network--bridge
10Work with no internetoffline pack
02: Why

Encryption stopped being the hard part

Every mainstream file service encrypts in transit and at rest. What none of them do is give up the ability to read the file, and that ability is what gets subpoenaed, breached, scanned and monetised. The interesting question is not "is it encrypted" but who holds the key.

The same is true of publishing. A domain is rented, a certificate is issued, and a host serves the bytes: three parties, each of whom can be leaned on to make a page disappear or say something else. A .capsule name has none of them, because the name and the signing key are the same object.

A relay that could read your file eventually will be asked to.
the design constraint
03: Capsules

The key goes around the relay

A capsule is a file split into chunks, each encrypted with AES-256-GCM under a key generated in the browser. The nonce is a random prefix plus the chunk index, and the associated data binds every chunk to the protocol version, so a downgrade fails to authenticate rather than silently succeeding.

How a capsule travels A file is encrypted in the sender's browser. The ciphertext goes to a relay and on to the receiver. The key travels separately, inside the fragment of the share link, which browsers never send to a server. The relay therefore stores bytes it cannot read. CAPSULE The key goes around the relay, not through it ciphertextciphertextkeykeySENDERYour fileIN YOUR BROWSEREncryptedAES-256-GCMRELAYStores bytescannot readIN THEIR BROWSERDecryptedRECEIVERThe fileTHE LINK YOU SEND#fragmentnever sent to a server Solid, ciphertext, over the networkBlack, the key, out of bandThe relay never holds both
The relay sees ciphertext and a size class. It never sees the key.
04: Sites

A name nobody issues, a page nobody can rewrite

capsule site publish ./www packs a folder into one capsule, stores it on relays, and signs a short record saying which capsule is the current version of your name. Relays hand that record out and gossip it to each other. They cannot forge one, they have no key, and they cannot quietly serve an old one, because every record carries a sequence number the browser remembers.

How a .capsule site is published and read Publishing packs a folder into one encrypted capsule, stores it on relays, and signs a record saying which capsule is the current version of the name. The name itself is the public key, so the signature can be checked without trusting anyone. A visitor asks several relays, keeps the newest record that verifies, refuses an older one, and renders the page in a sandbox with no network access at all. SITES A name nobody issues, a page nobody can rewrite packencryptsignrelays hand it outverifydecryptPUBLISHERA folder of filesindex.html and friendsBUNDLEOne capsulepadded to a size classRELAYSCiphertext onlymirrored, or shardedTHE NAME IS THE KEYSigned record<key>.capsuleVISITOR ASKSSeveral relaysnewest signed winsIN THE BROWSERChecked, then readno rollback acceptedWHAT YOU SEESandboxed pagecannot reach the web Top, publishing, once per updateBottom, visiting, every timeBlack, the only thing that has to be trusted: the key
Publishing happens once per update. Verifying happens on every visit.

The extension does something ordinary browsers do not: it rebuilds every page before showing it. Stylesheets, images and fonts from the bundle become data: URLs; anything pointing at the open web is removed; a link that leaves CAPSULE becomes a click you have to confirm. The result lands in a sandboxed frame with connect-src 'none' and no scripts.

A .capsule site cannot make a single network request. Not a font, not a pixel, not a beacon. That is a property of the format, not a setting you can forget to turn on.

A .capsule site open in Chrome through the CAPSULE extension. A bar above the page reads VERIFIED, version one, SCRIPTS OFF and RELAYS. The page headline says: Nobody sold you this address.
A site under its own name. The bar belongs to the extension, not to the page: VERIFIED means the signature checked out against the key inside the name, and SCRIPTS OFF is the default the site has no say in.
The CAPSULE extension settings panel, listing two relay addresses with remove buttons, a field to add another, and the list of .capsule names this browser has seen with their version numbers.
The whole configuration surface: which relays to ask, and the newest version this browser has accepted for each name. A relay offering an older one is refused.
05: The mix network

Every hop knows one step, and no hop knows two

Encryption hides what you sent. It does not hide that you sent it, to whom, or when. With --mix, a request is wrapped in a Sphinx packet, one layer per hop, every packet exactly 65,920 bytes, and each relay peels one layer, waits a random time, and forwards. The reply comes back along a second path the destination cannot see, into a mailbox you poll.

How a request travels through the mix network A request is wrapped in a layer for each hop. The first hop sees the client's address, the middle hops see only their neighbours, and the storage relay sees a request with no client attached. The reply comes back along a second path the relay cannot see, into a mailbox the client polls. MIX NETWORK Every hop knows one step, and no hop knows two reply, by a path it cannot seeyou collect itYOUYour clientone layer per hopHOP 1Sees your addressand nothing elseHOP 2Sees two hopsneither endHOP 3Sees the relaynot youDESTINATIONStorage relayno client addressMAILBOXHolds the answeryou poll it Black, the two ends, which never meetDashed, the reply, along a path the sender choseEach hop waits a random time before forwarding
Measured: the storage relay receives zero direct requests from the client.

None of that matters if there are four nodes and one operator. So the CLI prints how much protection the live network actually offers before every mixed send, in those words, and the design document leads with the same caveat rather than burying it.

$ capsule send report.pdf --mix --anonymous
Mix network: 4 nodes across 2 operators, 3 hops: small.
This hides you from a curious relay, not from someone watching the network.
Metadata removed: EXIF, XMP. Padded 2.3 MB → 4.0 MB.
06: Compared

Where CAPSULE sits among the alternatives

Two tables. The first is what CAPSULE was built to do differently. The second is every other system on the map, with the limitation it is known for and whether CAPSULE answers it, often only partly.

  CAPSULE Tor IPFS Nostr Matrix Briar
Server cannot read the content ~ , , ~
No account, no identifier , , , ,
Content size hidden from the host , , , , ,
Resists end-to-end timing correlation , , , , ~
Split so no single host has enough , , , , ,
Content can be withdrawn ~ , ~ ~
Self-certifying site names ~ , , ,
Pages cannot phone home ~ , , , ,
Readable in an unmodified browser , ~ ,
Works with no internet at all , , , ,
Censorship-resistant transport ~ ~ ,
General-purpose TCP tunnel WIP , , , ,
Designed for anonymity that grows with users ~ , , , ~

✓ by design and tested  ·  ~ partly  ·  WIP designed, not built  · , not addressed.
This table is about the design. What the network is today is smaller, and therefore weaker, than the design allows: the threat model says exactly where.

Everything else on the map, and what it says it cannot do

Each of these solves a real problem well. The limitation quoted is the one that system is known for; the last column is whether CAPSULE addresses it, and the answer is often "partly" or "no".

System Its stated limitation CAPSULE
Tor Slow, TCP only, vulnerable to correlation by an observer of both ends partly
I2P Installation and technical experience; not oriented to the conventional internet yes
Nym More protection means far more latency; too slow for daily use partly
Lokinet Smaller anonymity set than Tor, and a dependency on a token network partly
Hyphanet (Freenet) Content is hard to withdraw; aged performance and UX yes
GNUnet Research-oriented yes
SimpleX Depends on relays; no true offline physical network yes
Session Persistent identifier, own network and token, complexity yes
Briar Maintenance mode; battery, background execution, UX partly
Bitchat The protocol does not yet achieve unlinkable presence n/a
Nostr Pseudonymous not anonymous; spam; key management; inconsistent deletion yes
Matrix Servers replicate accounts, metadata and history; not anonymous yes
Waku A hard balance between privacy, bandwidth, availability and latency partly
IPFS Not private: PeerIDs, CIDs, providers and queries can be public yes
Hypercore / Pear Peers see IPs; somebody has to stay online yes
Yggdrasil Encryption is not anonymity yes
Reticulum Small ecosystem, complicated onboarding partly
Meshtastic Needs hardware and has little bandwidth partly
Veilid A framework: an application still has to be built yes
Iroh / libp2p Toolkits, not networks with end users yes
Bitcoin / Lightning Traceability and custody complexity n/a
07: Run it

Four commands to join the network

01
InstallNode 22 or newer. git clone, npm install, npm run build. No database, no accounts, no keys to obtain.
02
Send a filecapsule send secret.pdf --anonymous prints a link. The person you give it to needs nothing installed.
03
Run a relayOne process with a public URL. It joins the network by gossip, stores only ciphertext, and keeps no addresses in its logs by default. Until you do, clients reach the network through the genesis relay below.
04
Publish a sitecapsule site key then capsule site publish ./www. Load the extension from apps/extension/dist and open the address it printed.
$ git clone https://github.com/missingus3r/CAPSULE && cd CAPSULE
$ npm install && npm run build
$ npm run dev:relay # a relay on :8787
$ node apps/cli/dist/index.js site key
Name: 6dijvuvwrd5jqp4efjbb4hwcsmtsf6sgi3at4jeto63k7x5fkbwat2yb.capsule
$ node apps/cli/dist/index.js site publish ./www --key site.capsulekey
Published 4 files (1.4 KiB)
Name: http://6dijvuvwrd5jq…kbwat2yb.capsule/
Resolves: 1 relay(s)

To join the public network instead of running alone, point your relay at a peer with CAPSULE_PEERS and set CAPSULE_PUBLIC_URL. Gossip does the rest.

08: For an agent

One line, and something else does the reading

If you use Claude Code, Codex or anything like them, each of these is a single line to paste. The first one is first on purpose: you are about to run code from a stranger on the internet, and an agent is good at telling you what it does before it does it.

Check whether this is safe to run

Audit https://github.com/missingus3r/CAPSULE before I run anything: read the build scripts, the postinstall hooks and the network calls, tell me every host it contacts and every file it writes outside the repo, and say plainly whether you would run it.

Install the client and send a file

Clone https://github.com/missingus3r/CAPSULE, run npm install and npm run build, then send me a test file with the CLI and give me the share link. Do not start a relay: the default one is already configured.

Run a relay and join the network

Clone https://github.com/missingus3r/CAPSULE and run a CAPSULE relay on this machine as a systemd service. Read docs/RUN_A_RELAY.md first, set CAPSULE_PUBLIC_URL to an address others can reach, point CAPSULE_PEERS at the genesis relay, and tell me what the relay can see about the people who use it.

The last clause of each is the point. An agent that reports what a relay observes, or what a build script touches, is more useful than one that just finishes.

09: Stack

Boring choices, on purpose

Nothing here is novel cryptography. Every primitive is one that has been looked at for years by people better at this than we are; the work is in the composition, and the composition is the part that has not been audited.

Content encryptionAES-256-GCM, chunked, AAD-bound
Site namesEd25519 → base32, 56 chars
Erasure codingReed–Solomon over GF(2⁸)
Secret sharingShamir over GF(256)
Passphrase recoveryPBKDF2-SHA-256, 600k
Mix packetsSphinx + LIONESS wide block
Traffic shapingLoopix delays and cover loops
RuntimeTypeScript, Node 22, Fastify 5
ClientsCLI, React 19 web, MV3 extension
The genesis relay

A relay is already running, so a fresh checkout reaches the network without you starting one:

https://68.211.136.69.sslip.io#W0rKZRPcxcCWT4So5LorArlH4O3slgXiUxs4EWx4n2M

The part after # is not decoration. A pinned seed has to sign a challenge the client generated a moment ago, so seizing the name, the certificate or the host is not enough to stand in for it: only the key can answer. The hostname is that address, 68.211.136.69, spelled so a certificate can exist for it.

One relay run by one person is not a network. It sees the address, the timing and the size of everything sent through it, and mix routing across relays a single party operates protects nobody. Running your own is the point, not a formality.