Skip to main content
Version: 4.0 (in development)

new-features

BigBlueButton 4.0 runs on Ubuntu 24.04

Overview

BigBlueButton 4.0 offers users improved usability and increased engagement.

  • Usability - making common functions (such as raising a hand) easier
  • Engagement - giving the instructor more ways to engage students

The most visible change in 4.0 is a redesigned client interface built around a new navigation sidebar and an Apps Gallery. Under the hood, 4.0 moves to Ubuntu 24.04 and continues the modernization of the codebase that began in 3.0.

Here's a breakdown of what's new in 4.0.

Usability

The client's left-hand navigation has been redesigned into a dedicated navigation sidebar with a cleaner set of buttons (user list, chat, shared notes, timer, settings, and more), notification indicators, and a participant-count badge on the user list button.

Alongside it, a new Apps Gallery brings together apps such as Polls, Breakout Rooms, Timer, and Audio Captions — as well as plugins. Frequently used apps can be pinned, and pinned apps are persisted and cached across sessions. Recently added apps can be highlighted with a "new" ribbon. The gallery can be searched, switched between list and grid views (the choice is remembered, and mobile defaults to the list view), and pinned apps can be managed directly from the gallery.

The number of apps that can be pinned is controlled by public.app.appsGallery.maxPinnedApps (default 3), and which apps show the "new" label is controlled by public.sidebarNavigation.appsToLabelAsNew in settings.yml. Which built-in buttons appear in the sidebar, in which section, and in what order is controlled by public.sidebarNavigation.buttons (see the client-settings changes below). The sidebar navigation can be hidden per user with the join parameter userdata-bbb_hide_sidebar_navigation.

Search the user list

Moderators and viewers can now search the user list in real time. The search supports full-text and reverse matching and includes the current user in the results, and it also filters the raised-hands and waiting-guest sections. It can be toggled with public.userList.searchBar.enabled (default true), and the page size of the user list is configurable via public.layout.usersPerUserListPage (default 50).

Redesigned timer

The timer received a new design and an improved input experience, including one-click presets and quick-add buttons. The available values are configurable in settings.yml (public.timer.presets, public.timer.quickAddButtons, public.timer.maxHours).

Redesigned guest management panel

Guest management now lives in a dedicated panel integrated with the user list. Moderators approving or denying guests in the waiting panel can use a new "Remember Choice" option to apply the same decision to subsequent join requests. The input for messaging the waiting room now gives visual send-state feedback so moderators can tell their message was delivered.

Redesigned permissions (lock viewers) modal

The "Lock viewers" / permissions modal was redesigned with a tabbed layout, and the toggle switches were replaced with checkboxes to make the "restrict" action clearer. The modal now warns about unsaved changes before closing. It also surfaces the new presenter policy described under Request to Present.

Mobile layout overhaul

The mobile experience received a major overhaul. Webcams on mobile are now paginated, with swipe gestures and a dots indicator to move between pages, and the default mobile camera grid was reduced to 6 visible cameras (public.kurento.pagination.mobileGridSizes). The navigation bar uses circular buttons with an aligned sidebar toggle, the actions bar was made more compact with a unified audio control, and the chat and meeting options menus render as compact popovers. Dialogs such as the request-unmute modal were adapted to small screens. On phones in landscape orientation, cameras and the presentation are arranged side by side.

Automatic light/dark theme

The client now follows the operating system's light/dark preference (prefers-color-scheme) as the initial theme, and keeps following it while the user has not chosen a theme manually. The per-user "Dark mode" toggle and the userdata-bbb_prefer_dark_theme join parameter always take precedence over the detected system theme. The behavior is controlled by public.app.darkTheme.autoDetectFromSystem (default true).

Dedicated Audio settings tab

Audio settings moved into a dedicated Audio tab in the Settings modal, where each user picks how their microphone signal is processed before it is sent to other participants:

  • Advanced Filtering - an optional WASM-based audio processor (internally "BBBA") that runs on top of the microphone stream, isolating the speaker's voice and eliminating background noise. It is disabled by default and has to be made available by the administrator; see Advanced Filtering (WASM audio processing) for configuration details.
  • Standard Filtering (default) - the browser's built-in filters: auto gain control, echo cancellation, and noise suppression.
  • Original Audio - no processing at all; the raw microphone signal is transmitted. Ideal for sharing music, singing, or instruments.

