Skip to content

Replacing Zoom with a streaming stack we ran ourselves

Geniebook · Software Engineer III · Nov 2021 — Aug 2025

Migrated live classes off the Zoom SDK onto self-hosted LiveKit with a purpose-built React client, sustaining 99.9%+ streaming uptime for over a year.

  • LiveKit
  • React
  • TypeScript
  • WebRTC

Context

Zoom's SDK worked, and reliability was not the problem. The constraint was the classroom itself: live classes needed interaction built around how a lesson actually runs, and the SDK's interface was the one surface the product team could not reshape. Every idea for making a class more engaging had to fit a meeting UI that was never designed for teaching.

Decisions

Keep buying live video from Zoom's SDK, or run the streaming stack in-house?

Chosen

Self-hosted LiveKit with a purpose-built React live-class client

Owning the client put the classroom interface under the product team's control. Interactivity could then be designed for the lesson and tried, measured, and changed on the product's own schedule, rather than being limited to what a general-purpose meeting UI exposed.

Rejected alternatives

  • Remaining on the Zoom SDK

    It was a capable product, but its interface set the ceiling on what the class could be. Staying meant the experiments that make a class more engaging stayed off the table.

Outcomes

Every figure below is shown with what it measures.

Measured outcomes: Replacing Zoom with a streaming stack we ran ourselves
OutcomeResultHow it was measured
Streaming uptimeSustained≥99.9%Sustained for 12+ months following launch.
Concurrent students servedScale~1,500(approx.)~30 simultaneous classes at ~50 students each.

Architecture

Live-class streaming topology after the migration

A teacher and roughly fifty students per class connect over WebRTC to a self-hosted LiveKit media server, which forwards media between them. Around thirty such classes run at once, totalling about 1,500 concurrent students. Both teacher and students use the same purpose-built React client, which talks to the class platform for room state and interaction features alongside the media path. The boundary worth reading is that the client and the media server are both inside the system Geniebook operates, which is what made the classroom interface open to change.