Skip to content

Latest commit

Β 

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ Codemeet - Real-Time Collaborative Coding Interview Platform

Codemeet Logo Status License

A Full-Stack Real-Time Interview Platform with Integrated Video Calls, Live Chat, and Code Execution

Features β€’ Tech Stack β€’ Installation β€’ Architecture β€’ API Documentation


πŸ“‹ Overview

Codemeet is a sophisticated, production-ready interview platform designed to revolutionize technical hiring. It seamlessly integrates video conferencing, real-time messaging, and live code execution in a single, unified platform. Whether you're conducting technical interviews, competitive programming sessions, or collaborative coding sessions, Codemeet provides all the tools you need with an exceptional user experience.

The platform leverages cutting-edge technologies including Stream.io for real-time communication, Clerk for secure authentication, Inngest for background job processing, and Monaco Editor for professional code editing.


✨ Key Features

πŸŽ₯ Real-Time Video Conferencing

  • Crystal-clear HD video calls powered by Stream.io Video SDK
  • Multi-participant support with speaker layout
  • Automatic call quality optimization
  • Real-time participant tracking

πŸ’¬ Integrated Live Chat

  • Instant messaging during coding sessions using Stream Chat
  • Thread-based conversations for organized discussions
  • Real-time message delivery with read receipts
  • Persistent chat history per session

πŸ’» Professional Code Editor

  • Monaco Editor integration (same as VS Code)
  • Syntax highlighting for multiple languages
  • Real-time code sharing and collaboration
  • Auto-completion and intelligent suggestions

πŸ† Curated Problem Library

  • Hand-picked coding challenges spanning multiple difficulties
  • Easy, Medium, and Hard problem categories
  • Comprehensive problem descriptions with examples
  • Constraint specifications and test cases

πŸ“Š Session Management

  • Create and host interview sessions
  • Join active sessions with ease
  • Session history tracking
  • Real-time status monitoring

πŸ” Secure Authentication

  • Enterprise-grade security with Clerk authentication
  • OAuth support for social login
  • User profile management
  • Secure API endpoints with middleware protection

πŸ“§ Background Job Processing

  • Email notifications via Inngest
  • Automated workflow triggers
  • Reliable task scheduling
  • Error handling and retries

🎨 Beautiful, Responsive UI

  • Modern design with TailwindCSS & DaisyUI
  • Mobile-responsive interface
  • Smooth animations and transitions
  • Dark mode support

πŸ“ˆ User Dashboard

  • Session statistics and analytics
  • Recent sessions overview
  • Problem-solving history
  • Performance metrics

πŸ›  Tech Stack

Backend

Framework:        Express.js 5.1.0
Runtime:          Node.js (ES Modules)
Database:         MongoDB with Mongoose
Authentication:   Clerk Express
Video/Chat:       Stream.io Node SDK & Stream Chat
Job Queue:        Inngest
Dev Tools:        Nodemon

Frontend

Framework:        React 19.1.1
Build Tool:       Vite 7.1.7
UI Library:       TailwindCSS 4.1.18 & DaisyUI 5.5.17
State Management: TanStack React Query 5.90.5
Code Editor:      Monaco Editor 4.7.0
Video/Chat:       Stream.io React SDKs
HTTP Client:      Axios
Routing:          React Router 7.9.4
Notifications:    React Hot Toast & Canvas Confetti
Date Handling:    date-fns
Icons:            Lucide React
UI Components:    React Resizable Panels

DevTools & Linting

Linter:           ESLint 9.36.0
Type Checking:    React Types 19.1.13

πŸ“ Project Structure

