Live Stage Roles

Stage mode turns a room into a panel or AMA: a few speakers publish media, everyone else joins as receive-only audience and can raise a hand to be promoted. Stage mode is a roles and control layer, you compose it, the platform does not impose a meeting format.

Scale. The live call is a peer-to-peer WebRTC mesh, the platform relays signaling and never routes media. Stage mode therefore suits panels and small-to-medium audiences. A large broadcast-scale audience needs a media server (SFU), which is outside the current platform scope.

Roles

  • Host, the room host. Controls the stage, promotes and demotes, fields questions.
  • Speaker, publishes audio/video. Hosts join as speakers.
  • Audience, receive-only by convention, your app simply does not publish a local track for an audience member. Can raise a hand and submit text questions.

How it works

  1. Create a room with policy.stageMode on. Joining hosts get the SPEAKER role, everyone else AUDIENCE.
  2. An audience member calls raiseHand(callId), the host and co-hosts receive GROUP_CALL_STAGE_HAND_RAISED.
  3. The host calls promoteToSpeaker(callId, userId) (or demoteToAudience). The platform broadcasts GROUP_CALL_ROLE_CHANGED with the new role to every participant.
  4. Audience can call submitStageQuestion(callId, text), relayed to the stage's speakers.
  5. Your app reacts to GROUP_CALL_ROLE_CHANGED by publishing or dropping its local media track. The platform signals roles, your app owns the WebRTC tracks.

Example

const room = await client.createRoom({
  name: 'AMA',
  policy: { stageMode: true, requireHost: true },
});
const callId = await client.joinRoom(room.roomId);

// Audience
client.raiseHand(callId);
client.submitStageQuestion(callId, 'How does key rotation work?');

// Host
client.onGroupCallEvent((e) => {
  if (e.type === 'GROUP_CALL_STAGE_HAND_RAISED') client.promoteToSpeaker(callId, e.payload);
  if (e.type === 'GROUP_CALL_ROLE_CHANGED')      updateStageUi(e.payload);
});

Verify support via GET /api/info, the features array includes "live_stage". Requires SDK 0.15.0+ on JavaScript, Android, and iOS.