Skip to content

Rashi-AI7/MeetOn

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

6 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MeetOn πŸŽ₯

A full-stack real-time video conferencing web app built with React, Node.js, Socket.IO and WebRTC. Create instant meetings, invite anyone with a link, and collaborate with video, audio, chat, screen sharing and reactions β€” all in the browser.

MeetOn React Node.js Socket.IO MongoDB


Features

  • Video & Audio Calls β€” Multi-user real-time video calls using WebRTC peer-to-peer mesh networking (up to 6 participants)
  • Perfect Negotiation β€” Collision-safe WebRTC signaling following the W3C Perfect Negotiation pattern
  • Screen Sharing β€” Share your screen with a single click, switch back to camera seamlessly
  • In-Meeting Chat β€” Public group chat with message history replay for late joiners
  • Private DMs β€” Send direct messages to individual participants mid-call
  • Emoji Reactions β€” Floating emoji reactions visible to all participants
  • Raise Hand β€” Signal the host without interrupting
  • Cam / Mic Controls β€” Toggle camera and microphone independently, with live status shown to peers
  • Dark / Light Mode β€” Persistent theme toggle
  • Authentication
    • Email & password (bcrypt hashed)
    • Google OAuth 2.0
    • Fingerprint-based guest access (1 free meeting)
  • Meeting History β€” Browse and rejoin past meetings (90-day TTL)
  • Duplicate Join Prevention β€” Same account can't join the same meeting twice
  • Host Controls β€” Host can end the meeting for all participants
  • Responsive UI β€” Works on desktop and mobile browsers

Tech Stack

Frontend

Technology Purpose
React 18 UI framework
React Router v6 Client-side routing
Socket.IO Client Real-time signaling
WebRTC (native) Peer-to-peer video/audio
Material UI v5 Component library
Axios HTTP client

Backend

Technology Purpose
Node.js (ESM) Runtime
Express 5 HTTP server
Socket.IO 4 WebSocket signaling server
Mongoose 9 MongoDB ODM
JWT Authentication tokens
bcrypt Password hashing
Helmet Security headers
express-rate-limit Brute force protection
Google Auth Library OAuth token verification

Database

Technology Purpose
MongoDB Atlas Users, rooms, meeting history

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Frontend (React)                    β”‚
β”‚  Landing β†’ Auth β†’ Home β†’ VideoMeet β†’ History        β”‚
β”‚  AuthContext Β· ThemeContext Β· environment.js         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚  REST (Axios) + WebSocket (Socket.IO)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               Backend (Express + Socket.IO)          β”‚
β”‚  /api/v1/users  Β·  /api/v1/rooms                    β”‚
β”‚  user.controller Β· room.controller Β· socketManager  β”‚
β”‚  JWT middleware Β· rate limiting Β· Helmet             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚  Mongoose
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 MongoDB Atlas                        β”‚
β”‚  Users Β· Rooms (24h TTL) Β· Meetings (90d TTL)       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

WebRTC: Direct P2P between browsers (STUN: Google public servers)

Getting Started

Prerequisites

  • Node.js 18+
  • MongoDB Atlas account (or local MongoDB)
  • Google Cloud project with OAuth 2.0 credentials (optional)

1. Clone the repository

git clone https://github.com/your-username/MeetOn.git
cd MeetOn

2. Set up the backend

cd backend
npm install
cp .env.example .env
# Fill in your values in .env
npm run dev

backend/.env

MONGO_URI=your_mongodb_atlas_uri
JWT_SECRET=your_long_random_secret
JWT_EXPIRES_IN=7d
PORT=8000
ALLOWED_ORIGIN=http://localhost:3000
GOOGLE_CLIENT_ID=your_google_client_id   # optional

3. Set up the frontend

cd frontend
npm install
cp .env.example .env
npm start

frontend/.env

REACT_APP_SERVER_URL=http://localhost:8000
REACT_APP_GOOGLE_CLIENT_ID=your_google_client_id   # optional

4. Open the app

Visit http://localhost:3000


Deployment

Backend β†’ Railway

  1. New Project β†’ Deploy from GitHub β†’ set root to backend/
  2. Add all env vars from backend/.env.example
  3. Settings β†’ Networking β†’ Generate Domain

Frontend β†’ Vercel

  1. New Project β†’ Import repo β†’ set root to frontend/
  2. Framework: Create React App
  3. Add env vars:
    REACT_APP_SERVER_URL=https://your-backend.railway.app
    REACT_APP_GOOGLE_CLIENT_ID=your_google_client_id
    

After deploying both

  • Update ALLOWED_ORIGIN on Railway to your Vercel URL
  • Add your Vercel URL to Google OAuth authorized origins
  • MongoDB Atlas β†’ Network Access β†’ allow 0.0.0.0/0

Project Structure

MeetOn/
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ controllers/
β”‚   β”‚   β”‚   β”œβ”€β”€ user.controller.js
β”‚   β”‚   β”‚   β”œβ”€β”€ room.controller.js
β”‚   β”‚   β”‚   └── socketManager.js
β”‚   β”‚   β”œβ”€β”€ middleware/
β”‚   β”‚   β”‚   └── auth.js
β”‚   β”‚   β”œβ”€β”€ models/
β”‚   β”‚   β”‚   β”œβ”€β”€ user.model.js
β”‚   β”‚   β”‚   β”œβ”€β”€ room.model.js
β”‚   β”‚   β”‚   └── meeting.model.js
β”‚   β”‚   β”œβ”€β”€ routes/
β”‚   β”‚   β”‚   β”œβ”€β”€ users.routes.js
β”‚   β”‚   β”‚   └── rooms.routes.js
β”‚   β”‚   └── app.js
β”‚   β”œβ”€β”€ .env.example
β”‚   └── package.json
β”‚
└── frontend/
    β”œβ”€β”€ src/
    β”‚   β”œβ”€β”€ contexts/
    β”‚   β”‚   β”œβ”€β”€ AuthContext.jsx
    β”‚   β”‚   └── ThemeContext.jsx
    β”‚   β”œβ”€β”€ pages/
    β”‚   β”‚   β”œβ”€β”€ VideoMeet.jsx
    β”‚   β”‚   β”œβ”€β”€ home.jsx
    β”‚   β”‚   β”œβ”€β”€ authentication.jsx
    β”‚   β”‚   β”œβ”€β”€ history.jsx
    β”‚   β”‚   └── landing.jsx
    β”‚   β”œβ”€β”€ utils/
    β”‚   β”‚   └── environment.js
    β”‚   └── App.js
    β”œβ”€β”€ .env.example
    └── package.json

Security Highlights

  • JWT verified at both HTTP and Socket.IO handshake layers
  • Anti-enumeration: identical error for wrong username or wrong password
  • requireFullAccount middleware blocks guests from protected routes
  • Rate limiting on all auth, guest, and profile endpoints
  • Helmet security headers (COEP disabled for WebRTC compatibility)
  • bcrypt password hashing (10 rounds)
  • NoSQL injection protection via mongo-sanitize
  • Duplicate session prevention β€” same account can't join the same room twice

Known Limitations

  • No TURN server β€” calls may fail between users on strict symmetric NAT (corporate/mobile networks). Planned for a future release.
  • In-memory socket state β€” room state resets on server restart. Redis pub/sub needed for horizontal scaling.
  • Mesh WebRTC β€” capped at 6 participants. SFU architecture (e.g. mediasoup) needed for larger calls.

Author

Rashi-AI7

About

A full-stack real-time video conferencing app built with React, Node.js, Socket.IO and WebRTC. Features multi-user video calls, in-meeting chat, screen sharing, reactions and Google OAuth.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors