Self-hosted video conferencing platform with collaborative tools, optimized for connectivity with sanctioned regions.
- Video/audio calls (LiveKit WebRTC)
- Screen sharing
- Cloud recording (LiveKit Egress → MinIO)
- Collaborative whiteboard (Excalidraw + Yjs)
- Collaborative documents (TipTap + Yjs)
- Collaborative code editor (Rustpad)
- Text chat (LiveKit Data Messages)
- TURN relay for RU/BY connectivity (coturn)
- Node.js 20+
- pnpm 9+
- Docker Desktop (running)
git clone https://github.com/w3voice/w3meet.git
cd w3meet
pnpm installCopy the example and use as-is for local development — all defaults match Docker Compose:
cp .env.example .envThe .env file is pre-configured for local Docker setup. You only need to change values for production deployment.
cd docker && docker compose -f docker-compose.yml up -d && cd ..This starts:
| Service | Port | Purpose |
|---|---|---|
| LiveKit | 7880 | WebRTC SFU server |
| Redis | 6379 | Room state, Yjs snapshots |
| MinIO | 9000 (API), 9001 (console) | Recording & artifact storage |
| Rustpad | 3030 | Collaborative code editor |
| Egress | — | Recording service (connects to LiveKit) |
pnpm devThis starts both backend (port 3001) and frontend (port 5173).
- Click "Create Room" on the landing page
- Enter your name and click "Connect"
- Share the room link with others (without the
host_keyparameter) - Use the bottom toolbar to toggle: camera, mic, screen share, whiteboard, docs, code
All variables are in .env at the project root. For local development, the defaults from .env.example work out of the box.
| Variable | Default | Description |
|---|---|---|
LIVEKIT_API_KEY |
devkey |
LiveKit API key (must match docker/livekit.yaml) |
LIVEKIT_API_SECRET |
devsecret |
LiveKit API secret (must match docker/livekit.yaml) |
LIVEKIT_URL |
ws://localhost:7880 |
LiveKit server WebSocket URL |
REDIS_URL |
redis://localhost:6379 |
Redis connection string |
MINIO_ENDPOINT |
localhost |
MinIO hostname |
MINIO_PORT |
9000 |
MinIO API port |
MINIO_ACCESS_KEY |
minioadmin |
MinIO access key (must match docker-compose) |
MINIO_SECRET_KEY |
minioadmin |
MinIO secret key (must match docker-compose) |
MINIO_BUCKET_RECORDINGS |
recordings |
Bucket for call recordings |
MINIO_BUCKET_ARTIFACTS |
artifacts |
Bucket for whiteboard/doc/code exports |
PORT |
3001 |
Backend server port |
CORS_ORIGIN |
http://localhost:5173 |
Allowed CORS origin (frontend URL) |
TURN_SECRET |
turnsecret |
TURN server shared secret (must match docker/coturn.conf) |
TURN_SERVER |
turn:localhost:3478 |
TURN server address |
TURN_TLS_SERVER |
turns:localhost:5349 |
TURN server TLS address |
For production: change all secrets (LIVEKIT_API_SECRET, MINIO_SECRET_KEY, TURN_SECRET) to strong random values and update the corresponding Docker configs.
pnpm testClient (Vite + React) ←→ Backend (Express + Node.js) ←→ LiveKit Server (SFU)
←→ Yjs WebSocket Server ←→ Redis
←→ Rustpad (iframe) ←→ MinIO (recordings)
| Layer | Technology |
|---|---|
| Frontend | Vite + React 18 + TypeScript |
| Video/Audio | LiveKit Server + @livekit/components-react |
| Backend | Node.js + Express |
| Whiteboard | Excalidraw + Yjs |
| Documents | TipTap + Yjs |
| Code Editor | Rustpad |
| Recording | LiveKit Egress → MinIO |
| State | Redis |
| TURN Relay | coturn |
- Set up a VPS (recommended: 4 vCPU, 8 GB RAM, 100 GB SSD)
- Install Docker & Docker Compose
- Clone the repo, create
.envwith production secrets - Update
docker/livekit.yaml— changekeysto match your.env - Add TLS certificates (Let's Encrypt via Certbot)
- Run:
cd docker && docker compose -f docker-compose.yml -f docker-compose.dev.yml up -dFor improved connectivity with RU/BY:
- Set up a VPS in KZ or TR (recommended: 2 vCPU, 4 GB RAM)
- Update
docker/coturn.conf— changestatic-auth-secretto matchTURN_SECRET - Add TLS certificates
- Run:
cd docker && docker compose -f docker-compose.relay.yml up -d- Update primary server's
TURN_SERVERandTURN_TLS_SERVERto point to the relay IP
Full spec: docs/superpowers/specs/2026-03-23-w3-meet-design.md