codemeet/
β”œβ”€β”€ πŸ“„ package.json                 # Root package configuration
β”‚
β”œβ”€β”€ backend/                        # Express.js API Server
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ server.js               # Main server entry point
β”‚   β”‚   β”œβ”€β”€ controllers/
β”‚   β”‚   β”‚   β”œβ”€β”€ chatController.js   # Stream chat token generation
β”‚   β”‚   β”‚   └── sessionController.js # Session CRUD operations
β”‚   β”‚   β”œβ”€β”€ routes/
β”‚   β”‚   β”‚   β”œβ”€β”€ chatRoutes.js       # Chat endpoints
β”‚   β”‚   β”‚   └── sessionRoutes.js    # Session endpoints
β”‚   β”‚   β”œβ”€β”€ models/
β”‚   β”‚   β”‚   β”œβ”€β”€ User.js             # User schema with Clerk integration
β”‚   β”‚   β”‚   └── Session.js          # Session schema
β”‚   β”‚   β”œβ”€β”€ middleware/
β”‚   β”‚   β”‚   └── protectRoute.js     # JWT/Clerk authentication middleware
β”‚   β”‚   └── lib/
β”‚   β”‚       β”œβ”€β”€ db.js               # MongoDB connection
β”‚   β”‚       β”œβ”€β”€ env.js              # Environment configuration
β”‚   β”‚       β”œβ”€β”€ ingest.js           # Inngest job definitions
β”‚   β”‚       └── stream.js           # Stream.io client initialization
β”‚   └── package.json
β”‚
└── frontend/                       # React + Vite SPA
    β”œβ”€β”€ src/
    β”‚   β”œβ”€β”€ main.jsx                # React entry point
    β”‚   β”œβ”€β”€ App.jsx                 # Main App component with routing
    β”‚   β”œβ”€β”€ index.css               # Global styles
    β”‚   β”œβ”€β”€ pages/
    β”‚   β”‚   β”œβ”€β”€ HomePage.jsx        # Landing page
    β”‚   β”‚   β”œβ”€β”€ DashboardPage.jsx   # User dashboard
    β”‚   β”‚   β”œβ”€β”€ ProblemsPage.jsx    # Problems listing
    β”‚   β”‚   β”œβ”€β”€ ProblemPage.jsx     # Single problem view with editor
    β”‚   β”‚   └── SessionPage.jsx     # Live session with video & chat
    β”‚   β”œβ”€β”€ components/
    β”‚   β”‚   β”œβ”€β”€ VideoCallUI.jsx     # Video call interface
    β”‚   β”‚   β”œβ”€β”€ ActiveSessions.jsx  # Active sessions list
    β”‚   β”‚   β”œβ”€β”€ CodeEditorPanel.jsx # Monaco editor wrapper
    β”‚   β”‚   β”œβ”€β”€ OutputPanel.jsx     # Code execution output
    β”‚   β”‚   β”œβ”€β”€ ProblemDescription.jsx
    β”‚   β”‚   β”œβ”€β”€ CreateSessionModal.jsx
    β”‚   β”‚   β”œβ”€β”€ RecentSessions.jsx
    β”‚   β”‚   β”œβ”€β”€ StatsCards.jsx
    β”‚   β”‚   β”œβ”€β”€ Navbar.jsx
    β”‚   β”‚   └── WelcomeSection.jsx
    β”‚   β”œβ”€β”€ hooks/
    β”‚   β”‚   β”œβ”€β”€ useSessions.js      # Session management hook
    β”‚   β”‚   └── useStreamClient.js  # Stream.io client hook
    β”‚   β”œβ”€β”€ lib/
    β”‚   β”‚   β”œβ”€β”€ axios.js            # Configured axios instance
    β”‚   β”‚   β”œβ”€β”€ piston.js           # Code execution API integration
    β”‚   β”‚   β”œβ”€β”€ stream.js           # Stream client initialization
    β”‚   β”‚   └── utils.js            # Utility functions
    β”‚   β”œβ”€β”€ api/
    β”‚   β”‚   └── sessions.js         # Session API calls
    β”‚   └── data/
    β”‚       └── problems.js         # Problem database
    β”œβ”€β”€ public/                     # Static assets
    β”œβ”€β”€ vite.config.js              # Vite configuration
    β”œβ”€β”€ eslint.config.js            # ESLint rules
    β”œβ”€β”€ tailwind.config.js          # TailwindCSS theming
    β”œβ”€β”€ package.json
    └── README.md

πŸš€ Getting Started

Prerequisites

Before you begin, ensure you have the following installed:

  • Node.js (v18.0.0 or higher)
  • npm (v9.0.0 or higher) or yarn
  • MongoDB (local or MongoDB Atlas cloud instance)
  • Git

Installation & Setup

1️⃣ Clone the Repository

# Using HTTPS
git clone https://github.com/ggoswami777/codemeet.git

# Or using SSH
git clone git@github.com:ggoswami777/codemeet.git

# Navigate to project directory
cd codemeet

2️⃣ Environment Configuration

Create .env files for both backend and frontend:

Backend - backend/.env:

# Server Configuration
PORT=5000
NODE_ENV=development
CLIENT_URL=http://localhost:5173

