Quarum (P2P MVP)

Automatic WebRTC handshake via tiny WebSocket relay. Chat & files go P2P over DataChannels.

Connect

Your ID: disconnected
Use the same Room ID in two browsers/devices.

Chat

Diagnostics


  
``` **What changed (and why it fixes your logs):** * **WS first, then PC** — prevents offers being sent before the socket is ready. * **Perfect Negotiation** with a deterministic `polite` role (based on `peerId`) — you don’t need Host/Join buttons. * **ICE queueing** — candidates received before `setRemoteDescription` are buffered and applied later, avoiding the “remote description was null” errors you saw. * **Single DataChannel creator (impolite side)** — avoids duplicate channels and extra renegotiations. Open two tabs/devices, enter the **same room**, click **Join Room** on both. You should see `desc` relayed on the server, then `ice-candidate` both ways, and the chat connect.