Offline buffer
An envelope for an absent recipient waits on the node and leaves as soon as the device subscribes.
Relays
A relay is an ordinary program on a server run by somebody else. It holds an encrypted envelope until the recipient comes online and helps devices find each other. It never sees the text.
Relays are optional for mesh and direct connections. They are insurance for offline time.
A single process can wait, introduce peers and talk to other nodes.
An envelope for an absent recipient waits on the node and leaves as soon as the device subscribes.
The node answers who is online and hands out addresses. Devices then connect directly, bypassing the relay.
Nodes exchange what they have: a live relay plus anti-entropy. An envelope survives one node going offline.
A node does not decrypt envelopes and does not store keys. All it does is accept, verify the signature, store and forward.
These addresses are already in the build. The Ed25519 key is what separates a real node from a substitute.
The nodes run without an SLA and may be unavailable. The app survives that: messages go over mesh or a direct connection, and the envelope stays with the sender.
A node is added by hand — the application does not swap addresses silently.
In Soty: Settings → Relay hosts → Add relay host.
The node banner prints soty://host?addr=…&pk=… — the app checks the key when it connects.
A ws:// or wss:// address and the Ed25519 key separately. The key is required: without it the node is not trusted.
The list shows Connected. A silent node can be replaced without removing the others.
The node key is its identity. If the database file is lost, the node gets a new key and clients stop trusting it.
One binary, one SQLite file and an open port. The guide with commands and systemd lives in the install section.
Node installation guideFor permanent work there is deploy/deploy-host.sh: systemd-user, systemd-system, supervisor or nohup, plus nginx and key verification.
Hosts do not discover each other automatically: the operator sets the peer list. Inside that list, anti-entropy does the rest.
The topology is up to the operator: a full mesh, a ring or a hub with peripheral nodes.
Every node lists the others with --peer. Without the reverse link a message travels one way only.
--peer can carry an Ed25519 key. If WELCOME returns another identity, the connection is dropped.
After a reconnect nodes exchange WANT → HAVE → GET → ENVELOPES and catch up on what they missed.
Beyond three hops an envelope is not forwarded. In practice keep the path to the recipient at 2–3 nodes.
A relay does not read the text, but it sees that delivery happened. That is not a bug; it is the price of an offline buffer.
The envelope is checked by signature and id, but it is never decrypted.
Sender and recipient are visible as public keys. Names and the address book stay on the device.
Metadata allows activity analysis. For sensitive scenarios use mesh or a direct connection.
The client remembers the node Ed25519 key. A node cannot be swapped on the way without changing the key.
Your own node reduces the number of intermediaries, but it does not make metadata invisible to its operator — when the operator is you.
Run a node on your server or add a public one. The application decides when to use it.