The mode pre-selected for a new user is controlled by public.app.defaultSettings.audio.processingMode (default standard); if it is set to advanced while WASM processing is unsupported by the browser or disabled server-side, the client falls back to standard. The browser-level constraints applied in the standard mode are configurable under public.media.audio.microphoneConstraints.

Wrong-microphone alert for live captions

When browser-based (WebSpeech) live captions are enabled and a user holds the audio floor but no transcription is produced for a short while, BigBlueButton now shows a toast suggesting the wrong microphone may be selected or the environment is too noisy. The alert can optionally link to a knowledge-base article and is configurable via public.app.audioCaptions.microphoneAlert in settings.yml.

Engagement

Request to Present

Viewers can now actively request the presenter role instead of waiting for a moderator to assign it. When a viewer requests to present, moderators see the request and can approve or deny it; the requesting viewer sees a waiting state and a notification if the request is denied.

This behavior is governed by a new presenter policy, configurable per meeting via the lockSettingsPresenterPolicy create parameter and the server default lockSettingsPresenterPolicy in bbb-web's properties. The accepted values are:

  • moderatorOnly - only moderators can assign the presenter.
  • requireApproval (default) - viewers can request to present, and a moderator must approve.
  • freeForAll - viewers can take the presenter role without approval.

Pinned chat messages

Moderators can now pin a chat message so it stays prominently visible to everyone in the meeting. Pinning is exposed through the chat message toolbar (the new pin option in public.chat.toolbar) and can be disabled per meeting with the pinChatMessage value of disabledFeatures.

When allowModsToUnmuteUsers is enabled, BigBlueButton 4.0 can optionally ask the participant for consent before a moderator unmutes them. With the new requireUserConsentBeforeUnmuting option set to true, a consent dialog is shown to the user instead of the microphone being unmuted directly. The default (false) preserves the legacy behavior. This can be set server-wide in bbb-web's properties or per meeting on the create call.

Multi-Functional Mode (auxiliary sidebar)

A new Multi-Functional Mode adds an auxiliary sidebar content panel, allowing a second panel to be open alongside the primary one (for example, chat and the user list at the same time). It is disabled by default and enabled with public.multiFunctionalMode.enabled in settings.yml, and it can be disabled per meeting with the multiFunctionalMode value of disabledFeatures.

Larger emoji-only chat messages (jumbomoji)

A chat message that contains only emoji (up to three emoji, whitespace ignored) is now rendered at a larger font size — matching the "jumbomoji" behavior familiar from popular messengers. Messages with any accompanying text keep the normal size.

Behind the scenes

Client re-architecture and TypeScript migration

The client UI continued its migration to TypeScript, and large parts of the navigation, sidebar, and actions bar were rebuilt. The old "Action Button Dropdown" was replaced by a new Media Area component in the actions bar, and a new icon library was introduced.

Bot user support

The client now has first-class handling for bot users (joined with bot=true). Bots are excluded from the grid layout and screenshare UI, can be given a dedicated user-list label, and skip the logout-URL redirection when the meeting ends.

Server messages internationalized on the frontend

Strings that were previously emitted as English constants from the server (Akka) — for example some chat/notification messages — are now resolved to i18n keys on the frontend, improving localization coverage.

Media

LiveKit is the default media framework

BigBlueButton 4.0 uses LiveKit as the default media framework for audio, camera video, and screen sharing. The previous mediasoup/bbb-webrtc-sfu stack (and FreeSWITCH for audio) stays installed and fully supported as an alternative bridge. For an in-depth overview of this initiative, please refer to issue 21059.

The bbb-livekit package (livekit-server and livekit-sip) is installed by default and the LiveKit module in bbb-webrtc-sfu is enabled out of the box.

When using BigBlueButton via the cluster proxy configuration, set the LiveKit endpoint URL in bbb-html5.yml's public.media.livekit.url. See the cluster proxy docs for details.

