A full-stack web application for conducting live technical interviews with video calling, real-time chat, and session management capabilities.
Talent IQ is a platform designed to facilitate technical interviews by connecting hosts and participants in coding sessions. The platform features real-time video calls, chat messaging, and comprehensive session management.
workspace/
βββ backend/ # Node.js Express Backend
β βββ src/
β βββ controllers/ # Request handlers
β βββ lib/ # Utility libraries (DB, Stream, Inngest)
β βββ Middelware/ # Authentication middleware
β βββ models/ # MongoDB schemas
β βββ routes/ # API routes
β βββ server.js # Entry point
βββ frontend/ # React + TypeScript Frontend
β βββ project/
β βββ public/ # Static assets
β βββ src/
β βββ assets/ # Images, fonts, etc.
β βββ data/ # Problem definitions
β βββ lib/ # Utility functions
β βββ pages/ # React pages/routes
β βββ App.tsx # Main App component
β βββ main.tsx # Entry point
β βββ index.css # Global styles
βββ package.json # Root package configuration
- Runtime: Node.js with ES Modules
- Framework: Express.js v5
- Database: MongoDB with Mongoose ODM
- Authentication: Clerk (@clerk/express)
- Video Calling: Stream Video SDK (@stream-io/node-sdk)
- Real-time Chat: Stream Chat (stream-chat)
- Background Jobs: Inngest
- Environment Management: dotenv
- CORS: Enabled for cross-origin requests
- Framework: React 19.2.0
- Language: TypeScript 5.9.3
- Build Tool: Vite 7.2.4
- Authentication: Clerk React (@clerk/clerk-react)
- Styling:
- TailwindCSS 4.1.18
- DaisyUI 5.5.14 (Component Library)
- Custom CSS
- Routing: React Router 7.11.0
- State Management: TanStack React Query 5.90.16
- HTTP Client: Axios 1.13.2
- Notifications: React Hot Toast 2.6.0
- Linting: ESLint with TypeScript support
- Clerk Integration: Complete authentication flow with Clerk
- User Sync: Automatic user synchronization between Clerk and MongoDB
- Inngest Functions:
sync-user: Syncs user data on creation/update from Clerkdelete-user-from-db: Removes user from database when deleted in Clerk
- Stream User Management: Automatic creation/deletion of Stream users
Complete CRUD operations for coding sessions:
- Creates a new coding session with problem and difficulty
- Generates unique Stream video call ID
- Initializes chat channel for the session
- Protected route (requires authentication)
- Retrieves all active sessions
- Populates host information (name, profile image)
- Sorted by creation date (newest first)
- Limited to 20 sessions
- Fetches completed sessions where user was host or participant
- Returns last 20 sessions
- Sorted by creation date
- Retrieves specific session details
- Populates both host and participant information
- Allows users to join an active session
- Validates:
- Session exists
- User is not the host
- Session not already joined
- Adds user to Stream chat channel
- Marks session as completed
- Only host can end the session
- Deletes associated chat channel
- Video Calls: Stream Video SDK integration for video/audio calls
- Chat Messaging: Stream Chat for real-time text communication
- Token Generation: Secure token generation for Stream services
{
name: String (required),
email: String (required, unique),
profileImage: String (default: ""),
clerkId: String (required, unique),
timestamps: true
}{
problem: String (required),
difficulty: Enum ["easy", "medium", "hard"] (required),
host: ObjectId (ref: User, required),
participant: ObjectId (ref: User, default: null),
status: Enum ["active", "completed", "cancelled"] (default: "active"),
callId: String (default: "")
}- Protected Routes: Custom middleware combining Clerk auth and database user lookup
- CORS Configuration: Configured for client URL with credentials
- Request Validation: Input validation for session creation
GET /token- Get Stream chat token (protected)
POST /- Create new session (protected)GET /active- Get active sessions (protected)GET /my-recent- Get user's recent sessions (protected)GET /:id- Get session by ID (protected)POST /:id/join- Join a session (protected)POST /:id/end- End a session (protected)
- 120+ LeetCode Problems: Comprehensive collection of Easy, Medium, and Hard problems.
- Multi-language Support: Starter code available for JavaScript, Python, and Java.
- Detailed Metadata: Each problem includes descriptions, constraints, examples, and tags.
- Piston API Integration: Secure, sandboxed code execution for multiple languages.
- Real-time Feedback: Instant output and error reporting for code submissions.
- Multi-language Support: Run code in JavaScript, Python, and Java.
PORT=<server_port>
DATABASE_URL=<mongodb_connection_string>
NODE_ENV=<development|production>
CLIENT_URL=<frontend_url>
INNGEST_EVENT_KEY=<inngest_event_key>
INNGEST_SIGNING_KEY=<inngest_signing_key>
STREAM_API_KEY=<stream_api_key>
STREAM_API_SECRET=<stream_api_secret>
CLERK_SECRET_KEY=<clerk_secret_key>
CLERK_PUBLISHABLE_KEY=<clerk_publishable_key>VITE_CLERK_PUBLISHABLE_KEY=<clerk_publishable_key>- Install all dependencies:
npm run buildThis will install dependencies for both backend and frontend.
- Run Backend:
cd backend
npm run dev- Run Frontend:
cd frontend/project
npm run dev- Build Frontend:
npm run build- Start Backend:
npm startThe backend will serve the built frontend in production mode.
npm run build- Install dependencies for backend and frontend, build frontendnpm start- Start backend server
npm run dev- Start development server with nodemonnpm start- Start production server
npm run dev- Start Vite development servernpm run build- Build for productionnpm run preview- Preview production build
The application listens for Clerk webhook events:
clerk/user.created- Syncs new user to databaseclerk/user.updated- Updates user in databaseclerk/user.deleted- Removes user from database
/api/inngest- Inngest event handler endpoint
- Video calls initialized with unique call IDs
- Chat channels created per session
- User tokens generated for secure access
β
User authentication with Clerk
β
Automatic user synchronization
β
Session creation and management
β
Real-time video calling
β
Real-time chat messaging
β
Protected API routes
β
MongoDB database integration
β
Background job processing with Inngest
β
Production-ready deployment setup
- The application uses ES Modules (
"type": "module") - All routes are protected and require authentication
- Stream services are initialized for both chat and video
- Database connection is established before server starts
- Frontend is served from backend in production mode
- Clerk authentication middleware
- Protected routes with user validation
- Secure token generation for Stream services
- CORS configuration with credentials
- Environment variable management
The application uses a custom connection protocol that:
- Connects to MongoDB using Mongoose
- Starts the Express server only after successful DB connection
- Exits gracefully on connection failure
- React 19 with TypeScript for type safety
- Vite for lightning-fast development and optimized production builds
- TailwindCSS 4 with DaisyUI 5 for modern, responsive UI components
- React Router 7 for client-side routing
- TanStack React Query for server state management and caching
- Axios for HTTP requests with interceptors
- React Hot Toast for elegant notifications
pages/: Route components (HomePage, AboutPage, etc.)lib/: Utility functions and configurationsassets/: Static resources (images, fonts)App.tsx: Main application component with routingmain.tsx: Application entry point with Clerk provider
- TailwindCSS for utility-first styling
- DaisyUI for pre-built, customizable components
- Custom CSS for specific design requirements
- Responsive design with mobile-first approach
- TanStack React Query for:
- Server state caching
- Automatic background refetching
- Optimistic updates
- Request deduplication
Repository: https://github.com/Vaidiasri/iq
License: ISC