Skip to content

MayankJha8274/MeetTrack-AI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

19 Commits
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸŽ₯ ZoomClone - Video Conferencing with AI Face Recognition Attendance

A full-stack video conferencing application with real-time AI-powered face recognition for automated attendance tracking. Built with React, Node.js, WebRTC, and TensorFlow.js.

License Node React


πŸ“‹ Table of Contents


✨ Features

Core Video Conferencing

  • πŸ“Ή Real-time Video Calls - WebRTC peer-to-peer connections
  • 🎀 Audio/Video Controls - Mute/unmute, camera on/off
  • πŸ–₯️ Screen Sharing - Share your screen with participants
  • πŸ’¬ In-Meeting Chat - Real-time text messaging
  • πŸ‘₯ Multi-participant Support - Group video calls

AI-Powered Attendance System

  • πŸ€– Face Recognition - TensorFlow.js powered face detection
  • πŸ“Š Automated Attendance - Tracks presence every 10 seconds
  • πŸ‘οΈ Real-time Monitoring - Live attendance dashboard for meeting owners
  • πŸ“ˆ Attendance Reports - Detailed reports with presence percentage
  • βœ… Smart Status - Present (β‰₯75%), Partial (50-75%), Absent (<50%)

User Management

  • πŸ” User Authentication - Secure login/registration with bcrypt
  • πŸ“š Meeting History - View past meetings and attendance records
  • πŸ‘‘ Meeting Owner System - First user becomes the meeting owner

πŸ›  Tech Stack

Frontend

Technology Version Purpose
React 18.2.0 UI Framework
Material-UI 5.18.0 Component Library
Socket.io-client 4.7.3 Real-time Communication
@vladmandic/face-api 1.7.15 Face Recognition
TensorFlow.js 4.22.0 ML Runtime
React Router 6.21.1 Navigation
Axios 1.6.5 HTTP Client

Backend

Technology Version Purpose
Node.js 18+ Runtime
Express.js 4.18.2 Web Framework
Socket.io 4.7.3 WebSocket Server
MongoDB - Database
Mongoose 8.0.3 ODM
Bcrypt 5.1.1 Password Hashing

WebRTC

Component Purpose
RTCPeerConnection Peer-to-peer media streaming
getUserMedia Camera/microphone access
STUN Server NAT traversal (Google STUN)

πŸ— System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         CLIENT (React)                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   Video     β”‚  β”‚    Chat     β”‚  β”‚   Face Recognition      β”‚  β”‚
β”‚  β”‚   Stream    β”‚  β”‚   Panel     β”‚  β”‚   (TensorFlow.js)       β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚         β”‚                β”‚                     β”‚                 β”‚
β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
β”‚                          β”‚                                       β”‚
β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”                               β”‚
β”‚                  β”‚  Socket.io    β”‚                               β”‚
β”‚                  β”‚   Client      β”‚                               β”‚
β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚ WebSocket
                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      SERVER (Node.js)                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Express    β”‚  β”‚  Socket.io  β”‚  β”‚   Attendance            β”‚  β”‚
β”‚  β”‚   API       β”‚  β”‚   Server    β”‚  β”‚   Manager               β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚         β”‚                β”‚                     β”‚                 β”‚
β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
β”‚                          β”‚                                       β”‚
β”‚                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”                               β”‚
β”‚                  β”‚   Mongoose    β”‚                               β”‚
β”‚                  β”‚     ODM       β”‚                               β”‚
β”‚                  β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   MongoDB    β”‚
                    β”‚   Atlas      β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ Installation

Prerequisites

  • Node.js 18+ installed
  • MongoDB Atlas account (or local MongoDB)
  • Git

Step 1: Clone the Repository

git clone <repository-url>
cd Zoom

Step 2: Backend Setup

cd backend
npm install

Create .env file in backend folder:

PORT=8000
MONGO_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/zoomclone

Step 3: Frontend Setup

cd ../frontend
npm install

Step 4: Start the Application

Terminal 1 - Backend:

cd backend
npm run dev

Terminal 2 - Frontend:

cd frontend
npm start

Step 5: Access the Application


πŸ“ Project Structure

Zoom/
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ app.js                 # Express server entry point
β”‚   β”‚   β”œβ”€β”€ controllers/
β”‚   β”‚   β”‚   β”œβ”€β”€ socketManager.js   # Socket.io event handlers
β”‚   β”‚   β”‚   └── user.controller.js # User authentication logic
β”‚   β”‚   β”œβ”€β”€ models/
β”‚   β”‚   β”‚   β”œβ”€β”€ user.model.js      # User schema
β”‚   β”‚   β”‚   β”œβ”€β”€ face.model.js      # Face descriptor schema
β”‚   β”‚   β”‚   β”œβ”€β”€ meeting.model.js   # Meeting history schema
β”‚   β”‚   β”‚   └── attendance.model.js# Attendance record schema
β”‚   β”‚   └── routes/
β”‚   β”‚       β”œβ”€β”€ users.routes.js    # Auth API routes
β”‚   β”‚       └── attendance.routes.js# Attendance API routes
β”‚   └── package.json
β”‚
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ public/
β”‚   β”‚   └── index.html
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ App.js                 # Main app with routing
β”‚   β”‚   β”œβ”€β”€ environment.js         # Backend URL config
β”‚   β”‚   β”œβ”€β”€ contexts/
β”‚   β”‚   β”‚   └── AuthContext.jsx    # Authentication state
β”‚   β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”‚   β”œβ”€β”€ landing.jsx        # Homepage
β”‚   β”‚   β”‚   β”œβ”€β”€ authentication.jsx # Login/Register
β”‚   β”‚   β”‚   β”œβ”€β”€ home.jsx           # Dashboard after login
β”‚   β”‚   β”‚   β”œβ”€β”€ VideoMeet.jsx      # Video call + attendance
β”‚   β”‚   β”‚   β”œβ”€β”€ history.jsx        # Meeting history
β”‚   β”‚   β”‚   └── AttendanceHistory.jsx # Attendance reports
β”‚   β”‚   β”œβ”€β”€ styles/
β”‚   β”‚   β”‚   └── videoComponent.module.css
β”‚   β”‚   └── utils/
β”‚   β”‚       └── withAuth.jsx       # Auth HOC
β”‚   └── package.json
β”‚
└── README.md

