SBC (Small Blue Client) is a Chrome extension designed to unlock full automation capabilities within BigBlueButton (BBB) meetings.
It intercepts the internal GraphQL WebSocket communication, allowing you to execute any mutation, react to events, automate actions through custom scripts, and even spoof your microphone and camera with custom media files.
- Features
- Installation
- Quick Start
- User Interface
- Automation Scripts
- Media Spoofing
- Technical Architecture
- File Structure
- Permissions
- Troubleshooting
- Disclaimer
- One‑Click Actions: Raise/lower hand, toggle mobile mode, set away status, react to messages.
- Operation Explorer: Discover all GraphQL mutations/subscriptions used by BBB in real time.
- Custom Mutation Sender: Build and send any GraphQL operation with a variable editor.
- Automation Scripts: Create event‑driven or time‑based scripts that react to chat messages, user joins, hand raises, voice events, etc.
- Message Reaction Spammer: Send massive random or selected emoji reactions to any message.
- Live Clock in Messages: Transform a message into a ticking clock that updates every second.
- Media Spoofing: Replace your microphone and/or camera with any audio/image/video file.
- Debug Overlay & Toasts: Get visual feedback inside the BBB page.
- Executed Operation History: Rerun any previously executed operation with one click.
- Response Inspector: View raw responses for every operation you’ve sent.
- Download or clone this repository.
- Open Chrome and navigate to
chrome://extensions. - Enable Developer mode (toggle in the top‑right corner).
- Click Load unpacked and select the folder containing
manifest.json. - The SBC icon (🅂) will appear in your toolbar.
- Open a BigBlueButton meeting in a tab – the extension will automatically activate on pages containing
/html5client.
- Join any BBB meeting.
- Click the SBC extension icon.
- In the popup, the Actions tab lets you instantly toggle hand‑raise, mobile mode, and away status.
- The Custom Send tab lets you send raw GraphQL operations.
- Switch to the Automation tab, load a JSON file with your scripts, and they will run automatically inside the meeting.
The popup window (700px wide) is divided into several tabs:
Quick controls to:
- Raise / lower your hand.
- Enable / disable mobile mode.
- Set yourself as away / back.
- Send a reaction (👍 ❤️ 😄 🎉) to the most recent public chat message.
Displays all GraphQL operations (mutations/subscriptions/queries) that BBB has used since the extension was loaded.
Each entry shows the operation name, type, and usage count. Click any method to populate the Custom Send tab with that query and its last‑known variables.
You can ⭐ pin methods to keep them at the top of the list (pinning persists in storage).
Lists all officially supported BBB mutations parsed from actions.json.
Click any mutation to open a form that asks for the required arguments, then automatically builds the GraphQL operation and loads it into the Custom Send tab.
The heart of SBC’s script engine:
- Load JSON: Import an automation script file (see Automation Scripts for format).
- Clear All: Remove all loaded scripts.
- Each script is shown with a toggle to enable/disable it without unloading.
- All script execution logs appear in the Execution Log box at the bottom.
Allows you to replace your real microphone/camera with custom media:
- Fake Microphone: Upload an audio file (MP3, WAV, OGG). Enable looping. Test the stream before applying.
- Fake Camera: Upload a video file (MP4, WebM) or an image (JPG, PNG). Enable looping. Test the stream.
- Apply to Page: Sends the settings to the BBB tab and activates the spoofed devices.
- Reset to Real Devices: Disables all spoofing and restores real hardware.
Once applied, BBB will see two new devices: SBC Fake Microphone and SBC Fake Camera.
You may need to refresh the BBB page or re‑join the meeting for the new devices to appear in BBB’s media settings.
Shows the latest 30 GraphQL operations that were actually sent (including those triggered by scripts).
Click any row to reload its query and variables into the Custom Send tab.
Use the ↻ button to re‑send that exact operation.
Pinning works here as well.
Displays the responses received for each operation (by operation ID).
Click an entry to see the full response JSON in an alert.
- Displays your captured user info (name, ID, role) and WebSocket state.
- Shows the 5 most recent raw WebSocket messages (for quick debugging).
- A free‑form JSON editor for any GraphQL operation.
- Variables Editor lets you update each variable individually and then apply them to the JSON.
- Example loads a sample
userSetRaiseHandmutation. - Format pretty‑prints the current JSON.
- Send Operation delivers it to the BBB WebSocket.
Automation scripts are JSON files that define triggers and actions. They are evaluated continuously inside the BBB page.
{
"scripts": [
{
"name": "My Script",
"trigger": {
"type": "onChatMessage",
"params": { ... }
},
"action": {
"type": "sendReaction",
"params": { ... }
},
"runMode": "once"
}
]
}name– unique (within the file) identifier for the script.trigger– specifies when the script should fire.action– what to do when the trigger conditions are met.runMode–"once"(fire only the first time) or"forever"(fire on every matching event).
Time‑based triggers (onTime) always respect this setting.
| Trigger type | Description | Available params |
|---|---|---|
onChatMessage |
A public/private chat message appears. | senderId (use "SELF" for your own messages), senderName (partial match), text (exact match), chatId |
onUserJoin |
A user joins the meeting. | – |
onUserLeave |
A user leaves. | – |
onRaiseHand |
Somebody raises their hand. | – |
onUserVoiceConnect |
A user connects to the voice bridge. | – |
onUserVoiceDisconnect |
A user disconnects from voice. | – |
onTime |
A specific time of day (HH:MM). Multiple times allowed, comma‑separated. | timePattern: e.g. "09:00, 12:30, 15:45" |
| Action type | Description | Key params |
|---|---|---|
sendReaction |
Send emoji reactions to a message. | messageId (or auto‑captured), mode: "random" (count) or "select" (array of emojis) |
mutation |
Execute any known mutation from actions.json or discovered operations. |
mutationName, variables (supports placeholders) |
sendDirectMessage |
Send a private message to a user. | userId, message |
sendChatMessage |
Send a message to a specific chat. | chatId, message |
startClock |
Turn a message into a live clock. | messageId, format (default "⏰ {{time}}") |
stopClock |
Stop a live clock. | messageId, optionally finalMessage to replace it |
getMessageInfo |
Log the author and text of a message. | messageId |
getUserInfo |
Log a user’s name and role. | userId |
listUsers |
Log all users currently in the meeting. | – |
getChatHistory |
Log the most recent chat messages. | count (default 10) |
In action parameters, you can use dynamic placeholders:
{{userId}},{{userName}},{{messageId}},{{messageText}},{{chatId}},{{replyToMessageId}}– filled from the triggering event’s context.{{time}}– current time (for clock format).{{date}}– current date.{{meetingId}}– the BBB meeting ID.
Special input values:
"SELF_ID","AUTO_CAPTURE_ID","USER_ID"→ your own user ID."TARGET_ID"→ the user ID that triggered the event (e.g. the sender of a chat message)."MESSAGE_ID"→ the message ID from the event.
1. Auto‑reply with a reaction and a message when someone says “hello”
{
"scripts": [
{
"name": "Hello Reply",
"trigger": {
"type": "onChatMessage",
"params": { "text": "hello" }
},
"action": {
"type": "sendReaction",
"params": {
"messageId": "{{messageId}}",
"mode": "select",
"emojis": ["👋", "❤️"]
}
},
"runMode": "forever"
},
{
"name": "Hello Reply Text",
"trigger": {
"type": "onChatMessage",
"params": { "text": "hello" }
},
"action": {
"type": "sendChatMessage",
"params": {
"chatId": "{{chatId}}",
"message": "Hi {{userName}}!"
}
},
"runMode": "forever"
}
]
}2. Time‑triggered message every morning
{
"scripts": [
{
"name": "Good morning",
"trigger": {
"type": "onTime",
"params": { "timePattern": "09:00" }
},
"action": {
"type": "sendChatMessage",
"params": {
"chatId": "MAIN-PUBLIC-GROUP-CHAT",
"message": "☀️ Good morning everyone!"
}
},
"runMode": "forever"
}
]
}3. Live clock on the last message
{
"scripts": [
{
"name": "Start Clock",
"trigger": {
"type": "onChatMessage",
"params": { "text": "!clock" }
},
"action": {
"type": "startClock",
"params": {
"messageId": "{{messageId}}",
"format": "🕒 Current time: {{time}}"
}
},
"runMode": "once"
}
]
}(After sending !clock, the message will update every second. Stop it with a script that calls stopClock on the same message.)
For a detailed breakdown of all action types, see the popup’s Actions File tab, which visualises every mutation from BBB’s official API.
SBC can replace your real media devices with custom audio/video streams:
- Upload an audio file (MP3, WAV, OGG) and toggle Fake Microphone.
- Upload a video file or image (MP4, WebM, JPG, PNG) and toggle Fake Camera.
- Use the Test Stream buttons to preview them directly on the BBB page before applying.
- Enable Loop for continuous playback.
Once applied, SBC overrides:
navigator.mediaDevices.getUserMedia– exactly matches the device IDsbc-fake-audio-deviceorsbc-fake-video-device.navigator.mediaDevices.enumerateDevices– adds the two fake devices to the list.MediaStreamTrack.prototype.getSettings– ensures the fake devices report correctly.
BBB will see the fake devices and, if you select them in its settings, your “microphone” and “camera” will be replaced by your chosen media.
Important:
After applying spoof settings, you may need to refresh the BBB page or re‑join the meeting for the fake devices to appear in the media settings dropdown. Once selected, they will work immediately.
SBC uses a multi‑layer approach:
-
Content Script (
content.js)
Loads automatically on any page containing/html5client.
Injects the main script (inject.js) into the page’s JavaScript context, bypassing isolation.
Acts as a bridge between the injected script, the popup, and the background. -
Injected Script (
inject.js)- WebSocket Interception: Overrides
window.WebSocketto intercept thegraphql-transport-wsconnection used by BBB. - GraphQL Parsing: Listens to all sent/received messages, extracts operation names, queries, and variables.
- Event Processing: Analyzes incoming data (user joins, chat messages, voice activity, etc.) and builds a rich event model.
- Caching: Maintains caches of users and messages for fast lookups.
- Script Engine: Evaluates user‑defined automation scripts against every processed event.
- Mutation Sender: Provides functions to send any GraphQL operation (reactions, messages, edits, etc.).
- Media Spoofing: Overrides
getUserMedia/enumerateDevicesto inject fake audio/video streams. - Compatibility: Forces
clientIsMobile = truein theUserJoinmutation to improve cross‑platform compatibility.
- WebSocket Interception: Overrides
-
Popup UI (
popup.html+popup.js)
Reads stored settings, displays real‑time data from the BBB tab, and provides all controls.
Communication with the page happens viachrome.tabs.sendMessageand custompostMessageevents. -
Actions Definitions (
actions.json)
A registry of official BBB mutations, parsed at startup to offer forms for building queries with correct argument types.
All inter‑component communication is asynchronous and timeout‑protected to avoid hanging the UI.
sbc/
├── manifest.json # Chrome extension manifest (MV3)
├── content.js # Content script; injects inject.js, bridges messages
├── inject.js # Core injectable script: WebSocket interception, script engine, spoofing
├── popup.html # Popup UI structure
├── popup.js # Popup logic and event handling
├── actions.json # Mutation definitions (official BBB API)
├── tw.js # (Optional) Tailwind CSS utility (not shown in sources)
└── icon700.png # Extension icon
tw.js is a Tailwind‑style utility script (included in the original project) that styles the popup using class‑based CSS – you can replace it with any CSS framework or plain CSS.
activeTab– to interact with the currently active BBB tab.scripting– to executecontent.jsprogrammatically if needed (though the content script is declared in the manifest).storage– to persist automation scripts, spoof settings, and pinned methods.host_permissions: *://*/*– required because BBB instances run on many different domains; the extension must work on all of them.web_accessible_resources– allowsinject.jsandactions.jsonto be loaded by the page.
Q: The popup shows “Not connected to BBB meeting”.
A: Make sure you are on a page whose URL contains /html5client (i.e. you are inside a BBB meeting). Refresh the BBB page first, then click the extension icon.
Q: Automation scripts are not firing.
A: Check that the script is enabled (toggle in the Automation tab). For onChatMessage, ensure the trigger parameters (text, senderId, etc.) match exactly as intended. For onTime, the script must have been loaded before the specified time. Use the Execution Log tab to see script activity.
Q: Reactions or mutations fail silently.
A: Open the Executed tab – it shows every operation sent. If an operation uses a mutation from actions.json but the query is wrong, BBB may reject it. Try re‑running the operation from the Methods or Actions File tab to see if it works manually.
Q: Fake devices do not appear in BBB’s media settings.
A: After applying spoof settings in the popup, refresh the BBB page or re‑join the meeting. The fake devices will then appear as “SBC Fake Microphone” and “SBC Fake Camera”. Make sure you have uploaded a file and the toggle is ON.
Q: The clock on a message stops or behaves erratically.
A: The clock uses chatEditMessage every second. If the mutation fails (e.g. you are not the message author or you lost connection), the interval continues but changes may not be visible. You can stop the clock via stopClock action or by clearing all scripts.
SBC is intended for educational and testing purposes only.
Use of this extension may violate BigBlueButton’s terms of service. Do not use it to disrupt meetings, spam participants, or impersonate others. The developers assume no liability for any misuse or consequences arising from its use.
Contributions are welcome! Feel free to open issues or pull requests. Before submitting, please test your changes on a standard BBB 2.5+ meeting.
Happy automating! 🤖