# Database
MONGODB_URI=mongodb://localhost:27017/codemeet
# Or use MongoDB Atlas:
# MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/codemeet

# Clerk Authentication
CLERK_SECRET_KEY=your_clerk_secret_key
CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key

# Stream.io Credentials
STREAM_API_KEY=your_stream_api_key
STREAM_API_SECRET=your_stream_api_secret

# Inngest API Key (for background jobs)
INNGEST_API_KEY=your_inngest_api_key
INNGEST_EVENT_KEY=your_inngest_event_key

Frontend - frontend/.env:

VITE_CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key
VITE_API_URL=http://localhost:5000/api
VITE_STREAM_API_KEY=your_stream_api_key

3️⃣ Install Dependencies

# Install root dependencies
npm install

# Install backend dependencies
npm install --prefix backend

# Install frontend dependencies
npm install --prefix frontend

4️⃣ Start the Application

Option A: Development Mode (Run backend and frontend separately)

Terminal 1 - Start Backend:

npm run dev --prefix backend
# Server runs on http://localhost:5000

Terminal 2 - Start Frontend:

npm run dev --prefix frontend
# Client runs on http://localhost:5173

Option B: Production Build

# Build the entire application
npm run build

# Start the production server
npm start
# Application runs on http://localhost:5000

5️⃣ Access the Application

Open your browser and navigate to:

  • Development: http://localhost:5173
  • Production: http://localhost:5000

πŸ“‘ API Documentation

Base URL

http://localhost:5000/api

Authentication

All protected endpoints require Clerk authentication via middleware. Include authorization headers automatically when using the axios client.

Chat Endpoints

Get Stream Chat Token

GET /api/chat/token
Authorization: Bearer <clerk_token>

Response (200 OK):
{
  "token": "eyJhbGc...",
  "userId": "user_123",
  "apiKey": "stream_api_key"
}

Session Endpoints

Create a New Session

POST /api/sessions
Content-Type: application/json
Authorization: Bearer <clerk_token>

Request Body:
{
  "problem": "two-sum",
  "difficulty": "easy"
}

Response (201 Created):
{
  "_id": "session_123",
  "problem": "two-sum",
  "difficulty": "easy",
  "host": "user_123",
  "participant": null,
  "status": "active",
  "callId": "",
  "createdAt": "2024-01-15T10:30:00Z"
}

Get All Active Sessions

GET /api/sessions/active
Authorization: Bearer <clerk_token>

Response (200 OK):
[
  {
    "_id": "session_123",
    "problem": "two-sum",
    "difficulty": "easy",
    "host": { "_id": "user_123", "name": "John Doe", "profileImage": "..." },
    "participant": null,
    "status": "active"
  },
  ...
]

Get My Recent Sessions

GET /api/sessions/my-recent
Authorization: Bearer <clerk_token>

Response (200 OK):
[...]

Get Session by ID

GET /api/sessions/:id
Authorization: Bearer <clerk_token>

Response (200 OK):
{
  "_id": "session_123",
  "problem": "two-sum",
  "difficulty": "easy",
  "host": { ... },
  "participant": { ... },
  "status": "active"
}

Join a Session

POST /api/sessions/:id/join
Authorization: Bearer <clerk_token>

Response (200 OK):
{
  "_id": "session_123",
  "problem": "two-sum",
  "participant": "user_456",
  "status": "active",
  "callId": "generated_call_id"
}

End a Session

POST /api/sessions/:id/end
Authorization: Bearer <clerk_token>

Response (200 OK):
{
  "_id": "session_123",
  "status": "completed"
}

Health Check

GET /api/health

Response (200 OK):
{
  "msg": "api is up and running"
}

πŸ— Architecture Overview

System Design

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    CLIENT LAYER (React)                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Video UI      β”‚  Code Editor   β”‚  Chat Interface      β”‚ β”‚
β”‚  β”‚  (SpeakerView) β”‚  (Monaco)      β”‚  (Stream Chat)       β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                            ↓                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚         React Router + Clerk Authentication            β”‚ β”‚
β”‚  β”‚         State Management (React Query)                 β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓ (Axios HTTP Calls)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   API GATEWAY (Express.js)                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚  Chat Routes   β”‚  Session Routes β”‚ Auth Middleware    β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         ↓ (Controllers)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              BUSINESS LOGIC LAYER                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚ Session CRUD   β”‚      Chat Token Generation            β”‚β”‚
β”‚  β”‚ User Management β”‚      Stream Integration              β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         DATA PERSISTENCE LAYER (MongoDB)                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚ Users Collection   β”‚ Sessions Collection               β”‚β”‚
β”‚  β”‚ β€’ name             β”‚ β€’ problem                         β”‚β”‚
β”‚  β”‚ β€’ email            β”‚ β€’ difficulty                      β”‚β”‚
β”‚  β”‚ β€’ clerkId          β”‚ β€’ host (ref to User)             β”‚β”‚
β”‚  β”‚ β€’ profileImage     β”‚ β€’ participant (ref to User)      β”‚β”‚
β”‚  β”‚ β€’ timestamps       β”‚ β€’ status (active/completed)      β”‚β”‚
β”‚  β”‚                    β”‚ β€’ callId                          β”‚β”‚
β”‚  β”‚                    β”‚ β€’ timestamps                      β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         EXTERNAL SERVICES INTEGRATION                       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  STREAM.IO      β”‚  CLERK AUTH      β”‚  INNGEST JOBS        β”‚
β”‚  ────────────   β”‚  ─────────────   β”‚  ──────────────      β”‚
β”‚  β€’ Video Call   β”‚  β€’ User Auth     β”‚  β€’ Email Notify      β”‚
β”‚  β€’ Chat Stream  β”‚  β€’ OAuth         β”‚  β€’ Job Scheduling   β”‚
β”‚  β€’ Real-time    β”‚  β€’ JWT Tokens    β”‚  β€’ Event Driven      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow

  1. User Authentication: User logs in via Clerk β†’ Frontend stores auth token
  2. Session Creation: User creates session β†’ Express API stores in MongoDB
  3. Session Joining: Participant joins β†’ System generates Stream.io call ID
  4. Real-time Communication:
    • Video: Stream.io Video SDK handles peer-to-peer connection
    • Chat: Stream Chat SDK manages real-time messaging
  5. Session Completion: Either participant ends session β†’ Status updated in DB

πŸ”‘ Key Technologies Explained

Stream.io Integration

  • Video SDK: Handles real-time video conferencing with automatic quality adaptation
  • Chat SDK: Provides real-time messaging with persistence, read receipts, and threading

Clerk Authentication

  • Secure OAuth provider integration
  • Session management and JWT token handling
  • User profile management with custom fields

Inngest Background Jobs

  • Triggers email notifications when sessions start/end
  • Handles asynchronous task processing without blocking main thread
  • Automatic retry logic for failed jobs

Monaco Editor

  • Same code editor used in VS Code
  • Syntax highlighting for 100+ languages
  • IntelliSense and auto-completion
  • Integrated terminal support

πŸ§ͺ Testing

Run Linting

npm run lint --prefix frontend

Build for Production

npm run build --prefix frontend

πŸ“¦ Deployment

Deploy on Vercel (Frontend)

npm install -g vercel
vercel --prod --prefix frontend

Deploy on Heroku (Backend)

heroku login
heroku create your-app-name
git push heroku main

Deploy Entire App on Railway

  1. Push to GitHub
  2. Connect repository to Railway
  3. Set environment variables
  4. Deploy!

🀝 Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Code Standards

  • Use ESLint configuration provided
  • Follow React best practices and hooks patterns
  • Write meaningful commit messages
  • Keep components modular and reusable

πŸ“„ License

This project is licensed under the ISC License - see the LICENSE file for details.


πŸ™Œ Acknowledgments

  • Stream.io - For excellent video and chat SDKs
  • Clerk - For seamless authentication
  • MongoDB - For flexible database
  • Inngest - For reliable background jobs
  • Monaco Editor - For professional code editing
  • TailwindCSS & DaisyUI - For beautiful UI components

πŸ“§ Contact & Support

For support, email support@codemeet.io or open an issue on GitHub.


🎯 Roadmap

  • Code Execution Integration with Piston API
  • Whiteboard Integration for visual problem solving
  • Interview Recording and Playback
  • Advanced Analytics Dashboard
  • Mobile App (React Native)
  • AI-powered Problem Suggestions
  • Interview Templates and Rubrics
  • Payment Integration for Premium Features

⭐ If you find this project useful, please consider giving it a star! ⭐

Made with ❀️ by Gaurav Goswami

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages