Epeaky

Epeaky benchmarks: one encrypted room of 200 and 440 devices

By the Zyn team, who make Epeaky. Measured 13 October 2026, published 15 October 2026.

On Hetzner's smallest arm server (CAX11: 2 cores, 4 GB), one Epeaky room of 200 devices took 20 messages a second with every message reaching every device, p95 49 ms from send to arrival, at a peak of about 1.2 of the 2 cores and 190 MB of memory. On 2 shared x86 vCPUs with 4 GB (Hetzner CPX22), a room of 440 devices took 50 messages a second, all 397,600 deliveries, p95 50 ms. That server tops out near 32,000 deliveries a second.

200 devices, 2 arm cores

20 devices wrote and 180 only listened, all in one room. Each rate was held for 20 seconds.

Messages a secondSentDelivered to listenersDeliveries a secondp50p95p99
510018,000 of 18,00090039 ms50 ms99 ms
1020036,000 of 36,0001,80039 ms47 ms66 ms
2039370,740 of 70,7403,53739 ms49 ms78 ms
50908 (81 refused)178,0208,90140 ms50 ms73 ms
1001,027 (917 refused)350,46017,523134 ms343 ms641 ms
Refused: the den's per-device rate limit turned the sends away; at 50 a second each of the 20 test writers sent 2.5 messages a second, far more than a person types. From 50 a second, deliveries run over from one 20-second window into the next, so those rows count deliveries rather than check them against sends.

Joining took 10.9 seconds for the 20 writing devices (each a full member with its own MLS state) and 22.7 seconds for the 180 listeners.

440 devices, 2 shared x86 vCPUs

40 devices wrote and 400 listened, in one room.

Messages a secondSentDelivered to listenersDeliveries a secondp50p95p99
25477190,800 of 190,8009,54045 ms53 ms89 ms
50994397,600 of 397,60019,88043 ms50 ms65 ms
1001,522616,40030,820385 ms638 ms949 ms
1501,184641,18232,059373 ms590 ms1,046 ms
From 100 a second the server is at its ceiling: deliveries stay near 32,000 a second, the rest wait in line and run over into the next window. Memory stayed near 500 MB.

The cost of encryption in big rooms

Every membership change in an MLS room is a commit that each device applies and the den checks. In a room of 1,000 members, a device applied one in 18 ms and the den checked one in 20 ms. A room's GroupInfo is about 190 KB at that size.

How it was measured

What this does not measure

Repeat it

On the server, make one invite per test device and keep their codes, one a line (epeaky invite 200 1 | grep -o '[0-9a-f]\{64\}' > invites.txt), and allow that many door requests from one address with DEN_DOOR_PER_MINUTE. Then, from a checkout:

cd web && ./build.sh dist && node tests/load.mjs https://den.example.org invites.txt 20 180 5 10 20 50 100

The arguments are writers, listeners and the rates to try. tests/bench.mjs measures the MLS costs by room size. Both are in web/tests. If your numbers differ, tell us.