{"id":48894616,"url":"https://github.com/bhatvinay7/caller","last_synced_at":"2026-04-16T10:06:15.245Z","repository":{"id":331363067,"uuid":"1125266294","full_name":"bhatvinay7/caller","owner":"bhatvinay7","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-05T15:59:11.000Z","size":352,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"dev","last_synced_at":"2026-01-07T00:29:39.817Z","etag":null,"topics":["docker-compose","socket-io","webrtc","webrtc-signaling"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bhatvinay7.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-30T12:24:52.000Z","updated_at":"2026-01-05T16:09:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bhatvinay7/caller","commit_stats":null,"previous_names":["bhatvinay7/caller"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/bhatvinay7/caller","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhatvinay7%2Fcaller","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhatvinay7%2Fcaller/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhatvinay7%2Fcaller/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhatvinay7%2Fcaller/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bhatvinay7","download_url":"https://codeload.github.com/bhatvinay7/caller/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bhatvinay7%2Fcaller/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31880932,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T09:23:21.276Z","status":"ssl_error","status_checked_at":"2026-04-16T09:23:15.028Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker-compose","socket-io","webrtc","webrtc-signaling"],"created_at":"2026-04-16T10:06:14.382Z","updated_at":"2026-04-16T10:06:15.234Z","avatar_url":"https://github.com/bhatvinay7.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WebRTC Caller Application - Docker Setup\n\nA complete WebRTC video calling application with signaling server, HTTP backend, and Next.js frontend. This guide covers local development with Cloudflare Tunnel for HTTPS testing.\n\n## 📋 Table of Contents\n\n- [Prerequisites](#prerequisites)\n- [Project Structure](#project-structure)\n- [Environment Setup](#environment-setup)\n- [Installation](#installation)\n- [Docker Setup](#docker-setup)\n- [Cloudflare Tunnel Setup](#cloudflare-tunnel-setup)\n- [Running the Application](#running-the-application)\n- [Usage Guide](#usage-guide)\n- [Troubleshooting](#troubleshooting)\n\n## 🔧 Prerequisites\n\n- **Node.js** (v18 or higher)\n- **Docker** and **Docker Compose**\n- **MongoDB** (or use MongoDB Atlas)\n- **Cloudflare Account** (free tier works)\n- **Metered.ca Account** (for TURN/STUN servers)\n\n## 📁 Project Structure\n\n```\n.\n├── apps/\n│   ├── web/                    # Next.js frontend\n│   ├── http-server/            # Express backend API\n│   └── signaling-server/       # WebSocket signaling server\n├── docker-compose.dev.yaml\n├── docker-compose.tunnel.yaml\n└── README.md\n```\n\n## 🌍 Environment Setup\n\n### 1. Get TURN/STUN Credentials from Metered.ca\n\n1. Sign up at [metered.ca](https://www.metered.ca/)\n2. Create a new application\n3. Copy your STUN/TURN server credentials\n\n### 2. Environment Variables\n\n#### **apps/web/.env**\n\n```env\n# Cloudflare Tunnel URLs (update after tunnel creation)\nNEXT_PUBLIC_SOCKET_URL=https://your-signaling-tunnel.trycloudflare.com\nNEXT_PUBLIC_BACKEND_URL=https://your-backend-tunnel.trycloudflare.com\n\n# Metered.ca STUN/TURN Servers\nNEXT_PUBLIC_STUN_URL=stun:stun.relay.metered.ca:80\nNEXT_PUBLIC_TURN_URL=turn:turn.relay.metered.ca:80\nNEXT_PUBLIC_TURN_USERNAME=your_metered_username\nNEXT_PUBLIC_TURN_PASSWORD=your_metered_password\n```\n\n#### **apps/http-server/.env**\n\n```env\n# Frontend URL (Cloudflare Tunnel)\nNEXT_PUBLIC_FRONTEND_URL=https://your-web-tunnel.trycloudflare.com\n\n# JWT Secret (generate a random string)\nJWT_SECRET=your_super_secret_jwt_key_change_this\n\n# MongoDB Connection\nMONGO_URI=mongodb://localhost:27017/webrtc_caller\n# Or use MongoDB Atlas:\n# MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/webrtc_caller\n```\n\n#### **apps/signaling-server/.env**\n\n```env\n# Frontend URL (Cloudflare Tunnel)\nNEXT_PUBLIC_FRONTEND_URL=https://your-web-tunnel.trycloudflare.com\n\n# JWT Secret (must match http-server)\nJWT_SECRET=your_super_secret_jwt_key_change_this\n```\n\n## 📦 Installation\n\n### Install pnpm\n\n**Windows (PowerShell):**\n```powershell\niwr https://get.pnpm.io/install.ps1 -useb | iex\n```\n\n**macOS/Linux:**\n```bash\ncurl -fsSL https://get.pnpm.io/install.sh | sh -\n```\n\n**Or via npm:**\n```bash\nnpm install -g pnpm\n```\n\n**Verify installation:**\n```bash\npnpm --version\n```\n\n### Install Dependencies\n\n```bash\n# Install all workspace dependencies\npnpm install\n```\n\n## 🐳 Docker Setup\n\n### Dockerfile for Each Service\n\n#### **apps/web/Dockerfile**\n\n```dockerfile\nFROM node:18-alpine AS base\n\n# Install pnpm\nRUN npm install -g pnpm\n\n# Set working directory\nWORKDIR /app\n\n# Copy package files\nCOPY package.json pnpm-lock.yaml ./\nCOPY apps/web/package.json ./apps/web/\n\n# Install dependencies\nRUN pnpm install --frozen-lockfile\n\n# Copy application code\nCOPY apps/web ./apps/web\n\n# Set working directory to web app\nWORKDIR /app/apps/web\n\n# Build the application\nRUN pnpm build\n\n# Expose port\nEXPOSE 3000\n\n# Start the application\nCMD [\"pnpm\", \"start\"]\n```\n\n#### **apps/http-server/Dockerfile**\n\n```dockerfile\nFROM node:18-alpine\n\n# Install pnpm\nRUN npm install -g pnpm\n\n# Set working directory\nWORKDIR /app\n\n# Copy package files\nCOPY package.json pnpm-lock.yaml ./\nCOPY apps/http-server/package.json ./apps/http-server/\n\n# Install dependencies\nRUN pnpm install --frozen-lockfile\n\n# Copy application code\nCOPY apps/http-server ./apps/http-server\n\n# Set working directory to http-server\nWORKDIR /app/apps/http-server\n\n# Expose port\nEXPOSE 3002\n\n# Start the application\nCMD [\"pnpm\", \"start\"]\n```\n\n#### **apps/signaling-server/Dockerfile**\n\n```dockerfile\nFROM node:18-alpine\n\n# Install pnpm\nRUN npm install -g pnpm\n\n# Set working directory\nWORKDIR /app\n\n# Copy package files\nCOPY package.json pnpm-lock.yaml ./\nCOPY apps/signaling-server/package.json ./apps/signaling-server/\n\n# Install dependencies\nRUN pnpm install --frozen-lockfile\n\n# Copy application code\nCOPY apps/signaling-server ./apps/signaling-server\n\n# Set working directory to signaling-server\nWORKDIR /app/apps/signaling-server\n\n# Expose port\nEXPOSE 8080\n\n# Start the application\nCMD [\"pnpm\", \"start\"]\n```\n\n### Docker Compose Files\n\n#### **docker-compose.dev.yml** (Local Development)\n\n```yaml\nversion: '3.8'\n\nservices:\n  mongodb:\n    image: mongo:7.0\n    container_name: webrtc_mongodb\n    ports:\n      - \"27017:27017\"\n    volumes:\n      - mongodb_data:/data/db\n    environment:\n      - MONGO_INITDB_DATABASE=webrtc_caller\n    networks:\n      - webrtc_network\n\n  http-server:\n    build:\n      context: .\n      dockerfile: apps/http-server/Dockerfile\n    container_name: webrtc_http_server\n    ports:\n      - \"3002:3002\"\n    environment:\n      - NODE_ENV=development\n      - PORT=3002\n      - MONGO_URI=mongodb://mongodb:27017/webrtc_caller\n    env_file:\n      - apps/http-server/.env\n    depends_on:\n      - mongodb\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\n  signaling-server:\n    build:\n      context: .\n      dockerfile: apps/signaling-server/Dockerfile\n    container_name: webrtc_signaling_server\n    ports:\n      - \"8080:8080\"\n    environment:\n      - NODE_ENV=development\n      - PORT=8080\n    env_file:\n      - apps/signaling-server/.env\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\n  web:\n    build:\n      context: .\n      dockerfile: apps/web/Dockerfile\n    container_name: webrtc_web\n    ports:\n      - \"3000:3000\"\n    environment:\n      - NODE_ENV=development\n    env_file:\n      - apps/web/.env\n    depends_on:\n      - http-server\n      - signaling-server\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\nnetworks:\n  webrtc_network:\n    driver: bridge\n\nvolumes:\n  mongodb_data:\n```\n\n#### **docker-compose.tunnel.yml** (With Cloudflare Tunnel)\n\n```yaml\nversion: '3.8'\n\nservices:\n  mongodb:\n    image: mongo:7.0\n    container_name: webrtc_mongodb\n    ports:\n      - \"27017:27017\"\n    volumes:\n      - mongodb_data:/data/db\n    environment:\n      - MONGO_INITDB_DATABASE=webrtc_caller\n    networks:\n      - webrtc_network\n\n  http-server:\n    build:\n      context: .\n      dockerfile: apps/http-server/Dockerfile\n    container_name: webrtc_http_server\n    ports:\n      - \"3002:3002\"\n    environment:\n      - NODE_ENV=production\n      - PORT=3002\n      - MONGO_URI=mongodb://mongodb:27017/webrtc_caller\n    env_file:\n      - apps/http-server/.env\n    depends_on:\n      - mongodb\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\n  signaling-server:\n    build:\n      context: .\n      dockerfile: apps/signaling-server/Dockerfile\n    container_name: webrtc_signaling_server\n    ports:\n      - \"8080:8080\"\n    environment:\n      - NODE_ENV=production\n      - PORT=8080\n    env_file:\n      - apps/signaling-server/.env\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\n  web:\n    build:\n      context: .\n      dockerfile: apps/web/Dockerfile\n    container_name: webrtc_web\n    ports:\n      - \"3000:3000\"\n    environment:\n      - NODE_ENV=production\n    env_file:\n      - apps/web/.env\n    depends_on:\n      - http-server\n      - signaling-server\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\n  # Cloudflare Tunnel for Web Frontend\n  cloudflared-web:\n    image: cloudflare/cloudflared:latest\n    container_name: cloudflared_web\n    command: tunnel --no-autoupdate --url http://web:3000\n    depends_on:\n      - web\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\n  # Cloudflare Tunnel for HTTP Server\n  cloudflared-http:\n    image: cloudflare/cloudflared:latest\n    container_name: cloudflared_http\n    command: tunnel --no-autoupdate --url http://http-server:3002\n    depends_on:\n      - http-server\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\n  # Cloudflare Tunnel for Signaling Server\n  cloudflared-signaling:\n    image: cloudflare/cloudflared:latest\n    container_name: cloudflared_signaling\n    command: tunnel --no-autoupdate --url http://signaling-server:8080\n    depends_on:\n      - signaling-server\n    networks:\n      - webrtc_network\n    restart: unless-stopped\n\nnetworks:\n  webrtc_network:\n    driver: bridge\n\nvolumes:\n  mongodb_data:\n```\n\n## 🌐 Cloudflare Tunnel Setup\n\n### What is Cloudflare Tunnel?\n\nCloudflare Tunnel creates a secure outbound connection from your local machine to Cloudflare's network:\n\n```\nUser → Cloudflare Edge → Tunnel → localhost:3000\n```\n\n**Benefits:**\n- ✅ No direct connections to your machine\n- ✅ Your IP stays hidden\n- ✅ WebSockets work automatically\n- ✅ Automatic HTTPS\n\n### Installation\n\n**Windows:**\n```powershell\nwinget install --id Cloudflare.cloudflared\n```\n\n**macOS:**\n```bash\nbrew install cloudflare/cloudflare/cloudflared\n```\n\n**Linux:**\n```bash\ncurl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared\nchmod +x cloudflared\nsudo mv cloudflared /usr/local/bin\n```\n\n**Verify:**\n```bash\ncloudflared --version\n```\n\n### Quick Tunnel Setup (Temporary URLs)\n\nThis is the fastest way to get HTTPS URLs for testing:\n\n```bash\n# Terminal 1 - Web Frontend\ncloudflared tunnel --url http://localhost:3000\n\n# Terminal 2 - HTTP Server\ncloudflared tunnel --url http://localhost:3002\n\n# Terminal 3 - Signaling Server\ncloudflared tunnel --url http://localhost:8080\n```\n\nEach command will output a URL like:\n```\nhttps://random-name-xyz.trycloudflare.com\n```\n\n**📝 Important:** Copy these URLs and update your `.env` files accordingly!\n\n### Permanent Tunnel Setup (Optional)\n\nFor production use with a custom domain:\n\n1. **Login to Cloudflare:**\n```bash\ncloudflared tunnel login\n```\n\n2. **Create a tunnel:**\n```bash\ncloudflared tunnel create webrtc-caller\n```\n\n3. **Create config file `~/.cloudflared/config.yml`:**\n```yaml\ntunnel: \u003ctunnel-id\u003e\ncredentials-file: /path/to/credentials.json\n\ningress:\n  - hostname: app.yourdomain.com\n    service: http://localhost:3000\n  - hostname: api.yourdomain.com\n    service: http://localhost:3002\n  - hostname: signal.yourdomain.com\n    service: http://localhost:8080\n  - service: http_status:404\n```\n\n4. **Route DNS:**\n```bash\ncloudflared tunnel route dns webrtc-caller app.yourdomain.com\ncloudflared tunnel route dns webrtc-caller api.yourdomain.com\ncloudflared tunnel route dns webrtc-caller signal.yourdomain.com\n```\n\n5. **Run tunnel:**\n```bash\ncloudflared tunnel run webrtc-caller\n```\n\n## 🚀 Running the Application\n\n### Option 1: Local Development (Without Docker)\n\n```bash\n# Start MongoDB locally or use MongoDB Atlas\n\n# Terminal 1 - HTTP Server\ncd apps/http-server\npnpm install\npnpm dev\n\n# Terminal 2 - Signaling Server\ncd apps/signaling-server\npnpm install\npnpm dev\n\n# Terminal 3 - Web Frontend\ncd apps/web\npnpm install\npnpm dev\n\n# Terminal 4, 5, 6 - Cloudflare Tunnels (run after services start)\ncloudflared tunnel --url http://localhost:3000\ncloudflared tunnel --url http://localhost:3002\ncloudflared tunnel --url http://localhost:8080\n```\n\n### Option 2: Docker Development\n\n```bash\n# Build and start all services\ndocker-compose -f docker-compose.dev.yml up --build\n\n# In separate terminals, create tunnels\ncloudflared tunnel --url http://localhost:3000\ncloudflared tunnel --url http://localhost:3002\ncloudflared tunnel --url http://localhost:8080\n```\n\n### Option 3: Docker with Integrated Tunnels\n\n```bash\n# Start all services with integrated Cloudflare tunnels\ndocker-compose -f docker-compose.tunnel.yml up --build\n\n# Check logs for tunnel URLs\ndocker logs cloudflared_web\ndocker logs cloudflared_http\ndocker logs cloudflared_signaling\n```\n\n**⚠️ Update Environment Variables:** After getting tunnel URLs, update all `.env` files and restart services.\n\n## 📱 Usage Guide\n\n### Step 1: Create Two Accounts\n\n1. **Account 1:**\n   - Open the web app: `https://your-web-tunnel.trycloudflare.com`\n   - Click \"Sign Up\"\n   - Enter username and password\n   - Complete registration\n\n2. **Account 2:**\n   - Open app in incognito window or different browser\n   - Repeat registration process with different credentials\n\n### Step 2: Create a Room (Host)\n\n1. Login with Account 1\n2. Navigate to `/chatRoom` route\n3. Click \"Create Room\" button\n4. Copy the generated Room ID (e.g., `room-abc123`)\n\n### Step 3: Join the Room (Guest)\n\n1. Login with Account 2 (in separate browser/incognito)\n2. Navigate to \"Join Room\" page\n3. Paste the Room ID from Step 2\n4. Click \"Join Room\"\n\n### Step 4: Start Video Call\n\n- Both users should now see each other's video feeds\n- Camera and microphone will be requested for permission\n- Use the controls to:\n  - 🎤 Mute/unmute microphone\n  - 📹 Enable/disable video\n  - 📞 End call\n\n## 🔍 Troubleshooting\n\n### WebRTC Connection Issues\n\n**Problem:** Video not connecting or black screen\n\n**Solutions:**\n- Verify TURN/STUN credentials in `apps/web/.env`\n- Check Cloudflare tunnels are running and accessible\n- Open browser console (F12) and check for ICE connection errors\n- Ensure browser has camera/microphone permissions\n- Try different browsers (Chrome, Firefox, Safari)\n\n### CORS Errors\n\n**Problem:** CORS policy blocking requests\n\n**Solutions:**\n- Ensure `NEXT_PUBLIC_FRONTEND_URL` exactly matches your web tunnel URL\n- Check that all services use HTTPS URLs from Cloudflare (not HTTP)\n- Verify no trailing slashes in environment variables\n- Restart all services after changing CORS settings\n\n### MongoDB Connection\n\n**Problem:** Cannot connect to MongoDB\n\n**Solutions:**\n- Check MongoDB is running: `docker ps | grep mongo`\n- Verify `MONGO_URI` in environment variables\n- For local MongoDB: ensure port 27017 is not in use\n- For MongoDB Atlas: \n  - Whitelist all IPs (0.0.0.0/0) during development\n  - Check username/password are correct\n  - Verify cluster is running\n\n### Environment Variables Not Loading\n\n**Problem:** Services can't read environment variables\n\n**Solutions:**\n- Ensure `.env` files exist in correct directories:\n  - `apps/web/.env`\n  - `apps/http-server/.env`\n  - `apps/signaling-server/.env`\n- Restart Docker containers after changing `.env`\n- Check for typos in variable names (case-sensitive)\n- Verify no spaces around `=` in `.env` files\n\n### Cloudflare Tunnel Disconnects\n\n**Problem:** Tunnel URLs stop working or become inaccessible\n\n**Solutions:**\n- Quick tunnels are temporary - URLs change on restart\n- Use permanent tunnels for stable testing\n- Check `cloudflared` logs for errors\n- Ensure stable internet connection\n- Try restarting the tunnel\n\n### JWT Authentication Errors\n\n**Problem:** Token validation fails\n\n**Solutions:**\n- Ensure `JWT_SECRET` is identical in both:\n  - `apps/http-server/.env`\n  - `apps/signaling-server/.env`\n- Clear browser cookies and local storage\n- Re-login to generate new tokens\n\n## 📝 Development Tips\n\n1. **Use Docker for consistency** - Same environment across all team members\n2. **MongoDB Atlas for production** - Easier than managing local MongoDB\n3. **Permanent tunnels for team testing** - Stable URLs for shared development\n4. **Environment variable checklist** - Double-check all `.env` files before starting\n5. **Browser DevTools** - Monitor WebRTC connections in Chrome's `chrome://webrtc-internals`\n6. **Test with multiple browsers** - Verify cross-browser compatibility\n\n## 🛠️ Useful Commands\n\n### Docker Commands\n\n```bash\n# Start services\ndocker-compose -f docker-compose.dev.yml up\n\n# Start in background\ndocker-compose -f docker-compose.dev.yml up -d\n\n# Stop all containers\ndocker-compose -f docker-compose.dev.yml down\n\n# Remove all volumes (fresh start)\ndocker-compose -f docker-compose.dev.yml down -v\n\n# Rebuild specific service\ndocker-compose -f docker-compose.dev.yml up --build web\n\n# View logs\ndocker logs webrtc_web -f\ndocker logs webrtc_http_server -f\ndocker logs webrtc_signaling_server -f\n\n# Check running containers\ndocker ps\n\n# Execute command in container\ndocker exec -it webrtc_web sh\n```\n\n### Development Commands\n\n```bash\n# Install dependencies\npnpm install\n\n# Run specific service\ncd apps/web \u0026\u0026 pnpm dev\ncd apps/http-server \u0026\u0026 pnpm dev\ncd apps/signaling-server \u0026\u0026 pnpm dev\n\n# Build for production\npnpm build\n\n# Clean install\nrm -rf node_modules\npnpm install --frozen-lockfile\n```\n\n## 🔒 Security Considerations\n\n- **Never commit `.env` files** - Add them to `.gitignore`\n- **Use strong JWT secrets** - Generate random strings (32+ characters)\n- **MongoDB security** - Use authentication in production\n- **TURN server credentials** - Rotate regularly\n- **Rate limiting** - Implement on signaling server for production\n\n## 📊 Architecture Overview\n\n```\n┌─────────────────┐\n│   Web Browser   │\n│   (Next.js)     │\n└────────┬────────┘\n         │\n         ├──── HTTP ────► ┌──────────────────┐\n         │                │  HTTP Server     │\n         │                │  (Express API)   │\n         │                └────────┬─────────┘\n         │                         │\n         └── WebSocket ──► ┌───────▼─────────┐\n                           │ Signaling Server│\n                           │  (Socket.io)    │\n                           └────────┬────────┘\n                                    │\n                            ┌───────▼────────┐\n                            │    MongoDB     │\n                            └────────────────┘\n```\n\n## 📚 Additional Resources\n\n- [WebRTC Documentation](https://webrtc.org/getting-started/overview)\n- [Cloudflare Tunnel Docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/)\n- [Socket.io Documentation](https://socket.io/docs/v4/)\n- [Next.js Documentation](https://nextjs.org/docs)\n- [pnpm Documentation](https://pnpm.io/)\n\n## 🤝 Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch\n3. Commit your changes\n4. Push to the branch\n5. Open a Pull Request\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbhatvinay7%2Fcaller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbhatvinay7%2Fcaller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbhatvinay7%2Fcaller/lists"}