Evolu Relay

Evolu Relay provides sync and backup for Evolu apps. Evolu apps can use multiple relays simultaneously. For resilience, it's recommended to use two relays: a fast primary "home/company" relay (on‑prem or close to users) and a geographically distant secondary relay if the primary relay fails (hardware failure, network issues, etc.).

Evolu apps can combine self‑hosted relays with cloud relays. The relay's logic is platform-independent and needs only SQLite and WebSockets. The reference relay runs on Node.js, but an adapter could run it on platforms such as Cloudflare Durable Objects. Relays on different providers keep Evolu apps syncing even when a major cloud provider goes down.

Direct peer‑to‑peer (P2P) sync between clients is technically possible and on our roadmap; implementation awaits additional local transports like Bluetooth, Wi‑Fi, LAN, etc.

For details on privacy, check the privacy docs.

Hosting Evolu Relay

The reference relay is published as the @evolu/relay npm package and the evoluhq/relay Docker image. Its source code can be found at github.com/evoluhq/evolu/tree/main/apps/relay. Supply chain shows how to verify both.

We provide a free free.evoluhq.com relay for testing, but no hosting because it's not Evolu's mission to compete with established clouds (yet). Our plan for Evolu is different: We will sell Evolu apps, Evolu HW devices, and provide paid support. Testing relay data may be deleted; do not rely on it as your only backup.

Configuring Evolu Relay

The relay reads its listening port from PORT, defaulting to 4000, and its optional per-owner storage quota from EVOLU_RELAY_MAX_OWNER_BYTES. No per-owner storage limit is imposed when this variable is unset. Set a quota appropriate for your deployment; it does not limit total disk usage. Quota values must be size literals such as 512KiB or 10MiB, rather than bare byte counts such as 1048576. PORT also supports hosting platforms that supply the listening port; EVOLU_RELAY_PORT is not supported. Invalid supplied values and unknown EVOLU_RELAY_* variables stop the relay with a validation message. See the package README for the full list.

PORT=4001 EVOLU_RELAY_MAX_OWNER_BYTES=10MiB npx @evolu/relay

The relay serves each connection's requests one at a time and serves other connections between them, and one request holds it only briefly, but many connections can still load it. Run it behind a reverse proxy that serves TLS, and limit connections per IP address there.