Live cohort classes that record themselves.
Embed LevelChat into your LMS to run live classrooms — with persistent room links, host controls, and a recorded archive that ships within minutes of the session ending.
The problem
EdTech platforms need a Zoom-shaped meeting (mute-on-entry, raised hand, host controls, recorded archive) without Zoom-shaped per-host pricing. The off-the-shelf options either bill per host (10x your enrolment) or rebuild the entire pedagogy stack.
How LevelChat fits
Mint a host token from your LMS backend, embed @levelchat/web-react in the student page, start a recording when the host arrives, and surface the playback URL via the recording.ready webhook. Recording transcoding runs out-of-band, so the student dashboard shows the replay roughly 60 seconds after the host clicks End.
Reference architecture
LMS server ── mint token ──▶ POST /v1/auth/tokens/room
│
▼
Student browser ◀── join URL ── @levelchat/web-react (LevelChatProvider)
│ │
│ ▼
│ wss://app.levelchat.io/v1/rtc/signal
│ │
▼ ▼
<VideoTile> recording-svc ──── recording.ready ──▶ LMS webhook
│
▼
playback URLIntegration snippet
Real code against published packages — no phantom imports.
'use client';
import {
LevelChatProvider,
useLocalParticipant,
useRoom,
VideoTile,
} from '@levelchat/web-react';
export default function Classroom({ token, isHost }: { token: string; isHost: boolean }) {
return (
<LevelChatProvider token={token}>
<ClassroomSurface isHost={isHost} />
</LevelChatProvider>
);
}
function ClassroomSurface({ isHost }: { isHost: boolean }) {
const { participants, room } = useRoom();
const { toggleCamera, toggleMic } = useLocalParticipant();
// Hosts kick off a recording when they arrive; the recording.ready
// webhook fires on your LMS backend ~60s after the session ends.
React.useEffect(() => {
if (!isHost || !room) return;
void room.record({
compose: 'speaker',
format: { output: 'mp4_av1', alsoGenerateHls: true },
});
}, [isHost, room]);
return (
<div className="grid grid-cols-3 gap-4">
{participants.map((p) => (
<VideoTile key={p.id} participant={p} />
))}
</div>
);
}Common questions for this vertical
How do students see the recording after class?
The recording.ready webhook fires on your LMS backend with a presigned HLS URL (5-min TTL by default; configurable). Store it on your assignment / lesson row and render an HLS player in the student dashboard.
Can we run breakout rooms?
Breakouts are on the roadmap (Preview, W9.5). Today the supported pattern is: end the main room, mint sub-room tokens client-side from your LMS, and have students rejoin the appropriate sub-room URL. The host can pull everyone back the same way.
How much does a 50-student / 90-minute session cost?
On the Pro tier (50 × 90 = 4,500 participant-minutes), well within the 75,000-minute bundle. The /pricing calculator gives an exact estimate including recording storage.