The wire, version 1↑ Why · Alex reaches the laptop at home from a café The relay is the one way through that every network allows.
The contract between every node and every relay, ours included, written down and frozen.
A key attaches only by signing this connection's challenge for this account
Naming a key without its signature would take someone else's frames.
Shown when an unsigned hello, one signed for another challenge, and a frame before the hello each close 4001.
How The wire
0 of 1 test passed · 0 places in the code
- not run a test
e2e/relay/client/src/main.rs:10
A frame reaches the key in its first 32 bytes, unchanged
The session above numbers and seals every message; the relay's only job is the address.
Shown when the core's handshake and 50 lines each way pass through, in order, once.
How The wire
0 of 1 test passed · 0 places in the code
- not run a test
e2e/relay/client/src/main.rs:10
An unknown to is dropped and the socket carries on
A peer that has just left is not worth a reconnect.
Shown when a frame to nobody, then one to a peer; the second arrives.
How The wire
0 of 1 test passed · 0 places in the code
- not run a test
e2e/relay/client/src/main.rs:10
Keys attach per account
One account's sockets must never be a way into another's.
Shown when a key attached on another account sends to this one's key, and nothing arrives.
How The wire
0 of 1 test passed · 0 places in the code
- not run a test
e2e/relay/client/src/main.rs:10
The same key attached again replaces the older socket
A node that reconnects after a flap must not wait for its dead socket to time out.
Shown when the older socket closes 4000, and frames reach the new one.
How The wire
0 of 1 test passed · 0 places in the code
- not run a test
e2e/relay/client/src/main.rs:11
A frame over 64 KiB closes the socket
A bound in the wire tells a sender what every relay takes.
Shown when a frame of 64 KiB + 1 closes 1009 and is not forwarded.
How The wire
0 of 1 test passed · 0 places in the code
- not run a test
e2e/relay/client/src/main.rs:11
Over its limits a relay closes the socket, never drops in silence
A silent drop would stall a session; a close makes it resend.
Shown when past the reference relay's byte burst the socket closes 4029.
How The wire
0 of 1 test passed · 0 places in the code
- not run a test
e2e/relay/client/src/main.rs:11
Two sockets that meet at one mailbox learn each other's keys, while both are online
A new device pairing has to find the one that made its code, and neither knows the other's key yet. Only waiting sockets hold a meet, so the relay stores nothing, and a pairing needs both devices online. Added to version 1 as 1.1: nothing else changes, and a client that never meets sees nothing new.
Shown when two sockets meeting one mailbox each get met with the other's
key; a third meeting it afterwards waits alone; a meet on another mailbox
or another account meets no one.
How Meeting
0 of 1 test passed · 1 place in the code
- not run a test
e2e/relay/client/src/main.rs:11 - code
relay/src/lib.rs:221
A ping is answered pong, without waking the relay
A socket whose network went quietly looks open for minutes; the only way to know is to ask. Added as 1.2, like meeting.
Shown when ping before and after the hello is answered pong, and the
socket carries frames as before.
How Ping
0 of 1 test passed · 1 place in the code
- not run a test
e2e/relay/client/src/main.rs:11 - code
relay/src/lib.rs:97
A relay may say which release is out, as a hint and nothing more
Every node already holds a socket to its relay, so that is where news of a release travels, instead of each node asking every few hours. The hint is only a number: a node still fetches the manifest and checks its signature, and a page still loads only what its origin serves. Added as 1.3.
Shown when after the hello a relay with releases sends release <node> <page>;
a node told a newer number has the build checked and on disk within
seconds, with its own polling far off; a page told a newer page build says
so quietly.
How Release hints
0 of 2 tests passed · 5 places in the code
- not run a test
e2e/relay/client/src/main.rs:11 - not run a published release reaches a machine at once through the relay's hint, and the page offers a reload
e2e/update/update.spec.mjs:38 - code
node/src/update.rs:213 - code
relay/src/lib.rs:242 - code
relay/src/release.rs:37 - code
relay/src/wire.rs:60 - code
web/app/app.tsx:546
Version 2↑ Why · Alex loses a phone, and it opens nothing The revocation waits at the relay for the machine that was away.↑ Why · Someone checks every claim before trusting it A relay proves who it is by the account's own log, not by a certificate authority.
Planned: mailboxes for devices that are away, and a relay that proves who it is.
The relay signs its challenge with a key the account's log records
A certificate says who a CA vouched for; the log says who the account chose, and it works the same for ours and yours.
Shown when a challenge signed by another key, or unsigned, is refused by the node.
How Version 2
Not built: nothing in the code or tests names this yet.
A frame for a key that isn't attached waits in its mailbox, bounded and expiring
Shown when a frame sent while its key is away arrives first after it attaches; past the bound or the expiry it is dropped, and the sender's session resends when it next sees the key.
How Version 2
Not built: nothing in the code or tests names this yet.
A pairing mailbox routes without a key, for one join and its reply
Shown when a join and its reply cross through the mailbox the code names; the mailbox takes nothing after the reply or its expiry.
How Version 2
Not built: nothing in the code or tests names this yet.
A frame for a device that left a push endpoint wakes it, sealed
Shown when a closed browser is woken; the push service's copy is ciphertext.
How Version 2
Not built: nothing in the code or tests names this yet.
Who runs the relay↑ Why · Someone checks every claim before trusting it Anyone can run the relay and check it against the same suite as ours.
Everything is sealed end to end, so trusting a relay with content is not the question; availability and metadata are.
Any relay that passes the suite works
A node must not need to know whose relay it is talking to.
Shown when the suite passes against the reference relay and against ours, on every release of either.
How Who runs it
Not built: nothing in the code or tests names this yet.
The relay you can run does everything ours does for one account
Can I leave? needs a yes that works today, not a promise to publish later.
Shown when the first minute end to end with only the reference relay reachable.
How Who runs it
Not built: nothing in the code or tests names this yet.
Moving to another relay keeps your account, devices and files
The account is its log, and the log takes no relay's word.
Shown when point the account at another relay; every node reattaches there and none pairs again.
How Who runs it
Not built: nothing in the code or tests names this yet.
What our relay sees is listed, and nothing else reaches it
A service you can't read is believable only where what it can see is stated and checked.
Shown when ours run under workerd with a capture bound holds nothing past the list and the session's ciphertext; its logs and meters have no field for frame bytes.
How Who runs it
Not built: nothing in the code or tests names this yet.
Hole-punching runs in the open client
Nothing that makes a direct pipe work is ours alone.
Shown when two nodes open a direct pipe with only the reference relay and a public STUN server.
How Who runs it
Not built: nothing in the code or tests names this yet.
A relay you run works on your own domain
Shown when end to end with the browser node and the relay served from an origin that isn't ours.
How Who runs it
Not built: nothing in the code or tests names this yet.
Restarting the relay costs a redial, not a session
Changing a Durable Object's code restarts it and closes its sockets, so a relay release can't be made invisible; it can be made harmless, and rare. Publishing a node release or a change to the page never touches it.
Shown when the relay restarted under open sessions: a call in flight over the relay finishes once the client has redialled, a direct pipe carries calls all the while, and an open file's room keeps converging; publishing the page and a release deploys a Worker that isn't the relay's.
0 of 2 tests passed · 2 places in the code
- not run a test
e2e/node/pair.spec.mjs:314 - not run a test
e2e/node/pair.spec.mjs:525 - code
node/src/node.rs:374 - code
web/app/relay.js:23