Resource Planner

Enter expected load — get back hardware sizing, scaling triggers, and a cost-of-growth estimate.

Quick tiers

Expected load

Adjust any input — results update instantly

10,000
500
100,000
100 GB
2

Platform profile

10,000 users · 500 peak concurrent · 100K msg/day · 365d retention

Well provisioned

RAM per replica

MIN545.4 MB

REC872.7 MB

Base overhead + WebSocket sessions + PG pool

CPU per replica

MIN1.3 cores

REC1.9 cores

Async I/O + E2EE signing/verification overhead

Backend replicas

MIN1 pod

REC2 pods (HA)

1 replica handles ~1,500 concurrent connections

Postgres storage

MIN87.7 GB (now)

REC87.7 GB (1 yr)

User data + messages + signal keys + 40% index overhead

MinIO / object storage

MIN750.0 GB (6 mo)

REC1.46 TB (1 yr)

Media files + 25% for thumbnails/variants

Redis memory

MIN67.9 MB

REC101.9 MB

64 MB base + 8 KB per peak concurrent user + pub/sub buffers

Total platform RAM

MIN1.07 GB

REC1.70 GB

2 replicas × per-replica RAM

Est. peak bandwidth

MIN0.4 Mbps

REC0.9 Mbps (with headroom)

8× average — morning spike factor. Actual varies by media ratio.

When to scale up

Watch these signals for the inputs above — provision before users notice

Memory pressure (per replica)

warning

Trigger: RSS > 654.5 MB (75% of 872.7 MB recommended)

↳ Increase container memory limit or add a replica

Concurrent WebSocket connections

warning

Trigger: > 2,400 total (80% of 3,000 capacity)

↳ Scale out — add 1–2 replicas

Concurrent connections (hard limit)

critical

Trigger: > 3,000 total — connection refusals likely

↳ URGENT: add replicas immediately

CPU saturation

warning

Trigger: > 80% sustained across all cores for 5+ min

↳ Increase CPU limit or add a replica

Postgres disk

warning

Trigger: > 70% of provisioned volume (61.4 GB of 87.7 GB)

↳ Expand volume, archive old messages, or shorten retention

Postgres disk (critical)

critical

Trigger: > 90% of provisioned volume

↳ URGENT: expand volume immediately — DB writes will fail at 100%

MinIO / object storage

warning

Trigger: > 80% of quota

↳ Increase quota or enable lifecycle expiry policies for old media

Redis memory pressure

warning

Trigger: > 70% of configured max (set on the Memory page)

↳ Increase Redis max-memory on the Memory page, or reduce retention

PG connection pool exhaustion

info

Trigger: > 18 of 20 active connections per replica

↳ Add a replica to distribute connections or tune pool size

How the numbers are calculated

Assumptions and formulas used for each resource

RAM per replica

300 MB base (FastAPI + PG pool)

+ 350 KB × concurrent / replicas

× 1.6 headroom factor

CPU per replica

0.5 base cores

+ 0.3 cores per 100 concurrent

× 1.5 headroom (E2EE crypto heavy)

Postgres storage

3 KB × total users

+ 1.8 KB × msgs/day × retention_days

× 1.4 index overhead

Redis memory

64 MB base

+ 8 KB × peak concurrent users

× 1.5 headroom for burst queues

MinIO / object storage

media_gb_month × 12 months

× 1.25 (thumbnails + variants)

Peak bandwidth

msgs/day × 3 KB × 2 (send+recv)

÷ 86400 × 8 peak factor (morning spike)

Results in average Mbps — provision 2×

All values are estimates. Real usage depends on message size distribution, media types, encryption overhead, and caching efficiency. Add at least 20–30% headroom beyond the "REC" values before hitting capacity limits.