MuxRoom is a browser-based real-time video conferencing app built with React, TypeScript, Socket.IO, and WebRTC. It lets users create or join meeting rooms, preview their camera and microphone, and connect with other participants in a shared room without requiring a desktop app.
- Instant room creation from the landing page
- Pre-join media setup and device preview
- Multi-participant video rooms with audio/video toggles
- Screen sharing support
- Real-time signaling via Socket.IO
- TURN server support for ICE traversal via Cloudflare
- Frontend: React, TypeScript, Vite, Tailwind CSS, Framer Motion, Lucide Icons
- Backend: Node.js, Express, Socket.IO
- Media and signaling: WebRTC, Socket.IO
- Authentication/credentials: Cloudflare TURN API
muxroom/
├── backend/
│ ├── server.js
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ ├── config/
│ │ ├── hooks/
│ │ └── types/
│ ├── package.json
│ └── vite.config.ts
├── architecture.md
└── README.md
- The user lands on the landing page and creates or joins a room.
- The pre-join screen requests camera and microphone access so the user can preview their setup.
- The frontend connects to the Socket.IO server and joins a named room.
- The backend relays WebRTC signaling messages such as offers, answers, and ICE candidates between peers.
- The WebRTC peer connections establish direct media streams between browsers.
- A TURN endpoint on the backend fetches ICE server credentials from Cloudflare when needed for connectivity behind NATs.
- Node.js 20+
- npm 10+
- A modern browser with camera and microphone permissions
Create a file named .env inside the backend folder:
CF_TOKEN_ID=your_cloudflare_token_id
CF_API_TOKEN=your_cloudflare_api_tokenThe backend uses these values to request TURN credentials from Cloudflare.
Create a file named .env inside the frontend folder:
VITE_SOCKET_URL=http://localhost:3000cd backend && npm install
cd ../frontend && npm installStart the backend:
cd backend
npm run devIn a second terminal, start the frontend:
cd frontend
npm run devThen open the frontend URL shown by Vite, usually:
http://localhost:5173
- npm run dev - start the Express and Socket.IO server with nodemon
- npm run dev - start the Vite development server
- npm run build - build the application for production
- npm run lint - run ESLint
- Browser permissions for camera and microphone are required for local media access.
- The current implementation uses a simple in-memory room map on the backend, so rooms are ephemeral and reset when the server restarts.
- The app is intended for local development and demo use, and can be extended with persistent room storage and authentication later.