Communication
How peers find each other and move data. Tally prefers a direct encrypted peer-to-peer channel and falls back to its own relay when that can't form — but it never trusts the transport for authenticity; that's Security's job.
The connection path
- Direct (WebRTC). Peers form a mesh of WebRTC data channels — a friend mesh (per friend device) and a self-mesh (your own devices). STUN helps them find a route across networks; there is no TURN server.
- Relay fallback. The relay server does WebRTC signaling and, when a direct channel can't form or a peer is offline, store-and-forwards the encrypted envelopes (waking the recipient with a Web Push hint).
What flows
Outbound messages queue in the outbox and travel as encrypted envelopes. When two peers connect they sync — reconciling their ledgers so a reconnecting or recovering device catches up. Transport-only messages (ping, sync, receipts) are distinct from durable records and carry no authorship.
The server's two jobs
One Node process does both serving the app bundle and being a relay, but they are deliberately different roles, and a deployment may one day split them. That separation is also what makes secondary relays possible: a relay you add in settings serves no app, and the relay that served your app is just the one you get for free. Neither role stores user data — the relay holds only presence and a short queue of undelivered envelopes it cannot read.
Go deeper
Peer communication protocol —
the message-by-message specification. Code lives in
app/js/peer/, app/js/signaling/, and
server/; how it is built and shipped is
Build & runtime.