Building Voicer — a low-latency WebRTC voice room
July 18, 2026·8 min read·
#WebRTC#Node.js#System Design
How I designed signaling, NAT traversal and role-based rooms inspired by Clubhouse.
The problem
Real-time voice at scale is hard. Signaling, NAT, congestion — everything must dance in sub-200ms.
Architecture
Signaling on Socket.io, media on WebRTC PCs, TURN servers for the 20% of users behind symmetric NAT.
// simple offer/answer flow
const pc = new RTCPeerConnection(config);
pc.onicecandidate = (e) => socket.emit('ice', e.candidate);
Learnings
- Keep signaling stateless where possible
- Roll room state through Redis
- Measure jitter, not just latency
Written by Manish Patidar