BlindParty - P2P Watch Party & Video Call

BlindParty - P2P Watch Party & Video Call


📌 Overview

BlindParty is a P2P watch party and video calling app for small groups — camera, mic, screen sharing, and chat, all flowing directly between browsers. No accounts, no recordings, no server-side state beyond the signaling handshake.

While it shares BlindShare’s “zero-persistence signaling” ethos, BlindParty is a separate product with its own signaling protocol — BlindShare’s room model is strictly 2-peer; BlindParty runs a full N-peer mesh.

👉 Try it live: party.blindshare.in


🎉 What You Can Do

  • Watch Party — share your screen, tab, or window; everyone in the room watches P2P in real time.
  • Video Call — camera + mic grid for all participants, mute/camera toggles, per-peer connection indicators.
  • Group Chat — ephemeral text sidebar fanned out over each participant’s RTCDataChannel — never touches the server.
  • Room Lifecycle — rooms persist while at least one person remains; anyone can start or stop screen share mid-call.

⚠️ DRM limitation: Watch parties do not work for Netflix, Hotstar, Prime Video, or any platform using HDCP/output-protection. It works great for local video files, YouTube, games, slides, and general screen sharing.


🏗️ Architecture — Full Mesh

BlindParty maintains one RTCPeerConnection per other participant. For a 4-person room, each client manages 3 connections.

           ┌──── Signaling Server ────┐
           │  Node.js + ws            │
           │  Room roster by peer ID  │
           │  Targeted offer/answer   │
           │  relay (not broadcast)   │
           └──────────────────────────┘
                ▲   ▲   ▲   ▲
                │   │   │   │ (SDP + ICE only)
           ┌────┘   │   │   └────┐
         Peer A   Peer B   Peer C  Peer D
           │ ←──────────────────→ │
           │ ←──────────→         │
           │                ←────→│
           └─── full mesh, P2P ───┘
              (DTLS-encrypted media + data)

Max room size: 6 peers — mesh topology doesn’t scale linearly; a real SFU (mediasoup/LiveKit) would be needed for larger rooms.


🔁 Renegotiation-Capable WebRTC

Unlike BlindShare’s simpler one-shot connections, BlindParty’s useGroupWebRTC hook supports mid-call renegotiation — adding or removing camera, mic, or screen-share tracks after the call has started without dropping connections.


🚀 Tech Stack

LayerStack
FrontendReact + Vite + TailwindCSS (TypeScript)
WebRTCRTCPeerConnection (per peer), RTCDataChannel, MediaStream, getDisplayMedia
SignalingNode.js + ws — N-peer rooms, targeted relay, persistent-while-occupied
DeploymentFrontend on Cloudflare (party.blindshare.in) · Signaling on Faable

📎 References