macrostack

Layer 5 · self-hosting reality check

What it actually takes to self-host Element Call

The docs say Not stated by the vendor. Element Call itself is a set of static files; Synapse, the homeserver it depends on, asks for at least 1 GB of free RAM if you join large public rooms, and LiveKit publishes no RAM figure. In practice you want 2–4 GB for Synapse, PostgreSQL, the LiveKit SFU and the MatrixRTC authorization service on one small box. Here is the honest version — real requirements, real monthly cost, what you will be maintaining, and the one thing that catches people out.

Usually reached from Zoom alternatives, where Element Call is one of the picks.

Wondering whether you need to at all? Is Zoom free? — what the free tier actually allows, and where the wall is.

RAM — documented minimumNot stated by the vendor. Element Call itself is a set of static files; Synapse, the homeserver it depends on, asks for at least 1 GB of free RAM if you join large public rooms, and LiveKit publishes no RAM figure
RAM — what it really needs2–4 GB for Synapse, PostgreSQL, the LiveKit SFU and the MatrixRTC authorization service on one small box
CPU2 vCPU to start. LiveKit says its scalability is bound by CPU and bandwidth and recommends compute-optimized instances
DiskSmall for the calling part: the web app is static files and call media isn't stored. The Synapse database is what grows, with every room and message your server takes part in.
Monthly cost$12–24/mo on a 4 GB VPS for Synapse plus LiveKit, but bandwidth is the real bill: the SFU sends each participant a copy of everyone else's video, so outbound traffic climbs with every person who joins
Setup timeA weekend if you already run Synapse; longer if this is your first Matrix homeserver
How you install itA Matrix homeserver with the MSC3266, MSC4140 (delayed events), MSC4143 and MSC4222 settings switched on, plus a LiveKit SFU and element-hq's lk-jwt-service behind one reverse-proxy hostname. Build Element Call from source only if you want the standalone web app
Ongoing maintenanceThe homeserver flags Element Call needs are still marked experimental, so re-check them against the self-hosting doc on every Synapse and Element Call release. LiveKit and the auth service are separate things to patch, and LiveKit's UDP media ports (50000–60000) must survive every firewall change.
Where it stops scalingA small team fits on one box. LiveKit's own benchmark ran 150 video publishers and 150 subscribers on a 16-core compute-optimized Google Cloud machine at 85% CPU. Size the SFU for your biggest call, not your user count.

The thing that catches people out

If you skip the delayed-events setting (MSC4140) in Synapse, calls get stuck. When someone's browser crashes or their connection drops, their 'in the call' state never gets cleared, and the room shows an ongoing call that nobody can end. Element's self-hosting guide warns about this directly, and the fix it links to means editing room state by hand in devtools. Set max_event_delay_duration and the other listed flags before the first call, not after users start reporting ghost calls.

When not to self-host Element Call

You just want video meetings. Element Call only makes sense if you already run, or want, a Matrix homeserver; for standalone meetings Jitsi Meet is one install instead of four services. Also skip it if you can't open a UDP port range on the host.

Every guide here carries this section. A site that only ever tells you to self-host is selling something — the useful answer is sometimes no.

Other Layer 5 self-hosting guides

Common questions

How much RAM does Element Call actually need?
2–4 GB for Synapse, PostgreSQL, the LiveKit SFU and the MatrixRTC authorization service on one small box in practice. The documented minimum is Not stated by the vendor. Element Call itself is a set of static files; Synapse, the homeserver it depends on, asks for at least 1 GB of free RAM if you join large public rooms, and LiveKit publishes no RAM figure, which is the figure at which the process starts rather than the figure at which it works under real use. 2 vCPU to start. LiveKit says its scalability is bound by CPU and bandwidth and recommends compute-optimized instances alongside it.
What does self-hosting Element Call cost per month?
$12–24/mo on a 4 GB VPS for Synapse plus LiveKit, but bandwidth is the real bill: the SFU sends each participant a copy of everyone else's video, so outbound traffic climbs with every person who joins This is commodity VPS pricing and excludes your time, which is the larger cost for most people — budget for the homeserver flags Element Call needs are still marked experimental, so re-check them against the self-hosting doc on every Synapse and Element Call release. LiveKit and the auth service are separate things to patch, and LiveKit's UDP media ports (50000–60000) must survive every firewall change.
How long does it take to set up Element Call?
A weekend if you already run Synapse; longer if this is your first Matrix homeserver, via A Matrix homeserver with the MSC3266, MSC4140 (delayed events), MSC4143 and MSC4222 settings switched on, plus a LiveKit SFU and element-hq's lk-jwt-service behind one reverse-proxy hostname. Build Element Call from source only if you want the standalone web app.
When should I NOT self-host Element Call?
You just want video meetings. Element Call only makes sense if you already run, or want, a Matrix homeserver; for standalone meetings Jitsi Meet is one install instead of four services. Also skip it if you can't open a UDP port range on the host.
What is the most common mistake when self-hosting Element Call?
If you skip the delayed-events setting (MSC4140) in Synapse, calls get stuck. When someone's browser crashes or their connection drops, their 'in the call' state never gets cleared, and the room shows an ongoing call that nobody can end. Element's self-hosting guide warns about this directly, and the fix it links to means editing room state by hand in devtools. Set max_event_delay_duration and the other listed flags before the first call, not after users start reporting ghost calls.
The Macrostack brief

New swaps, worth your inbox.

A short, occasional email when we add a high-intent alternative or ship a new head-to-head. No spam, no selling your address — unsubscribe in one click.