A full-stack real-time video conferencing platform inspired by Google Meet and Zoom, built using the MERN Stack, Socket.IO, and WebRTC.
MeetFlow enables users to create, join, and schedule meetings, communicate through real-time chat, share screens, and collaborate seamlessly through peer-to-peer video conferencing.
π Live Application: https://meetflow-49z7.onrender.com
MeetFlow/
βββ .gitignore
βββ README.md
βββ backend/
β βββ package-lock.json
β βββ package.json
β βββ src/
β βββ config/
β β βββ cloudinary.js
β β βββ db.js
β β βββ firebase-admin.js
β βββ controllers/
β β βββ auth.controller.js
β β βββ meeting.controller.js
β βββ lib/
β β βββ arcjet.js
β β βββ env.js
β β βββ generateMeetingCode.js
β β βββ mailer.js
β β βββ utils.js
β βββ middleware/
β β βββ arcjet.middleware.js
β β βββ auth.middleware.js
β βββ models/
β β βββ Meeting.js
β β βββ User.js
β βββ routes/
β β βββ auth.routes.js
β β βββ meeting.routes.js
β βββ server.js
β βββ socket/
β βββ roomManager.js
β βββ socket.js
βββ frontend/
βββ .gitignore
βββ README.md
βββ eslint.config.js
βββ index.html
βββ package-lock.json
βββ package.json
βββ postcss.config.js
βββ src/
β βββ App.jsx
β βββ assets/
β β βββ MeetFlow Logo.png
β β βββ upcomming1.png
β βββ components/
β β βββ Navbar.jsx
β β βββ ProtectedRoute.jsx
β β βββ Sidebar.jsx
β β βββ dashboard/
β β βββ JoinMeetingModal.jsx
β β βββ ScheduleMeetingModal.jsx
β β βββ ShareMeetingModal.jsx
β βββ index.css
β βββ lib/
β β βββ axios.js
β β βββ firebase.js
β β βββ socket.js
β βββ main.jsx
β βββ pages/
β β βββ DashboardPage.jsx
β β βββ HistoryPage.jsx
β β βββ LoginPage.jsx
β β βββ MeetingRoomPage.jsx
β β βββ PersonalRoomPage.jsx
β β βββ ProfilePage.jsx
β β βββ SignupPage.jsx
β β βββ UpcomingPage.jsx
β β βββ VerifyEmailPage.jsx
β βββ store/
β βββ useAuthStore.js
β βββ useMeetingStore.js
βββ tailwind.config.js
βββ vite.config.js
- JWT Authentication
- Google Sign-In via Firebase Authentication
- Secure HTTP-only Cookies
- Email Verification
- Protected Routes
- Arcjet Bot Protection & Rate Limiting
- Password Hashing using bcrypt
- Create Instant Meetings
- Join Meetings via Meeting Code
- Schedule Future Meetings
- Upcoming Meetings Dashboard
- Meeting History Tracking
- Personal Meeting Rooms
- Live Participant Updates
- Real-Time Chat
- Join/Leave Notifications
- Socket.IO Room Management
- Peer-to-Peer Video Calling
- Audio Calling
- Multi-Participant Support
- Camera Toggle
- Microphone Toggle
- Leave Meeting Controls
- Share Entire Screen
- Share Application Window
- Real-Time Screen Streaming
- React.js
- Vite
- Tailwind CSS
- Zustand
- Axios
- React Router DOM
- Socket.IO Client
- Firebase Authentication (Google Sign-In)
- Node.js
- Express.js
- MongoDB
- Mongoose
- Firebase Admin SDK
- Arcjet
- Socket.IO
- WebRTC
- Socket.IO
- STUN Servers
- Render
- MongoDB Atlas
- GitHub
All endpoints in this section are prefixed with /api/auth.
| Method | Endpoint | Middleware | Controller | Description |
|---|---|---|---|---|
| POST | /login |
Arcjet | login |
Authenticates a user and sets a JWT cookie. |
| POST | /signup |
Arcjet | signup |
Registers a new user and sets a JWT cookie. |
| POST | /logout |
Arcjet | logout |
Clears the user's JWT cookie. |
| POST | /google |
Arcjet | google |
Verifies a Firebase ID token and sets a JWT cookie. |
| GET | /me |
Arcjet β protectRoute |
userProfile |
Retrieves the authenticated user's profile details. |
| PUT | /update-profile |
Arcjet β protectRoute |
updateProfile |
Updates the authenticated user's profile. |
| GET | /verify-email/:token |
Arcjet | verifyEmail |
Verifies the user's email address via a token link. |
| POST | /resend-verification |
Arcjet β protectRoute |
resendVerificationEmail |
Resends the email verification link. |
All endpoints in this section are prefixed with /api/meetings.
| Method | Endpoint | Middleware | Controller | Description |
|---|---|---|---|---|
| POST | /create |
protectRoute |
createInstantMeeting |
Starts an instant meeting. |
| POST | /join |
protectRoute |
joinMeeting |
Joins a meeting using a unique meeting code. |
| POST | /schedule |
protectRoute |
scheduleMeeting |
Schedules a meeting for a future date and time. |
| GET | /upcoming |
protectRoute |
getUpcomingMeetings |
Lists all scheduled upcoming meetings. |
| GET | /history |
protectRoute |
getHistoryMeetings |
Lists all past and ended meetings. |
| PATCH | /:meetingId/end |
protectRoute |
endMeeting |
Ends an active meeting (restricted to the host only). |
| GET | /personal-room |
protectRoute |
getPersonalRoom |
Retrieves details about the user's personal meeting room. |
| POST | /personal-room/join |
protectRoute |
joinPersonalRoom |
Joins a personal meeting room. |
The real-time events used for managing meeting rooms, chat messages, and WebRTC peer-to-step connections.
| Event | Direction | Payload | Purpose |
|---|---|---|---|
join-room |
Client β Server | { meetingCode, userId, fullName } |
Joins a meeting room. |
leave-room |
Client β Server | { meetingCode, userId } |
Leaves a meeting room. |
send-message |
Client β Server | { meetingCode, userId, fullName, message } |
Sends a chat message to the room. |
user-joined-alert |
Server β Client | { fullName } |
Notifies the room that a new user has entered. |
user-left-alert |
Server β Client | { fullName } |
Notifies the room that a user has departed. |
new-peer-joined |
Server β Client | { socketId, userId, fullName } |
Triggers a WebRTC offer to the newly joined peer. |
peer-left |
Server β Client | { socketId } |
Closes the WebRTC connection to a disconnected peer. |
participants-updated |
Server β Client | [{ userId, fullName, socketId }] |
Sends a full roster update of active participants. |
receive-message |
Server β Client | { userId, fullName, message, timestamp } |
Broadcasts an incoming chat message to all room members. |
webrtc-offer |
Bidirectional | { targetSocketId/senderSocketId, offer } |
Relays the Session Description Protocol (SDP) offer. |
webrtc-answer |
Bidirectional | { targetSocketId/senderSocketId, answer } |
Relays the Session Description Protocol (SDP) answer. |
webrtc-ice-candidate |
Bidirectional | { targetSocketId/senderSocketId, candidate } |
Relays Interactive Connectivity Establishment (ICE) candidates. |
PORT=5000
NODE_ENV=development
MONGO_URI=your_mongodb_uri
JWT_SECRET=your_jwt_secret
CLIENT_URL=http://localhost:5173
ARCJET_KEY=your_arcjet_key
ARCJET_ENV=development
CLOUDINARY_CLOUD_NAME=your_cloudinary_cloud_name
CLOUDINARY_API_KEY=your_cloudinary_api_key
CLOUDINARY_API_SECRET=your_cloudinary_api_secret
# Gmail SMTP
EMAIL_USER=your_email@gmail.com
EMAIL_PASS=your_app_password
# Firebase
FIREBASE_PROJECT_ID=your_firebase_project_id- Node.js (v18 or higher)
- MongoDB Atlas account
- Firebase project with Google Sign-In enabled
- Cloudinary account
git clone https://github.com/yourusername/MeetFlow.git
cd MeetFlowcd backend
npm install
# Create a .env file and fill in the environment variables listed above
npm run devcd frontend
npm install
npm run devIf you found this project helpful, please consider giving it a star β on GitHub.