Video calls at the speed of light.
A full-stack, real-time video conferencing app built with MERN stack, WebRTC, and Socket.io.
| Feature | Description |
|---|---|
| 🔗 Instant Rooms | Create shareable meeting links with one click |
| 📹 HD Video Calls | Peer-to-peer WebRTC video with multiple participants |
| 📱 Fully Responsive | Optimized UI that scales beautifully on Mobile and Tablets |
| 🪟 Picture-in-Picture (PiP) | Native Document PiP to keep videos floating while changing tabs |
| 📝 Live Transcription | Real-time speech-to-text transcription panel during meetings |
| ✋ Interactive Q&A / Polls | Ask questions, upvote, and run real-time polls seamlessly |
| 🎨 Collaborative Whiteboard | Built-in synced whiteboard for drawing and explaining ideas |
| 🚪 Breakout Rooms | Split the main meeting into smaller, focused sub-rooms |
| 🕵️ SecretMeet | Anonymous random matching for instant 1-on-1 networking |
| 🎙️ Audio Controls | Mute/unmute microphone on the fly |
| 📷 Video Toggle | Enable/disable camera mid-call |
| 🖥️ Screen Sharing | Share your full screen or a specific window |
| 💬 In-Room Chat | Real-time text messaging with Socket.io |
| 🔒 P2P Encrypted | Direct WebRTC connections (no video relayed through server) |
| 🗄️ MongoDB Rooms | Rooms auto-expire after 24 hours |
| ⚡ No Signup | Enter a name and go — no account required |
QuantumMeet/
├── server/ # Node.js + Express + Socket.io backend
│ ├── index.js # Main server (REST API + WebSocket signaling)
│ ├── .env.example # Environment variable template
│ └── package.json
│
├── client/ # React frontend
│ ├── public/
│ │ └── index.html
│ ├── src/
│ │ ├── App.js # Router setup
│ │ ├── App.css # Global styles + design tokens
│ │ ├── context/
│ │ │ └── SocketContext.js # Socket.io React context
│ │ ├── hooks/
│ │ │ └── useWebRTC.js # WebRTC peer connection logic
│ │ ├── pages/
│ │ │ ├── Home.js # Landing / create / join
│ │ │ └── Room.js # Main meeting room
│ │ └── components/
│ │ ├── VideoTile.js # Individual video stream tile
│ │ ├── Controls.js # Mute / Camera / Share / Chat / Leave
│ │ ├── PipWindow.js # Picture-in-Picture window layout
│ │ └── ChatPanel.js # Slide-in chat drawer
│ └── package.json
│
├── package.json # Root helper scripts
└── README.md
Client A Server Client B
| | |
|── POST /api/rooms ──────>| |
|<─ { roomId, link } ──────| |
| | |
|── WS: join-room ────────>|<── WS: join-room ─────────|
|<─ existing-peers ─────────|── user-joined ──────────>|
| | |
|── offer ────────────────>|── offer ─────────────────>|
|<─ answer ─────────────────|<─ answer ─────────────────|
|── ice-candidate ─────────>|── ice-candidate ─────────>|
| | |
|◄══════════════ P2P WebRTC (direct) ══════════════════►|
| | |
|── chat-message ──────────>|── chat-message ──────────>|
- Node.js ≥ 18.x
- MongoDB — local install or MongoDB Atlas (free tier)
- npm ≥ 9.x
git clone https://github.com/your-username/QuantumMeet.git
cd QuantumMeetcd server
# Copy env file and configure it
cp .env.example .envEdit server/.env:
PORT=5000
MONGO_URI=mongodb://localhost:27017/quantummeet
CLIENT_URL=http://localhost:3000Note: The server works even without MongoDB — rooms are tracked in-memory only. MongoDB adds persistence and auto-expiry.
npm install
npm run dev # starts with nodemon (auto-reload)
# or
npm start # starts with nodeOpen a new terminal:
cd client
# Copy env file
cp .env.example .env
npm install
npm startReact starts at http://localhost:3000 and opens in your browser.
- Open http://localhost:3000
- Enter your name → click New Meeting
- Copy the meeting link displayed
- Click Join Now → you enter the room
- Open http://localhost:3000 in Browser 1 (Chrome)
- Enter name "Alice" → Create meeting → copy link → Join Now
- Open the same link in Browser 2 (or a different browser / incognito)
- Enter name "Bob" → you're now in the same call
- ✅ You should see both video streams
| Event | Payload | Description |
|---|---|---|
join-room |
{ roomId, userId, userName } |
Join a meeting room |
offer |
{ to, from, offer, userName } |
WebRTC offer to peer |
answer |
{ to, from, answer } |
WebRTC answer to offer |
ice-candidate |
{ to, from, candidate } |
ICE candidate exchange |
| Event | Payload | Description |
|---|---|---|
existing-peers |
[{ socketId, userId, userName }] |
Peers already in room |
user-joined |
{ socketId, userId, userName } |
New user joined |
user-left |
{ socketId, userName } |
User disconnected |
offer |
{ from, offer, userName } |
Incoming WebRTC offer |
| Layer | Technology |
|---|---|
| Frontend | React 18, React Router v6, CSS Modules |
| Backend | Node.js, Express.js |
| Real-time | Socket.io (WebSocket signaling) |
| Video | WebRTC (browser-native P2P) |
| Database | MongoDB + Mongoose (optional) |
| Styling | CSS Modules, Google Fonts (Syne + Space Mono) |
| ICE Servers | Google STUN servers (free) |
- Video/audio streams are peer-to-peer — they never touch the server
- The server only handles signaling (offer/answer/ICE exchange)
- Rooms auto-expire in MongoDB after 24 hours
- For production, add TURN servers for users behind strict NAT/firewalls
Server (server/.env):
PORT=5000
MONGO_URI=mongodb+srv://user:pass@cluster.mongodb.net/quantummeet
CLIENT_URL=https://yourdomain.comClient (client/.env):
REACT_APP_SERVER_URL=https://your-server-domain.com
REACT_APP_ICE_SERVERS=[{"urls":"stun:stun.l.google.com:19302"},{"urls":"turn:turn.yourdomain.com:3478","username":"user","credential":"pass"}]cd client
npm run build
# Outputs to client/build/Serve client/build with nginx, Vercel, Netlify, or any static host.
Deploy the server/ to Railway, Render, or any Node.js host.
Camera/mic not working?
- Allow browser permissions when prompted
- Try HTTPS (some browsers block getUserMedia on HTTP in production)
Participants can't see each other?
- Check both clients point to the same server URL
- Check the server console for join/signal logs
- Try in the same local network first
MongoDB connection fails?
- The server still works without MongoDB (rooms are in-memory)
- Check
MONGO_URIin.env - For Atlas: ensure your IP is whitelisted
Port already in use?
- Change
PORTinserver/.env - Kill existing processes:
lsof -ti:5000 | xargs kill
MIT — free to use, modify, and distribute.
Built with ⚡ using WebRTC + Socket.io + React + Node.js