Self-hosted · WebRTC SFU · Multi-tenant

Video calls for your product.
Your server, your data, your rules.

Videyo is a self-hosted video-chat platform: a Rust control plane, a selective-forwarding media server, and a browser SDK you can drop into any web app in an afternoon.

Try the live demo → Read the SDK guide
1 VPS entire stack
30 concurrent rooms
60 HD peer streams
100% your data

Everything a video product needs

Not a toy demo — a control plane, media plane, and billing pipeline that run on a single server.

🏢

Multi-tenant by design

Tenants, scoped API keys, and strict isolation. Every room, token, and invoice belongs to exactly one tenant.

📡

SFU media plane

A webrtc-rs selective forwarding unit with ICE-lite deployment, TURN fallback, and per-room capacity guards.

🧩

Drop-in browser SDK

TypeScript client with connect, join, publish. No framework lock-in, no mandatory UI.

🧾

Metering & invoices

Per-participant usage rollups, pricing tiers, and monthly draft invoices out of the box.

🛡️

Production guardrails

Rate limiting per API key, room-capacity ceilings with clean 503s, and token revocation in seconds.

📈

Observable

Prometheus metrics, a ready-made Grafana dashboard, and structured JSON logs from both services.

Three calls to a live room

Create a room, mint a join token, connect from the browser.

STEP 1

Create a room

One API call with your tenant key. Rooms enforce per-tenant isolation and platform capacity.

STEP 2

Mint join tokens

Short-lived ES256 JWTs per participant. Revocable within seconds, no database lookup on the SFU.

STEP 3

Connect & publish

The SDK handles signaling, renegotiation, and ICE. You get local and remote streams as DOM events.

# 1 · create a room
curl -X POST https://videyo.co.ke/api/v1/rooms \
  -H "Authorization: Bearer $API_KEY" \
  -d '{"name": "standup", "max_participants": 2}'

# 2 · mint a join token
curl -X POST https://videyo.co.ke/api/v1/tokens \
  -H "Authorization: Bearer $API_KEY" \
  -d '{"room_id": "…", "display_name": "Alice"}'

// 3 · in the browser
const client = new VideoChatClient({ wsUrl, token });
await client.connect();
client.join(roomId);
await client.publish(localStream);

Self-hosted means self-owned

Videyo runs entirely on your infrastructure — this very site is served from a single VPS running the same stack you can deploy. No per-minute pricing, no data leaving your network, no vendor roadmap dictating yours.

  • One docker compose up — Postgres, API, SFU, TURN, nginx included
  • Automatic HTTPS via Let's Encrypt
  • Horizontal headroom for 30 concurrent 1-on-1 rooms per node
  • Nightly pg_dump is all the backup you need
# on a fresh VPS
git clone … videyo && cd videyo
./scripts/init-letsencrypt.sh
docker compose up -d --build

# verify
curl https://videyo.co.ke/health