Instant, registration-free group video conferencing. Create a room, share the link, and talk face to face in seconds - with screen sharing and chat built in.
Features
- No registration, no accounts, no downloads
- Real-time multi-party video/audio (full-mesh WebRTC)
- Shareable room links
- Screen sharing
- In-room chat
| Layer | Technology |
|---|---|
| Client | Vite, React 18, TypeScript, Tailwind CSS, Framer Motion, PeerJS |
| Server | Node 22, Express 5, Socket.IO 4, self-hosted PeerJS broker |
| Tooling | npm workspaces, Vitest, ESLint, Docker |
The repo is an npm-workspaces monorepo:
- client/ - the single-page app (UI + WebRTC logic).
- server/ - the signaling server (room membership + chat over Socket.IO) and the PeerJS broker that carries media. A backend is required: WebRTC needs a signaling channel and a peer broker.
Requires Node 20+.
npm install # installs both workspaces
cp client/.env.example client/.env
cp server/.env.example server/.envRun the server and client in two terminals:
npm run dev:server # signaling on http://localhost:5000
npm run dev:client # app on http://localhost:5173Open http://localhost:5173. To test a real call, open the room link in a second browser/tab.
Camera and microphone access requires a secure context.
localhostcounts as secure; any other host must be served over HTTPS.
| Command | What it does |
|---|---|
npm run dev:client |
Vite dev server (HMR) |
npm run dev:server |
Signaling server with watch reload |
npm run build |
Builds both workspaces |
npm test |
Runs the Vitest suites in both workspaces |
npm run typecheck |
Type-checks both workspaces |
npm run lint |
Lints the client |
Client (client/.env.example):
VITE_SERVER_URL- base URL of the signaling server (empty = same origin).VITE_PEER_PATH- PeerJS broker path; must match the server.
Server (server/.env.example):
PORT,NODE_ENVCORS_ORIGINS- comma-separated allowed browser origins (*for local dev only).PEER_PATH- path the PeerJS broker is mounted under.
Containerized development (live reload):
docker compose -f docker-compose.dev.yml up --build # http://localhost:5173Source folders are bind-mounted, so host edits sync into the containers instantly: Vite HMR refreshes the browser and tsx restarts the server on change - no rebuild needed. File-watching uses polling so changes are detected reliably across the mount.
The signaling server is published on host port 5055 by default (macOS AirPlay Receiver holds 5000). The container still listens on 5000 internally. Override with
SERVER_PORT=xxxx docker compose -f docker-compose.dev.yml up --build.
Production-style images (no reload): docker compose up --build builds the same images shipped to production (static SPA via nginx + compiled server) and serves the client on :8080. Use it to validate the build locally. See docker-compose.yml.
Production deployment to a Hostinger VPS is documented in DEPLOYMENT.md.
GPL-3.0