Full-stack engineer
Conflux — Peer-to-Peer Video Meetings
- Role
- Full-stack engineer
- Built with
- React · WebRTC · Socket.IO · Node.js · Express · MongoDB · MUI · Web Speech API · Claude API

A browser-native video conferencing app where media travels directly between participants and the server only relays signalling. The interesting part is not getting video onto the screen but everything after it: reading getStats() so a degrading call can be diagnosed rather than guessed at, restarting ICE when someone’s network changes under them, and swapping tracks so muting and screen sharing never renegotiate the connection. Live captions feed a transcript that an LLM turns into decisions and action items.
Problem
Video call tutorials stop at ‘video appears’, which is the easy half. Real calls degrade in ways the happy path never exercises: a laptop moves between networks and the ICE connection fails with no recovery, muting re-acquires the media stream and forces a renegotiation that stutters everyone’s video, and when quality drops nobody on the call can tell whether the cause is bandwidth, packet loss, or media being forced through a relay. The practical question is what a call actually needs beyond the first successful handshake to survive a real network — and how to surface that to the person on the call instead of burying it in chrome://webrtc-internals.
Approach
Conflux is a WebRTC mesh: every browser opens a direct peer connection to every other, and the Node and Socket.IO backend only relays SDP, ICE candidates, and presence. Muting toggles track.enabled rather than re-running getUserMedia, and screen share and background blur swap the outgoing track through replaceTrack, so none of the three renegotiate the call. A diagnostics panel samples RTCPeerConnection.getStats() every two seconds for bitrate, packet loss, round-trip time, jitter, codec and whether media is going direct or through a TURN relay, and rates each peer green, amber or red; a failed ICE connection triggers an automatic restart so a network change recovers without a reload. Captions run on the browser’s own Web Speech API — no audio leaves for a service I operate — and the transcript they build is summarised by Claude into key points, decisions and owned action items, as an optional feature that hides itself when no API key is configured.
Screens


Media and signalling topology

Describe the diagram
The Conflux system, split by what travels where. Across the top, two browser clients, each a React app holding the MediaStream API and an RTCPeerConnection; between them a single direct link carrying audio, video and DataChannel traffic as SRTP over UDP. That link never touches the server. Below each client, a WebSocket to the Express and Socket.IO hub in the centre — one side sending SDP offers, the other answers, both exchanging ICE candidates and chat. The hub runs two surfaces: a WebSockets signalling engine for the offer/answer and ICE exchange plus real-time chat, presence, captions and reactions, and a REST API for user auth, session logs and AI summary triggers. It writes user profiles and session history to MongoDB over Mongoose. On the right, the Claude API sits behind a dashed HTTP POST arrow, labelled an optional integration, providing summarisation and call insights.