On-prem team meetings inside your perimeter.
Run camera-on team meetings on your own servers — same SDK, same Studio admin panel, no media leaving your network. Helm chart on k8s or docker compose on a small Hetzner footprint.
The problem
Regulated organisations cannot send media outside their own perimeter — but their teams still need camera-on meetings with a real recording archive. SaaS video tools refuse, and "video as a feature" buy-vs-build comes down to "we need it inside our perimeter, end of story".
How LevelChat fits
Run the LevelChat stack on your own Kubernetes cluster (Helm chart) or with docker compose on a small Hetzner / AWS / on-prem footprint. The same Studio admin panel ships at app.<your-domain>/console. Per-server Ed25519 license — no third-party telemetry path, no phone-home for the media itself.
Reference architecture
Your VPC / on-prem datacentre
│
├── leader node ──── full stack (gateway, signaling, SFU, recording, …)
│ │
│ ▼
│ Postgres + NATS + MinIO
│
├── worker node ──── media-sfu + recording (cascade)
└── worker node ──── media-sfu + recording (cascade)
Cluster join token mints fingerprint-bound Ed25519 license per node.Integration snippet
Real code against published packages — no phantom imports.
# One-line install on a fresh Linux box:
curl -fsSL https://get.levelchat.io/install.sh | sudo bash
# Add a worker to the cluster:
curl -fsSL https://get.levelchat.io/install.sh | \
sudo LC_JOIN_LEADER=https://meet.acme.internal \
LC_JOIN_TOKEN=jt_your_24h_join_token \
bash
# Embed @levelchat/web in your intranet portal — same surface as cloud.
npm i @levelchat/web @levelchat/web-reactCommon questions for this vertical
Does self-host need internet at all?
Air-gapped install is supported on Community + Pro. The license verification runs locally (Ed25519 public key embedded in the binary), so the only outbound need is the optional license heartbeat (every 24h) to mark active node counts in your subscription dashboard. The heartbeat is disabled in air-gapped mode.
How do upgrades work?
Each release ships a new docker image tag. The supported upgrade is: pull the new tag, `docker compose up -d`. Database migrations run on boot; downgrade is one-tag-back via the same flow. Atomic blue/green is on the roadmap (Preview) for the Helm chart.
What about a 3-host HA topology?
The HA compose file (docker-compose.self-host-ha.yml) ships 3-host Postgres (Patroni) + Redis Sentinel + NATS cluster + MinIO distributed. External L4 load-balancer or keepalived terminates :443 to any swarm node. See /self-host for the deployment instructions.