We also strongly recommend setting up network interface filtering in LiveKit. While optional, this speeds up negotation times and works around an issue with the latest LiveKit versions that might cause CPU spikes if there's no filtering in place. To set up network interface filtering:

  1. Gather relevant network interfaces names to be used for media communication. For most setups, the default network interface is enough. See the route command to find it (Destination: default). If any other network interfaces are needed, make note of them.
  2. Set the following in /etc/bigbluebutton/livekit.yaml:
rtc:
interfaces:
includes:
- <network_interface_name_1>
- <any_other_network_interface_name>
  1. Restart livekit-server: $ sudo systemctl restart livekit-server

Each media type defaults to livekit and can be pointed at the legacy stack instead, per meeting or server-wide:

  • Per meeting: set any of the following meeting /create parameters
    • audioBridge=bbb-webrtc-sfu (or freeswitch)
    • cameraBridge=bbb-webrtc-sfu
    • screenShareBridge=bbb-webrtc-sfu
  • Server-wide: set any of the following properties in /etc/bigbluebutton/bbb-web.properties
    • audioBridge=bbb-webrtc-sfu
    • cameraBridge=bbb-webrtc-sfu
    • screenShareBridge=bbb-webrtc-sfu

Those parameters do not need to be set concurrently. The legacy framework can be used for audio only, for example, while keeping LiveKit for camera and screen sharing by setting just audioBridge=bbb-webrtc-sfu.

As of BigBlueButton v3.0.7, recording is enabled by default for LiveKit sessions via the bbb-webrtc-recorder application. If livekit/egress was previously installed in a server, any steps done to enable it should be reverted. Refer to the previous installations steps.

We encourage users to provide feedback via our GitHub issue tracker or the mailing lists.

Upgraded components

Under the hood, BigBlueButton 4.0 installs on Ubuntu 24.04 64-bit, and the following key components have been upgraded

  • Java 21 (OpenJDK)
  • Grails 7.0.12
  • Gradle 8.14.3
  • Groovy 4.0.21
  • Spring 6.2.11
  • Spring Boot 3.5.16

For full details on what is new in BigBlueButton 4.0, see the release notes.

Recent releases:

Other notable changes

In BigBlueButton 4.0.0-beta.4 we replaced the default choice for Shared Notes component from bbb-etherpad (i.e. Etherpad) to bbb-shared-notes-server (i.e. BlockNote). This means that bbb-shared-notes-server is now a required package, installed by default while bbb-etherpad and bbb-pads are now optional. In the event that you prefer using Etherpad, install the optional packages via

$ sudo apt install bbb-pads bbb-etherpad

At this point you can use it in a specific session by passing sharedNotesEditor=etherpad on the /create call. If you have made up your mind and would like to use it for all sessions, add the same line (sharedNotesEditor=etherpad) to /etc/bigbluebutton/bbb-web.properties and restart BigBlueButton via $ sudo bbb-conf --restart

New optional package: bbb-coturn

BigBlueButton 4.0 adds bbb-coturn, a BigBlueButton build of the coturn TURN/STUN server. Ubuntu 24.04 only ships coturn 4.6.1; bbb-coturn packages coturn 4.16.0.

It is an optional package — it is not a dependency of the bigbluebutton meta-package and is not installed by default. Install it with

$ sudo apt install bbb-coturn

bbb-coturn is a drop-in replacement for the distro coturn package: it declares Provides/Conflicts/Replaces on coturn (so apt swaps one for the other) and keeps the same paths — /usr/bin/turnserver, the /etc/turnserver.conf config file, and a coturn.service systemd unit. Existing systemd drop-ins under /etc/systemd/system/coturn.service.d/ continue to apply.

Unlike the distro package, bbb-coturn does not enable or start the service on install. The shipped /etc/turnserver.conf is the stock upstream example with every option commented out, and coturn's default in that state is anonymous access — starting it before a real configuration is written would expose an open relay. Once you have configured /etc/turnserver.conf, start it with

$ sudo systemctl enable --now coturn

See Turn Server Configuration for the full configuration.

New administration tool: bbbctl

The bbb-config package now ships bbbctl (v0.5.1), a community-maintained command-line tool by @defnull for interacting with a BigBlueButton server from the shell. Installed as /usr/bin/bbbctl, it talks to the server's own API and lets administrators list, inspect, and end meetings and work with recordings without crafting signed API calls by hand. Thank you for developing it, defnull!

Removing deprecated layout options

The layout system has been simplified to use a single unified layout. The following layouts have been removed: CUSTOM_LAYOUT, SMART_LAYOUT, PRESENTATION_FOCUS, and VIDEO_FOCUS. The default layout is now UNIFIED_LAYOUT.

The layout selection modal and the push layout button have also been removed. The showPushLayoutButton, showPushLayoutToggle, and enableDeprecatedLayoutSelection settings are no longer available.

The layouts option has been removed from disabledFeatures.

Removed REST endpoint

The deprecated REST endpoint /api/rest/clientSettings has been removed. Client settings are now served through the GraphQL stack. Any integration that fetched client settings from that endpoint should be updated.

Other removed configuration

Changes to events.xml

bbb-web properties changes

Removed

  • lockSettingsDisableNote is no longer recognized; use lockSettingsDisableNotes instead. The singular property was renamed in BBB 2.5.

Value changed

  • defaultMeetingLayout default changed from CUSTOM_LAYOUT to UNIFIED_LAYOUT. Accepted values are now UNIFIED_LAYOUT (default), plus the hybrid/niche options CAMERAS_ONLY, PARTICIPANTS_AND_CHAT_ONLY, PRESENTATION_ONLY, and MEDIA_ONLY. The previous values CUSTOM_LAYOUT, SMART_LAYOUT, PRESENTATION_FOCUS, and VIDEO_FOCUS are no longer accepted.
  • html5PluginSdkVersion bumped from 0.1.17 to 0.1.24.
  • disabledFeatures accepts a new value: pinChatMessage (alongside the existing chat-related options).
  • sharedNotesEditor default changed from etherpad to blockNote (BlockNote is now the default shared-notes editor; see Promoted BlockNote shared notes as default).
  • cameraBridge, screenShareBridge, and audioBridge default changed from bbb-webrtc-sfu to livekit (see LiveKit is the default media framework).

Added

  • lockSettingsPresenterPolicy added (default requireApproval). Controls whether viewers can request the presenter role; see Request to Present.
  • requireUserConsentBeforeUnmuting added (default false). Only relevant when allowModsToUnmuteUsers=true; when true, a consent dialog is shown before a moderator can unmute a participant.
  • maskTagThreshold added (default 0 = disabled). When set to N, any slide whose generated SVG contains N or more <mask> tags falls back to full-slide rasterization during conversion; see Rasterize slides whose SVG contains mask tags.

Client settings (settings.yml) changes

These changes apply to the client configuration file (/etc/bigbluebutton/bbb-html5.yml, overriding the defaults in settings.yml).

Added

  • public.multiFunctionalMode.enabled (default false) - enables the auxiliary/dual sidebar content panel.
  • public.userList.searchBar.enabled (default true) - enables the user list search field.
  • public.app.appsGallery.maxPinnedApps (default 3) - maximum number of apps a user can pin in the Apps Gallery.
  • public.sidebarNavigation.appsToLabelAsNew (default []) - apps to highlight with a "new" label (e.g. poll, breakoutroom, timer, audio-captions).
  • public.media.audio.audioWasmProcessing - configuration block for the "Advanced Filtering" (WASM/BBBA) audio-processing option; see Dedicated Audio settings tab.
  • public.app.defaultSettings.audio.processingMode (default standard) - which of the three audio-processing modes (advanced, standard, original) comes pre-selected for a new user in Settings > Audio. advanced falls back to standard when WASM processing is unsupported by the browser or disabled server-side.
  • public.media.audio.microphoneConstraints - browser-level audio constraints (auto gain control, echo cancellation, noise suppression) applied when the user selects the standard audio-processing mode (moved from public.app.defaultSettings.application.microphoneConstraints).
  • public.timer.presets, public.timer.quickAddButtons, public.timer.maxHours, public.timer.serverSyncTimeInterval - timer presets and behavior.
  • public.app.breakouts.breakoutRoomMinimum (default 2) - minimum number of breakout rooms.
  • public.app.audioCaptions.showInSidebarNavigation and public.app.audioCaptions.terms - show captions in the sidebar navigation and configure terms-of-service URLs per locale.
  • public.app.darkTheme.autoDetectFromSystem (default true) - uses the operating system's prefers-color-scheme preference as the initial theme and keeps following it while the user has not chosen a theme manually. The per-user "Dark mode" toggle and the bbb_prefer_dark_theme parameter always take precedence over the detected system theme.
  • public.stats.logMediaStats and public.stats.probes - client-side WebRTC stats logging.
  • public.layout.showLeaveSessionLabel (default false) and public.layout.usersPerUserListPage (default 50).
  • public.sidebarNavigation.buttons - controls which built-in sidebar navigation buttons render, in which section (top/center/bottom) and in what order. It is a full replacement list (omit an id to hide that button; ids introduced by future upstream versions must be added back manually). Defaults: top: [profile, user-list, chat, notes], center: [apps-gallery, pinned-apps], bottom: [audio-captions, learning-dashboard, settings].
  • public.app.audioCaptions.microphoneAlert (default enabled: true) - shows a warning when WebSpeech live captions are on and the user holds the floor but nothing is being transcribed (a likely wrong-microphone / noisy-environment signal). Configurable via helpLink (empty hides the link), threshold (dB), speakingThreshold (ms), duration (ms; 0 = manual dismiss) and interval (ms).
  • public.plugins[].settings.pin / .isNew - a plugin can default-pin the items it injects into the Apps Gallery (pin: true pins all injected items; pin: ["id-a", "id-b"] pins only those ids; user pin/unpin choices are persisted and respected), and isNew: true shows the "new" ribbon on the plugin's gallery item.

Value changed

  • public.chat.toolbar now includes a pin option (for pinning chat messages).
  • public.layout.showParticipantsOnLogin default changed from true to false.
  • public.layout.syncCameraDockSizeAndPosition default changed from false to true.
  • The default layout under defaultSettings moved from application.selectedLayout: 'custom' to layout.selectedLayout: 'unified' (with pushLayout now nested under layout).
  • public.user.label gained presenter and bot entries (both default true), and moderator default changed from false to true.
  • public.media.audio.defaultFullAudioBridge and public.media.audio.defaultListenOnlyBridge defaults changed from fullaudio to livekit, aligning the client fallbacks with LiveKit as the default media framework. (defaultFullAudioBridge is superseded by the audioBridge create/property setting; both keys are marked deprecated.)
  • public.app.defaultSettings.application.pushToTalkEnabled default changed from false to true - push-to-talk (hold M to stay unmuted, added in BBB 3.0) is now enabled by default.
  • public.layout.showSessionDetailsOnJoin default changed from true to false - the Session Details dialog is no longer opened automatically when joining.
  • public.kurento.pagination.mobileGridSizes (moderator and viewer) defaults changed from 14 to 6, as part of the mobile layout overhaul.

Removed

  • public.layout.showPushLayoutButton, public.layout.showPushLayoutToggle, and public.layout.enableDeprecatedLayoutSelection.
  • public.stats.log (replaced by public.stats.logMediaStats).
  • public.app.defaultSettings.application.audioWasmProcessing and the commented-out public.app.defaultSettings.application.microphoneConstraints example - superseded by public.app.defaultSettings.audio.processingMode and public.media.audio.microphoneConstraints (see Dedicated Audio settings tab).
  • The SIP.js / legacy-audio client settings, removed together with the SIP.js audio bridge now that LiveKit is the default audio path. Under public.media: callTransferTimeout, callHangupTimeout, callHangupMaximumRetries, iceGatheringTimeout, audioConnectionTimeout, audioReconnectionDelay, audioReconnectionAttempts, sipjsHackViaWs, sipjsAllowMdns, sip_ws_host, websocketKeepAliveInterval, websocketKeepAliveDebounce, traceSip, sdpSemantics; plus public.app.ipv4FallbackDomain. Any of these still set in bbb-html5.yml are now silently ignored.

Development

For information on developing in BigBlueButton, see setting up a development environment for 4.0.

The build scripts for packaging 4.0 (using fpm) are located in the GitHub repository here.

Contribution

We welcome contributors to BigBlueButton 4.0! The best ways to contribute at the current time are: