Group Video Conferencing on Website: WebRTC, LiveKit, React

Note: when 50 people participate in a webinar, audio latency becomes noticeable (over 500 ms), and video may freeze. A typical P2P solution with 50 peers creates 1225 connections — a heavy load on both client and network. We faced this: a client lost 20% of their audience due to drops. To avoid such

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1284
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1240
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    982
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    1031
  • image_website-sbh_0.webp
    Website development for SBH Partners
    1104
  • image_website-_0.webp
    Website development for Red Pear
    553

Note: when 50 people participate in a webinar, audio latency becomes noticeable (over 500 ms), and video may freeze. A typical P2P solution with 50 peers creates 1225 connections — a heavy load on both client and network. We faced this: a client lost 20% of their audience due to drops. To avoid such problems, we use the SFU server LiveKit, which reduces latency to 150 ms and scales to 1000+ participants. We integrate group video conferences and embed video chat on websites with 3–50+ participants, microphone/camera management, breakout rooms, chat, screen sharing, and recording. This is an embeddable system built on React and LiveKit, ready for production. Such architecture ensures low latency and high quality even with weak internet. Our solutions are already used in educational platforms, telemedicine, and corporate portals.

LiveKit is an open platform with SFU architecture, providing 2x lower latency compared to Janus under the same load.

How to scale a video conference using SFU?

The choice of infrastructure depends on the number of simultaneous participants. Compare two approaches:

Parameter P2P (Peer-to-Peer) SFU (Selective Forwarding Unit)
Maximum participants up to 4–6 up to 1000+
Latency 100–200 ms 150–300 ms
Client load high (each device processes N streams) low (one stream from SFU)
Simulcast not supported supported
Efficiency at 50 participants 10 points (poor) 100 points (excellent)

For most projects, LiveKit is optimal. We use it in production and guarantee stability.

Why does Simulcast improve video quality?

Simulcast — publishing multiple video streams of different quality (high/medium/low). LiveKit does this automatically. The subscriber receives the layer matching their bandwidth and tile size. Without Simulcast, video jerks or pixelates on weak networks. Our experience shows: Simulcast is 2.5 times more efficient than standard encoding on weak networks.

// Explicitly set quality for a specific participant participant.setTrackSubscriptionPermissions(true, [ { trackSid: videoTrack.sid, quality: VideoQuality.MEDIUM } ]); 

How to implement participant management via API?

The host can mute a microphone or remove a participant via the server API. Example endpoints:

// Mute a specific participant (at host request) app.post('/api/conferences/:roomName/mute/:participantId', authenticate, async (req, res) => { const conference = await db.conferences.findByRoomName(req.params.roomName); if (conference.hostId !== req.user.id) return res.status(403).end(); await svc.mutePublishedTrack( req.params.roomName, req.params.participantId, 'microphone-track', true ); // Notify via Data channel await svc.sendData( req.params.roomName, Buffer.from(JSON.stringify({ type: 'muted_by_host', targetId: req.params.participantId })), [req.params.participantId] ); res.json({ ok: true }); }); // Remove a participant app.delete('/api/conferences/:roomName/participants/:participantId', authenticate, async (req, res) => { await svc.removeParticipant(req.params.roomName, req.params.participantId); res.json({ ok: true }); }); 

Implementing breakout rooms

Breakout rooms — separate rooms for small groups. We create them programmatically and send invitations via Data channel:

async function createBreakoutRooms(mainRoomName: string, groups: string[][]) { const breakoutRooms = await Promise.all( groups.map((group, i) => createConference(`${mainRoomName}-breakout-${i}`, { maxParticipants: group.length + 2 }) ) ); for (let i = 0; i < groups.length; i++) { for (const participantId of groups[i]) { const token = generateParticipantToken( `conf-${mainRoomName}-breakout-${i}`, participantId, '', 'participant' ); await svc.sendData( `conf-${mainRoomName}`, Buffer.from(JSON.stringify({ type: 'breakout_invite', token, roomIndex: i })), [participantId] ); } } } 

How to integrate LiveKit in 5 steps

  1. Install server and client packages:
npm install livekit-server-sdk # server npm install @livekit/components-react livekit-client # client 
  1. Configure the server: create API keys and URL (e.g., wss://your-domain.com).
  2. Create a room via RoomServiceClient.createRoom().
  3. Generate a token for the participant with required permissions.
  4. Connect the client: use LiveKitRoom from @livekit/components-react.

Example of creating a conference:

import { RoomServiceClient, AccessToken, RoomOptions } from 'livekit-server-sdk'; const svc = new RoomServiceClient( process.env.LIVEKIT_URL!, process.env.LIVEKIT_API_KEY!, process.env.LIVEKIT_API_SECRET! ); async function createConference(conferenceId: string, options: { maxParticipants?: number; enableRecording?: boolean; }): Promise<void> { await svc.createRoom({ name: `conf-${conferenceId}`, maxParticipants: options.maxParticipants ?? 50, emptyTimeout: 300, metadata: JSON.stringify({ conferenceId, createdAt: new Date().toISOString() }), } as RoomOptions); } function generateParticipantToken( roomName: string, userId: string, displayName: string, role: 'host' | 'moderator' | 'participant' | 'viewer' ): string { const at = new AccessToken( process.env.LIVEKIT_API_KEY!, process.env.LIVEKIT_API_SECRET!, { identity: userId, name: displayName, ttl: 4 * 60 * 60 } ); at.addGrant({ roomJoin: true, room: roomName, canPublish: role !== 'viewer', canSubscribe: true, canPublishData: true, roomAdmin: role === 'host', hidden: false, }); return at.toJwt(); } 

What is included in the work

  • Conference architecture: SFU selection, Simulcast setup, Data channel design.
  • UI development in React with LiveKit components: participant grid, control panel, chat, raise hand button.
  • Server side: room creation and management, authentication, roles (host/moderator/participant/viewer).
  • Integration of recording and breakout rooms (optional).
  • API and deployment documentation.
  • Load testing up to 50 participants.
Additional: option with HLS streaming for 1000+ participants

If you need broadcasting to a large audience (1000+), we use HLS streaming instead of WebRTC. LiveKit supports HLS output via its Egress API. Viewers only need an HLS.js player — 15 to 30 seconds latency, but no limit on connection count.

Timelines and Cost

Basic group conference with LiveKit and React — from 1 week. With breakout rooms, raise hand, recording, and management — 2–3 weeks. Cost is calculated individually based on the scope of work and necessary customizations. Bandwidth savings thanks to Simulcast reach 40% compared to standard encoding. Contact us — we'll find the best solution for your budget. Get a consultation on implementation.

Typical mistakes and their solutions

Mistake Consequences Solution
Using P2P for 50+ participants High latency, drops Implement SFU (LiveKit)
Ignoring Simulcast Video stuttering on weak channels Enable Simulcast by default
No role management Unable to mute noise Implement roles and server-side moderation
Poor raise hand UX Host doesn't see volunteers Use Data channel and raised-hand list

We have over 5 years of experience in WebRTC development and have completed more than 50 projects for conferences and live streams. Contact us — we'll help embed video communication on your site.