The code for a private video room is small: LiveKit moves the media, a React page holds the controls, and an agent writes both in a sitting. The weekend goes on what Zoom hides behind a link: a server with a public address and open UDP ports, TURN relaying so guests on locked-down office networks can still join, a lobby and passcodes, and testing from phones and poor Wi-Fi. What stays behind is phone dial-in, cloud recording with summaries, calendar add-ins and the fact that clients expect a Zoom link. For a few friendly guests it works; for customers who must always get in, it doesn't.
Before you buildCheck Zoom Basic first: it is free, takes up to 100 people and caps meetings at 40 minutes. For short one-to-one calls you may not need Pro or a build.
Build me a private video-room app to replace Zoom for small calls. Requirements: - Node.js 22 + TypeScript: a Fastify server that mints join tokens with `livekit-server-sdk` and serves a React + Vite front end built on `@livekit/components-react`. `docker compose up` starts the app, a LiveKit server (the `livekit/livekit-server` image) and Caddy for HTTPS on APP_HOST, LIVEKIT_HOST and TURN_HOST from .env. - Storage: better-sqlite3 in ./data/rooms.db for rooms (slug, title, passcode hash, expiry) and a join log. - Host: one password in .env (signed cookie) opens /admin to create a room with an optional passcode and expiry. Each room gets a link at /r/<random-slug>. The host sees a lobby list and admits or denies each guest. - Guest: opens the link, types a name and waits in the lobby until admitted; no account, no install. Tokens expire after 2 hours and a room holds at most 8 people (LiveKit `maxParticipants`). - In the call: camera and microphone toggles, device picker, screen share, text chat over a data channel, grid and speaker layouts, a connection-quality badge, and host controls to mute everyone and remove a guest. - Network: in livekit.yaml set `use_external_ip`, TCP 7881 and a UDP port range, and enable the built-in TURN server with a real certificate for TURN_HOST (self-signed ones do not work). `npm run check-network` joins a test room and prints which transport was used: UDP, TCP or TURN over TLS. - Tests (Vitest): token claims and expiry, passcode check, lobby admit and deny, and the 8-person cap. - Single host. No accounts, no telemetry, nothing recorded. Outbound calls: certificate issuance only. - Out of scope: recording, phone dial-in, calendar invites, breakout rooms, virtual backgrounds, 9 or more people. - README: the three DNS records, the firewall ports to open, a VPS size to start with, and a plain warning that guests on networks which only allow port 443 need TURN on 443, which takes a second IP or SNI routing: do not claim it works until `check-network` passes from such a network and from a phone on mobile data.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Zoom Workplace Pro.
Add recording to the video-room app in this folder. Requirements: - Add Redis and the `livekit/egress` image to docker-compose.yml and the matching keys to livekit.yaml. - A host-only Record button starts a room composite recording to MP4 in ./data/recordings/<room>/; everyone in the room sees a banner while it runs. - Stop writes a row in rooms.db (start, end, size) and a download link on /admin; a delete button removes the file and the row. - Refuse to start when free disk space is under 5 GB. - Update the README with the disk use per hour you measured.
Add email invitations to the video-room app in this folder. Requirements: - On /admin, a room form takes a start time, a duration and up to 10 email addresses. - Send each guest a message through nodemailer SMTP (settings in .env) with the link and an .ics attachment made with the `ics` package; use the host's IANA time zone. - Reminder email 15 minutes before the start; a Cancel button sends an updated .ics with status CANCELLED. - Never put the passcode in the same email as the link. - Update the README.
Add a permanent room to the video-room app in this folder. Requirements: - A room flagged permanent never expires, keeps its slug, and can be given a short vanity path such as /r/maria. - The lobby stays on: the host admits every guest, with an optional "remember this guest for 7 days" cookie. - A rotate-link button replaces the slug and ends any open session. - Show the last 20 joins on /admin. - Update the README and add tests for the remember cookie's expiry.
A meeting link is a promise to someone else's calendar, and the other side already has Zoom installed and allowed on their network. Teams pay so that a call works from any laptop or hotel connection, with recordings and summaries filed afterwards. Pro's price buys what Basic holds back: meetings longer than 40 minutes, storage and the AI limits.
Estimate · A small VPS with generous bandwidth; relayed video uses more traffic than anything else. The build is token usage on your agent plan.
Checked 2026-10-19 against Zoom Workplace Pro's docs: 1, 2, 3, 4, 5, 6
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Basic | $0/user | $0/user | 40-minute meetings, up to 100 participants, 3 AI meeting summaries, 20 AI queries and 3 AI note-taking uses a month. |
| Pro | $16.99/user | $14.16/user | Meetings up to 30 hours, up to 100 participants, 10 GB of cloud storage per user, unlimited AI meeting summaries and in-meeting questions, 8 custom summary templates a month. |
| Business | $21.99/user | $18.33/user | Up to 300 participants, 30-hour meetings, 10 GB of cloud storage per license, unlimited AI note-taking, summaries and in-meeting questions. |
| Enterprise | custom | — | Up to 1,000 participants on the plan card (the comparison table says 500 or more), 30-hour meetings, unlimited cloud recording. |
Basic is free: meetings up to 40 minutes with up to 100 participants and a small monthly allowance of AI summaries.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Phone dial-in and one-tap join from calendar invites, Cloud recording with transcripts and AI meeting summaries.
About $16.99 a month on the Pro plan per seat, $203.88 a year (checked 2026-10-19).
Phone dial-in and one-tap join from calendar invites; Cloud recording with transcripts and AI meeting summaries; Relay servers around the world and meetings of up to 100 people; Whiteboard, breakout rooms, polls and virtual backgrounds; Zoom's name on the invite: clients and IT departments already allow it through their firewalls. If any of those matter to you, keep paying.
Yes: Jitsi Meet (open source), BigBlueButton (open source), Nextcloud Talk (open source).