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
Platform profile
10,000 users · 500 peak concurrent · 100K msg/day · 365d retention
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)
warningTrigger: RSS > 654.5 MB (75% of 872.7 MB recommended)
↳ Increase container memory limit or add a replica
Concurrent WebSocket connections
warningTrigger: > 2,400 total (80% of 3,000 capacity)
↳ Scale out — add 1–2 replicas
Concurrent connections (hard limit)
criticalTrigger: > 3,000 total — connection refusals likely
↳ URGENT: add replicas immediately
CPU saturation
warningTrigger: > 80% sustained across all cores for 5+ min
↳ Increase CPU limit or add a replica
Postgres disk
warningTrigger: > 70% of provisioned volume (61.4 GB of 87.7 GB)
↳ Expand volume, archive old messages, or shorten retention
Postgres disk (critical)
criticalTrigger: > 90% of provisioned volume
↳ URGENT: expand volume immediately — DB writes will fail at 100%
MinIO / object storage
warningTrigger: > 80% of quota
↳ Increase quota or enable lifecycle expiry policies for old media
Redis memory pressure
warningTrigger: > 70% of configured max (set on the Memory page)
↳ Increase Redis max-memory on the Memory page, or reduce retention
PG connection pool exhaustion
infoTrigger: > 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
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.