A Full-Stack Real-Time Interview Platform with Integrated Video Calls, Live Chat, and Code Execution
Features β’ Tech Stack β’ Installation β’ Architecture β’ API Documentation
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.
- 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
- 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
- Monaco Editor integration (same as VS Code)
- Syntax highlighting for multiple languages
- Real-time code sharing and collaboration
- Auto-completion and intelligent suggestions
- Hand-picked coding challenges spanning multiple difficulties
- Easy, Medium, and Hard problem categories
- Comprehensive problem descriptions with examples
- Constraint specifications and test cases
- Create and host interview sessions
- Join active sessions with ease
- Session history tracking
- Real-time status monitoring
- Enterprise-grade security with Clerk authentication
- OAuth support for social login
- User profile management
- Secure API endpoints with middleware protection
- Email notifications via Inngest
- Automated workflow triggers
- Reliable task scheduling
- Error handling and retries
- Modern design with TailwindCSS & DaisyUI
- Mobile-responsive interface
- Smooth animations and transitions
- Dark mode support
- Session statistics and analytics
- Recent sessions overview
- Problem-solving history
- Performance metrics
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
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
Linter: ESLint 9.36.0
Type Checking: React Types 19.1.13
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
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
# 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 codemeetCreate .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_keyFrontend - 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# Install root dependencies
npm install
# Install backend dependencies
npm install --prefix backend
# Install frontend dependencies
npm install --prefix frontendOption A: Development Mode (Run backend and frontend separately)
Terminal 1 - Start Backend:
npm run dev --prefix backend
# Server runs on http://localhost:5000Terminal 2 - Start Frontend:
npm run dev --prefix frontend
# Client runs on http://localhost:5173Option B: Production Build
# Build the entire application
npm run build
# Start the production server
npm start
# Application runs on http://localhost:5000Open your browser and navigate to:
- Development:
http://localhost:5173 - Production:
http://localhost:5000
http://localhost:5000/api
All protected endpoints require Clerk authentication via middleware. Include authorization headers automatically when using the axios client.
GET /api/chat/token
Authorization: Bearer <clerk_token>
Response (200 OK):
{
"token": "eyJhbGc...",
"userId": "user_123",
"apiKey": "stream_api_key"
}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 /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 /api/sessions/my-recent
Authorization: Bearer <clerk_token>
Response (200 OK):
[...]GET /api/sessions/:id
Authorization: Bearer <clerk_token>
Response (200 OK):
{
"_id": "session_123",
"problem": "two-sum",
"difficulty": "easy",
"host": { ... },
"participant": { ... },
"status": "active"
}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"
}POST /api/sessions/:id/end
Authorization: Bearer <clerk_token>
Response (200 OK):
{
"_id": "session_123",
"status": "completed"
}GET /api/health
Response (200 OK):
{
"msg": "api is up and running"
}βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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 β
βββββββββββββββββββ΄βββββββββββββββββββ΄ββββββββββββββββββββββββ
- User Authentication: User logs in via Clerk β Frontend stores auth token
- Session Creation: User creates session β Express API stores in MongoDB
- Session Joining: Participant joins β System generates Stream.io call ID
- Real-time Communication:
- Video: Stream.io Video SDK handles peer-to-peer connection
- Chat: Stream Chat SDK manages real-time messaging
- Session Completion: Either participant ends session β Status updated in DB
- Video SDK: Handles real-time video conferencing with automatic quality adaptation
- Chat SDK: Provides real-time messaging with persistence, read receipts, and threading
- Secure OAuth provider integration
- Session management and JWT token handling
- User profile management with custom fields
- Triggers email notifications when sessions start/end
- Handles asynchronous task processing without blocking main thread
- Automatic retry logic for failed jobs
- Same code editor used in VS Code
- Syntax highlighting for 100+ languages
- IntelliSense and auto-completion
- Integrated terminal support
npm run lint --prefix frontendnpm run build --prefix frontendnpm install -g vercel
vercel --prod --prefix frontendheroku login
heroku create your-app-name
git push heroku main- Push to GitHub
- Connect repository to Railway
- Set environment variables
- Deploy!
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Use ESLint configuration provided
- Follow React best practices and hooks patterns
- Write meaningful commit messages
- Keep components modular and reusable
This project is licensed under the ISC License - see the LICENSE file for details.
- 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
For support, email support@codemeet.io or open an issue on GitHub.
- 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