Sizing
- ~520 MB RAM idle, flat across core counts
- 1.1–2.15 TB monthly egress for 10 people
- 15 people in the always-on room by default
- ~0.4% of a core for the metrics collector
The short answer
Section titled “The short answer”| Team | Box | RAM used | Monthly egress |
|---|---|---|---|
| up to 10 people | 1 vCPU, 2 GB RAM, 50 GB disk | ~520 MB idle, ~700 MB in a full call | 1.1–2.15 TB |
| 2–3 teams of 10 | 2 vCPU, 4 GB RAM | ~1 GB | 2.2–7.5 TB |
On a typical VPS, the transfer allowance runs out before the CPU does. Check the allowance, not just the core count, when you pick a plan.
Memory is flat
Section titled “Memory is flat”The stack uses about 520 MB at idle, and that figure does not grow with the host’s core count: the same on a laptop as on a 64-core server. A 10-person call adds roughly 100 MB to the media server. 2 GB is comfortable.
Add 2 GB of swap as a safety net (vm.swappiness=10), but do not size around it. A media
server that is swapping during a call is already failing.
Bandwidth is the bill
Section titled “Bandwidth is the bill”Calls go through your server (an SFU): everyone sends one stream up and receives everyone else’s streams down. So what your server sends grows with the square of the room size:
streams sent = N × (N − 1) 10 people → 90 streams, not 10TeamHUD keeps camera and screen thumbnails live all day. That ambient presence is the point of the product, and at 10 hours a day it is most of the traffic. A modelled 10-person team (a few people talking at a time, thumbnails all day, two hours of full-screen sharing) sends:
| Component | Share of egress |
|---|---|
| Camera + screen thumbnails | ~85% |
| Full-screen sharing | ~10% |
| Voice | ~5% |
That comes to ~1.1 TB/month with video framerates tuned, up to ~2.15 TB on defaults. Muted users cost almost nothing: silence is sent at about 1 kbps.
Scaling by room size, from that 10-person model:
| People in one room | Streams | Estimated egress / month |
|---|---|---|
| 5 | 20 | 0.24–0.48 TB |
| 10 | 90 | 1.1–2.15 TB |
| 15 | 210 | 2.6–5.0 TB |
| 20 | 380 | 4.6–9.1 TB |
Two teams of 10 cost about half of one room of 20. That is why the always-on team room is
capped at 15 people by default. On your hardware the cap is yours to change
(TEAMHUD_AMBIENT_ROOM_CAP), but past that size a scheduled meeting is the right shape,
not a bigger ambient room.
Only outbound traffic counts against most providers’ allowances. Inbound is free, and on providers that pool allowances across machines (DigitalOcean does), two small boxes often beat one large one.
The database stays small. Uploaded files (chat attachments, avatars) are what grows, and
they live on the storage-data volume unless you move them to S3-compatible
storage. 50 GB is a comfortable start.
Measure, don’t guess
Section titled “Measure, don’t guess”The bundle ships a tiny collector (about 0.4% of a core) that samples the running stack every 10 seconds. Install it once:
bash metrics/install.shThen read it back over SSH:
ssh root@your-server thstat summary --since 2h # CPU, memory, observed egress, GB/month projectionssh root@your-server thstat density --since 1h # per-participant memory, CPU and egressssh root@your-server thstat now # live: containers, rooms, participantsAfter a week of real use, thstat summary’s monthly projection is a better answer than
anything on this page.