πŸ”„ How It Works

1. User Flow

Landing Page β†’ Login/Register β†’ Home Dashboard β†’ Join/Create Meeting

2. Video Call Flow

1. User joins meeting URL (e.g., /abc123)
2. Camera/Mic permissions requested
3. Socket.io connection established
4. WebRTC peer connections created with other users
5. Video/audio streams exchanged

3. Face Recognition Attendance Flow

1. User joins meeting
2. Face enrollment modal appears
3. User's face is captured and 128D descriptor extracted
4. Descriptor saved to MongoDB
5. Every 10 seconds:
   - Face detection runs on local video
   - Detected face compared with enrolled face
   - If match (>60% confidence): verifiedTime += 10s
   - Data sent to server via Socket.io
6. On meeting end:
   - Attendance report generated
   - Report sent to meeting owner
   - Saved to database

4. Attendance Calculation

verifiedPercent = (verifiedTime / totalTime) * 100

Status:
- Present: verifiedPercent >= 75%
- Partial: verifiedPercent >= 50% && < 75%
- Absent: verifiedPercent < 50%

πŸ”Œ API Endpoints

Authentication

Method Endpoint Description
POST /api/v1/users/register Create new user
POST /api/v1/users/login User login
POST /api/v1/users/logout User logout
POST /api/v1/users/add_to_activity Log meeting activity
GET /api/v1/users/get_all_activity Get user's meeting history

Attendance

Method Endpoint Description
GET /api/v1/attendance/reports Get all attendance reports
GET /api/v1/attendance/owner-reports/:owner Get reports for meeting owner

Health

Method Endpoint Description
GET /api/health Server health check

πŸ“‘ Socket Events

Client β†’ Server

Event Data Description
join-call (path, userId, userName, isOwner) Join a meeting room
signal (toId, message) WebRTC signaling
chat-message (data, sender) Send chat message
register-face {meetingId, userId, descriptor} Register face descriptor
verified-update {meetingId, userId, userName, verifiedDelta} Update attendance
end-meeting {meetingId} End meeting & generate report

Server β†’ Client

Event Data Description
user-joined (socketId, allSocketIds) New user joined
user-left (socketId) User left meeting
signal (fromId, message) WebRTC signal relay
chat-message (data, sender, socketId) New chat message
you-are-owner - Notify meeting owner
live-attendance {participants} Live attendance data
attendance-report {report} Final attendance report
owner-attendance-report {report} Owner's detailed report

πŸ’Ύ Database Models

User

{
  name: String,        // Display name
  username: String,    // Unique login ID
  password: String,    // Bcrypt hashed
  token: String        // Session token
}

Face

{
  userId: String,      // Username
  meetingId: String,   // Meeting code
  descriptor: [Number] // 128D face descriptor
}

Attendance

{
  meetingId: String,
  meetingOwner: String,
  participants: [{
    userId: String,
    name: String,
    totalTime: Number,
    verifiedTime: Number,
    verifiedPercent: Number,
    status: String       // 'Present'|'Partial'|'Absent'
  }],
  startTime: Date,
  endTime: Date
}

πŸ”§ Troubleshooting

Common Issues

1. Port Already in Use

# Windows
netstat -ano | findstr :8000
taskkill /F /PID <PID>

# Or use npm script
cd backend && npm run kill-port

2. Camera/Microphone Not Working

  • Check browser permissions
  • Ensure HTTPS in production (WebRTC requires secure context)
  • Try refreshing the page

3. Face Recognition Not Loading

4. WebRTC Connection Failed

  • Check STUN server connectivity
  • Ensure both users have camera enabled
  • Check firewall settings

5. MongoDB Connection Failed

  • Verify MONGO_URI in .env file
  • Check network connectivity
  • Ensure IP is whitelisted in MongoDB Atlas

6. Socket Connection Refused

  • Ensure backend is running on port 8000
  • Check frontend environment.js has correct URL
  • Verify CORS configuration

πŸš€ Future Scope

Phase 1: Enhanced Security

  • ID card verification before face enrollment
  • Two-factor authentication
  • End-to-end encryption for video

Phase 2: Advanced Features

  • Virtual backgrounds
  • Meeting recording
  • Breakout rooms
  • Whiteboard collaboration

Phase 3: AI Improvements

  • Anti-spoofing (liveness detection)
  • Multiple face detection warning
  • Emotion/attention tracking
  • Auto-attendance from recorded meetings

Phase 4: Scalability

  • SFU media server integration
  • Load balancing
  • CDN for static assets
  • Kubernetes deployment

Phase 5: Integration

  • Google Calendar sync
  • Email notifications
  • LMS integration (Canvas, Moodle)
  • Export attendance to Excel/PDF

πŸ‘¨β€πŸ’» Scripts Reference

Backend

npm run dev      # Start with nodemon (hot reload)
npm start        # Production start
npm run kill-port # Kill process on port 8000
npm run restart  # Kill port + start dev

Frontend

npm start        # Development server
npm run build    # Production build
npm test         # Run tests

πŸ“ License

This project is licensed under the ISC License.


πŸ™ Acknowledgments


Made with ❀️ for modern video conferencing

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors