Meeting Room
The Meeting Room plugin (Meeting) provides professional video conferencing capabilities for Monibuca V6. Suitable for online meetings, remote collaboration, training sessions, and other scenarios.
Core Features
Section titled “Core Features”- Multi-participant Video Conferencing: Support 50+ concurrent participants
- Meeting Management:
- Agenda management (Agenda)
- Meeting timer and speaker timer
- Raise Hand feature
- Lobby (waiting room) control
- Real-time Transcription: Automatic speech-to-text (requires external ASR service)
- AI Intelligence Services:
- Automatic meeting minutes generation
- Extract action items from transcription
- Meeting decision summaries
- Recording and Control:
- Meeting recording (MP4 format)
- Screen sharing
- Host permission control
- Participant Management: Kick, mute, lock room, ban
How to Enable
Section titled “How to Enable”features = ["meeting"]
# Meeting plugin depends on Room Service# room feature is automatically enabledArchitecture Design
Section titled “Architecture Design”graph TB subgraph Meeting["MeetingPlugin"] SM["SessionManager<br/>Meeting info, participants"] Agenda["AgendaManager<br/>Agenda control"] Trans["TranscriptionManager<br/>Real-time transcription"] AI["AIService<br/>Summary & Task Extraction"] Record["RecordingManager<br/>Recording control"] Lobby["LobbyManager<br/>Waiting room"] DB["Data Persistence<br/>Meetings, agenda, transcription"] end
subgraph RS["Room Service"] Room["Room Management<br/>Host + Participants"] WS["WebSocket<br/>Signaling"] API["RoomApi"] end
subgraph Media["Media Layer"] WHIP["WebRTC WHIP<br/>Publish"] WHEP["WebRTC WHEP<br/>Subscribe"] ASR["ASR Service<br/>Speech Recognition"] end
Meeting -->|register_callbacks| RS SM --> DB Agenda --> DB Trans --> AI Trans --> DB Record --> Media Lobby --> API Room --> API API -->|set_room_locked<br/>set_lobby_enabled| Meeting WS --> Meeting WHIP --> Media WHEP --> Media Trans -->|Real-time push| ASRMeeting Lifecycle
Section titled “Meeting Lifecycle”Scheduled → Starting → Active → Paused → Ended| Status | Description |
|---|---|
Scheduled | Meeting scheduled, waiting to start |
Starting | Lobby is admitting participants |
Active | Meeting in progress |
Paused | Meeting paused |
Ended | Meeting ended |
Signaling Protocol
Section titled “Signaling Protocol”Meeting Basic Signaling
Section titled “Meeting Basic Signaling”| Action | Direction | Description |
|---|---|---|
start_meeting | C→S | Host starts meeting |
end_meeting | C→S | Host ends meeting |
pause_meeting | C→S | Host pauses meeting |
resume_meeting | C→S | Host resumes meeting |
Participant Control Signaling
Section titled “Participant Control Signaling”| Action | Direction | Description |
|---|---|---|
mute_participant | C→S | Host mutes participant |
unmute_participant | C→S | Host unmutes participant |
kick_participant | C→S | Host kicks participant |
raise_hand | C→S | Participant raises hand |
lower_hand | C→S | Participant lowers hand |
participant_muted | S→C | Participant muted notification |
participant_kicked | S→C | Participant kicked notification |
hand_raised | S→C | Hand raised notification (broadcast) |
Agenda Signaling
Section titled “Agenda Signaling”| Action | Direction | Description |
|---|---|---|
update_agenda | C→S | Update current agenda item |
next_agenda | C→S | Move to next agenda item |
agenda_changed | S→C | Agenda change notification (broadcast) |
Transcription and Recording Signaling
Section titled “Transcription and Recording Signaling”| Action | Direction | Description |
|---|---|---|
start_transcription | C→S | Start real-time transcription |
stop_transcription | C→S | Stop real-time transcription |
transcription_result | S→C | Transcription result push |
start_recording | C→S | Start recording |
stop_recording | C→S | Stop recording |
Lobby Signaling
Section titled “Lobby Signaling”| Action | Direction | Description |
|---|---|---|
toggle_lobby | C→S | Toggle lobby on/off |
admit_user | C→S | Admit user to join |
reject_user | C→S | Reject user from joining |
user_pending | S→C | User in lobby notification (broadcast) |
Room Lock Signaling
Section titled “Room Lock Signaling”| Action | Direction | Description |
|---|---|---|
lock_room | C→S | Lock room (prevent new users) |
unlock_room | C→S | Unlock room |
Agenda Management
Section titled “Agenda Management”Agenda Structure
Section titled “Agenda Structure”{ "meeting_id": "meeting_001", "agenda": [ { "id": "agenda_1", "title": "Opening Remarks", "speaker": "Host", "duration": 5, // minutes "order": 1 }, { "id": "agenda_2", "title": "Business Update", "speaker": "Department Lead", "duration": 20, "order": 2 }, { "id": "agenda_3", "title": "Q&A Session", "speaker": "All Participants", "duration": 10, "order": 3 } ], "current_agenda_id": "agenda_2"}Update Agenda
Section titled “Update Agenda”{ "action": "update_agenda", "agenda": [ { "title": "Opening Remarks", "speaker": "Host", "duration": 5 } ]}Participant Management
Section titled “Participant Management”Mute Participant
Section titled “Mute Participant”{ "action": "mute_participant", "target_user_id": "user_005", "mute_audio": true, // Mute microphone "mute_video": false // Keep camera on}Host Permissions
Section titled “Host Permissions”Host has the following permissions:
- Start/end/pause meeting
- Mute/unmute participants
- Kick out participants (force exit)
- Control lobby (admit/reject)
- Lock/unlock room
- Start/stop recording
- Start/stop transcription
Raise Hand System
Section titled “Raise Hand System”Participants can raise hands to request to speak. The host can see the raise hand queue:
{ "action": "raise_hand"}Real-time Transcription
Section titled “Real-time Transcription”Transcription Flow
Section titled “Transcription Flow”┌──────────────────┐│ Participant Mic │└────────┬─────────┘ │ RTC Audio ↓ ┌─────────────┐ ┌──────────────┐ │ AudioBuffer │────────→│ ASR Service │ └─────────────┘ │ (External) │ └──────┬───────┘ │ Recognition Result ↓ ┌─────────────────┐ │ TranscriptionDB │ └─────────────────┘ │ ↓ ┌────────────────────┐ │ WebSocket Push │ │ to All │ │ Participants │ └────────────────────┘Start Transcription
Section titled “Start Transcription”{ "action": "start_transcription", "language": "en-US" // Language code}Transcription Result Format
Section titled “Transcription Result Format”{ "action": "transcription_result", "speaker_id": "user_003", "speaker_name": "John", "text": "Our sales grew 25% in the first half", "is_final": true, // true: sentence complete, false: interim result "timestamp": "2024-01-15T10:35:00Z"}AI Intelligence Services
Section titled “AI Intelligence Services”Meeting Minutes
Section titled “Meeting Minutes”AI automatically generates minutes after meeting ends:
{ "meeting_id": "meeting_001", "title": "2024 Q1 Summary Meeting", "date": "2024-01-15", "duration": "2 hours 15 minutes", "participants": ["Host", "John", "Jane"], "summary": "This meeting reviewed Q1 performance and set Q2 targets...", "key_points": [ "Sales growth of 25% year-over-year", "Market share increased by 5 percentage points", "3 new product lines launched" ], "action_items": [ { "item": "Complete market research report", "owner": "Marketing", "deadline": "2024-01-31" }, { "item": "Optimize customer service process", "owner": "Operations", "deadline": "2024-02-15" } ]}Task Extraction
Section titled “Task Extraction”Automatically extract action items from transcription:
Transcription: "John, can you complete the client requirements analysis by next Friday?"
Extracted task:{ "item": "Complete client requirements analysis", "owner": "John", "deadline": "2024-01-19", // Next Friday "priority": "high"}Lobby (Waiting Room)
Section titled “Lobby (Waiting Room)”Enable Lobby
Section titled “Enable Lobby”{ "action": "toggle_lobby", "enable": true}Lobby Flow
Section titled “Lobby Flow”User tries to join → Enter lobby → Host reviews → Admit/RejectAdmit User
Section titled “Admit User”{ "action": "admit_user", "target_user_id": "user_008"}Reject User
Section titled “Reject User”{ "action": "reject_user", "target_user_id": "user_008"}Screen Sharing
Section titled “Screen Sharing”Enable Screen Share
Section titled “Enable Screen Share”{ "action": "share_screen"}Participants select the screen or window to share via browser API. The system automatically handles shared content as a separate media track.
Recording
Section titled “Recording”In-session start / stop recording is driven by WebSocket room signaling and RoomApi (see the signaling and architecture sections above). There is no standalone HTTP path such as POST /meeting/.../recording/start, which would break the global {plugin}/api convention.
Like other plugins, Meeting HTTP REST is under /meeting/api/... (engine prefix meeting/api). To list recording entries over HTTP:
curl http://localhost:8080/meeting/api/recordings(The list may be empty until persistence is fully wired; per-recording play, download, and DELETE are documented under HTTP API — Meeting REST, aligned with repo docs/http-api.md §14.2.)
HTTP API
Section titled “HTTP API”Base path: http(s)://<host>:<port>/meeting/api. Do not use the legacy /room/meeting/... prefix, and do not omit the api segment (e.g. /meeting/rooms is not the registered REST prefix).
List meeting rooms
Section titled “List meeting rooms”curl http://localhost:8080/meeting/api/roomsCreate meeting room
Section titled “Create meeting room”curl -X POST http://localhost:8080/meeting/api/rooms \ -H "Content-Type: application/json" \ -d '{"room_id":"room-demo-1"}'List reservations
Section titled “List reservations”curl http://localhost:8080/meeting/api/reservationsCreate reservation
Section titled “Create reservation”curl -X POST http://localhost:8080/meeting/api/reservations \ -H "Content-Type: application/json" \ -d '{ "room_id": "room-1", "room_name": "Weekly standup", "host_user_id": "u1", "host_user_name": "Host", "start_time": "2026-04-21T10:00:00+08:00", "duration_minutes": 60, "timezone": "Asia/Shanghai", "participants": ["u2"], "has_password": false, "mute_all": false, "mute_video_all": false }'Templates: list / create
Section titled “Templates: list / create”curl http://localhost:8080/meeting/api/templatescurl -X POST http://localhost:8080/meeting/api/templates \ -H "Content-Type: application/json" \ -d '{ "name": "Default template", "description": null, "max_participants": 50, "default_password": null, "auto_record": false, "auto_lock": false, "enabled": true, "sort_order": 0 }'Stats and registered features
Section titled “Stats and registered features”curl http://localhost:8080/meeting/api/statscurl http://localhost:8080/meeting/api/featuresLock/unlock, mute/kick, and per-recording URLs are listed under HTTP API — Meeting REST (same content as repo docs/http-api.md §14.2). Agenda, transcription, and minutes are primarily WebSocket features; they are not exposed as GET /meeting/meetings/... in the current engine HTTP surface.
Database Persistence
Section titled “Database Persistence”Meeting Sessions Table meeting_sessions
Section titled “Meeting Sessions Table meeting_sessions”| Field | Type | Description |
|---|---|---|
id | string | Meeting ID |
title | string | Meeting title |
organizer_id | string | Organizer ID |
status | enum | Meeting status |
start_time | timestamp | Start time |
end_time | timestamp | End time |
participant_count | int | Participant count |
recording_file | string | Recording file path |
Agenda Table meeting_agenda
Section titled “Agenda Table meeting_agenda”| Field | Type | Description |
|---|---|---|
id | string | Agenda ID |
meeting_id | string | Meeting ID |
title | string | Agenda title |
speaker | string | Speaker |
duration | int | Duration (seconds) |
order | int | Order |
Transcription Table meeting_transcription
Section titled “Transcription Table meeting_transcription”| Field | Type | Description |
|---|---|---|
id | string | Transcription ID |
meeting_id | string | Meeting ID |
speaker_id | string | Speaker ID |
text | text | Transcription content |
timestamp | timestamp | Timestamp |
language | string | Language |
Configuration Reference
Section titled “Configuration Reference”meeting: # Basic configuration max_participants: 50 # Maximum participants session_timeout: 7200 # Meeting timeout (seconds)
# Lobby enable_lobby: true # Enable lobby lobby_timeout: 300 # Lobby timeout (seconds)
# Recording enable_recording: true # Enable recording recording_format: "mp4" # Recording format recording_dir: "./recordings"
# Transcription enable_transcription: false # Enable transcription (requires ASR service) asr_service_url: "" # ASR service URL transcription_language: "en-US"
# AI Service enable_ai_summary: false # Enable AI summary ai_service_url: "" # AI service URL
# Timer timer: max_duration: 7200 # Maximum meeting duration (seconds) warning_before_end: 300 # Warning before end (seconds) enable_agenda_timer: true # Enable agenda timerWeb-SDK Integration
Section titled “Web-SDK Integration”Basic Connection
Section titled “Basic Connection”const room = document.getElementById('room') as MbRoom;const publisher = document.getElementById('publisher') as MbPublisher;
// Connect to meeting roomroom.setAttribute('ws-url', 'ws://localhost:8080/room?type=meeting');room.setAttribute('room-id', 'meeting_001');
// Enable audio/videoawait publisher.startCapture({ audio: true, video: true });await publisher.startPublish();Host Controls
Section titled “Host Controls”const room = document.getElementById('room') as MbRoom;
// Start meetingroom.sendMessage({ action: 'start_meeting'});
// Mute participantroom.sendMessage({ action: 'mute_participant', target_user_id: 'user_005', mute_audio: true});
// Enable lobbyroom.sendMessage({ action: 'toggle_lobby', enable: true});Real-time Transcription
Section titled “Real-time Transcription”// Start transcriptionroom.sendMessage({ action: 'start_transcription', language: 'en-US'});
// Listen for transcription resultsroom.addEventListener('transcription_result', (event) => { console.log(`${event.speaker_name}: ${event.text}`); // Display in transcription panel in real-time});Screen Sharing
Section titled “Screen Sharing”const publisher = document.getElementById('publisher') as MbPublisher;
// Start screen sharingawait publisher.startScreenShare();
// Stop screen sharingawait publisher.stopScreenShare();Demo Project
Section titled “Demo Project”Complete Meeting Room Demo is located at web-sdk/packages/demo/meeting/:
meeting/├── src/│ ├── pages/│ │ ├── Lobby/index.tsx # Meeting list│ │ ├── MeetingRoom/index.tsx # Meeting room│ │ └── Waiting/index.tsx # Waiting room│ ├── components/│ │ ├── VideoGrid/index.tsx # Video grid│ │ ├── Transcription/index.tsx # Real-time transcription panel│ │ ├── Agenda/index.tsx # Agenda panel│ │ ├── Participants/index.tsx # Participant list│ │ └── Controls/index.tsx # Control bar│ ├── services/api.ts # API wrapper│ └── types/index.ts # Type definitions├── package.json # port: 5475└── vite.config.tsStart Demo
Section titled “Start Demo”cd web-sdk/packages/demo/meetingpnpm installpnpm dev# Visit http://localhost:5475Meeting Join Link
Section titled “Meeting Join Link”http://localhost:5475?meeting_id=meeting_001&user_id=user_123&role=participantMobile Adaptation
Section titled “Mobile Adaptation”Demo automatically detects device type. For mobile devices:
- Responsive video grid (max 4 videos)
- Fixed control bar at bottom
- Swipe up to show participant list
- Swipe down to show agenda panel
- Transcription results scroll display