Two layers
- App and data: the Next.js app, Supabase (auth, history, recording storage), Deepgram (captions), and an OpenAI or OpenRouter key (PRD and Memory writers).
- Realtime media: a LiveKit SFU. Use LiveKit Cloud, or run the open-source
livekit-serverbinary yourself.
You can self-host the media layer and still use SaaS for the rest, then swap pieces out over time.
Three deployment paths
| Path | Media | Good for |
|---|---|---|
| A. Fastest | LiveKit Cloud | Getting a working room on your own domain in an afternoon |
| B. Own SFU | Your livekit-server (config in selfhost/) | Keeping audio and video off a third-party media cloud |
| C. White-label | Either | Running it as your own product: your domain, branding, guest policy |
Local smoke test
git clone, copy .env.example to .env.local, fill the keys, run supabase/schema.sql on your project, then npm install && npm run dev. Joining a room only needs LiveKit. Captions, history, recording, and the PRD each light up when you add their key.
What stays on your network, and what doesn’t
Running your own SFU keeps media on your servers. It does not keep words there. Captions go to Deepgram and PRD or Memory writing goes to your model provider unless you point those at something you run. The app reports this in code (dataLeaving() in lib/hosting.ts), so you can see by name which vendors receive data.
Recording on your own storage
The room records one continuous HD 720p file (1280×720, 24fps) in the host’s browser, about 19 MB per minute, and uploads it resumably to your Supabase Storage. Raise the Storage upload limit above your longest take. Supabase’s Free plan caps files at 50 MB, about 2 to 3 minutes. If storage refuses a take, the host can still download it from the tab.
Operator checklist
- Set
APP_URLto your domain - Decide guest policy:
ALLOW_GUEST_JOIN(default on; see no-download guest join) - Optionally restrict hosts to one email domain with
ALLOWED_EMAIL_DOMAIN - Private bucket for recordings; rotate any key that touched a demo
Related
- Open-source Zoom alternative: comparison table
- Open-source video meeting: product overview
- Podcast recording in the browser