🚨 NEW FEATURE: Breakout Rooms - How to Enable

Breakout Rooms

The much-anticipated feature ‘Breakout Rooms’ just landed in Stable Release version 2.0.6689. :man_dancing:t5::man_dancing:t5::man_dancing:t5:

Introduction

Breakout Rooms let you temporarily split your Jitsi meeting into smaller groups, with each group meeting in its own unique room. By using Breakout Rooms, a Moderator can separate meeting participants into several small groups for more focused conversations and then bring them back into the main room at any time. These Breakout Rooms are distinct and completely separate from each other and the main room in terms of audio and video, so there is no audio or video leak or interference between rooms.

In Jitsi, only Moderators can create Breakout Rooms. They can be created at any time before or during a meeting. The Moderator can either assign participants to specific rooms or have participants join rooms on their own. Currently, users can move between rooms without restriction and can go back to the main meeting room at any time.

Configuring your deployment to enable Breakout Rooms

If you are installing Jitsi for the first time, starting from Stable Version 2.0. 6689, Breakout Rooms are enabled and work out of the box. However, if you are upgrading from a previous version, you’ll need to take some steps to enable the feature.

  1. Using your preferred editor, open your Jitsi prosody configuration file for editing (in this case, we use nano):
	sudo nano /etc/prosody/conf.avail/your.domain.com.cfg.lua
  1. Locate the main Virtual Host domain. It should look like this:

  1. Under modules_enabled, add “muc_breakout_rooms”
modules_enabled = {
        "bosh";
        "pubsub";
        "ping"; -- Enable mod_ping
        "speakerstats";
        "external_services";
        "conference_duration";
        "muc_lobby_rooms";
        "muc_breakout_rooms";
    }
  1. Also, add the muc for breakout rooms to the list of mucs
c2s_require_encryption = false
    lobby_muc = "lobby.your.domain.com"
    main_muc = "conference.your.domain.com"
    breakout_rooms_muc = "breakout.your.domain.com"
  1. The final block should look like this:

  1. Next, add a component for the breakout rooms muc. It’s probably best to add this at the end of the file for easy identification. (Note that admin user is “focus” NOT “focusUser”)
--Internal muc component for enabling Breakout Rooms
Component "breakout.your.domain.com" "muc"
	restrict_room_creation = true
	storage = "memory"
	admins = { "focus@auth.your.domain.com" }
	muc_room_locking = false
	muc_room_default_public_jids = true
  1. Save the changes and exit edit mode
	Ctrl + O
	Ctrl + X
  1. Finally restart services
	sudo systemctl restart jitsi-videobridge2 prosody jicofo

Creating and Managing Breakout Rooms

Now if you start a meeting and open the participants pane, you’ll see a button for creating Breakout Rooms

Click the button to create a Breakout Room. A room is created and automatically assigned a room name.

Moderator can now move meeting participants to the Breakout Room by clicking on the ellipsis to the far right of the participant’s Display Name and then selecting the specific Breakout Room to move them to

Alternatively, a participant can also choose to join a Breakout Room on their own once created by clicking on the ‘Join’ button next to the listed Breakout Room

In the same vein, participants can leave a Breakout Room at any time and be taken back to the main room

user-leave_room

The Moderator can also force all participants out of the Breakout Room at once and send them back to the Main Room by closing the Breakout Room

If a Breakout Room is empty (free of participants), the Moderator can completely remove the room from the available list of Breakout Rooms


images (6) IMPORTANT NOTES

This is an evolving feature and work is still being done to improve it and increase its functionality. As of Stable Version 2.0.6726 released on December 10th, 2021, the following are true:

  1. Room names are currently not editable or configurable
  2. Currently, recording only works in the main room. Breakout rooms cannot be recorded
  3. Moderator has to be in the same room to access the context menu to a user using the ellipsis (three dots)
  4. Consequently, Moderator will need to be present in the same room to move a participant from one room to another
  5. To return participants to the main room, Moderator will need to close the Breakout room
  6. If Moderator is in a Breakout room, to close the room, Moderator first needs to exit the Breakout room (join another Breakout room or go back to the Main room)
  7. In password-protected meetings, participants will need the password to get back into the Main Room after going to a Breakout Room
  8. Breakout Rooms can also be individually password-protected

CURRENT BUGS
These are noted bugs which are already being worked on. Once resolved, this list will be updated to reflect.

  • In password-protected Breakout Rooms, if a participant does not have the password and chooses to ‘Cancel’, they are booted out of the entire meeting. Ideally, they should be sent back to the Main Room where they were.
17 Likes

Thanks for these steps, please keep this post update if there is any improvement!

Thank you for taking time to write and sharing knowledge.

Hi @Freddie, thanks for this! I have enabled the breakout room using your instruction and it seems working, except for one thing: It does not work in a dynamic branded room.

Nothing happens when the “add breakout room” button is clicked in a dynamic branded room. There is also no error in the browser’s console.

Can this be confirmed by anyone using dynamic branding and is following the unstable branch?

Amazing news! Is it or will it be possible to a) assign breakout rooms before the meeting starts and b) keep track of who was in a breakout room if they were randomly assigned?

Welcome to the forum!

It is possible to create Breakout rooms before other participants join the meeting, but participants can only be assigned after they join the meeting. This is because (amongst other things), guest users don’t exist in the Jitsi ecosystem until they join the meeting (since there’s no registration of any kind), so there’s no way of assigning them.

Well, there’s really no random Breakout room assignment feature right now; every participant is actively assigned to a room by the Moderator.

Awesome, thank you for this clarification, and of course that makes sense in terms of registration. I am hoping to be able to (eventually) have a sense of which participants were in breakout rooms together - so after they are assigned, is that something that could be downloaded or tracked in some way?

The Moderator is able to see all the Breakout Rooms and the participants in the rooms at any time. Not sure if this is what you’re looking for. Jitsi does not store participant data, so there really isn’t anything to download. While the meeting is ongoing though, I believe it should be possible to track the room presence of each participant, using their participant ID. But one would question why even go through that when the Moderator can easily see where everyone is at any time during the meeting.

@Freddie Can this be implemented with JWT token-based authenticated jitsi hosted server ?

You mean Breakout rooms? Yes.

How can we do this? I am using jitsi for school ( emrah-tools/jitsi/installer/school at main · emrahcom/emrah-tools · GitHub) , When i create a room and create breakout rooms its getting redirected to the home page , Is there any extra configuration that i have to make it to work ?

Hi @harish_kumar,

Seems that prosody 11.2 has no support for breakout rooms. This package comes from the official Debian Buster repo.

If it’s possible for you to switch to Debian Bullseye, I can prepare a similar installer for Debian Bullseye too.

If your system is an Ubuntu 20.04 box then try to disable token_owner_party for breakout.

/etc/prosody/cond.d/yourdomain.cfg.lua

Component "breakout.jitsi.yourdomain.com" "muc"
    restrict_room_creation = true
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        "token_verification";
        --"token_affiliation";
        --"token_owner_party";
        "muc_rate_limit";
    }

Hi Freddie

Thanks for writing the guide, it makes it a lot easier to implement the changes when it’s laid out like this and easy to read. I think there may be a typo under point 3. The second ’ " ’ by "muc_breakout_rooms” is a different format and it doesn’t process it the same. I found this on another guide before with a similar issue when copying.

@emrah Thanks for the reply, I am on ubuntu 20.04 focal and prosody version is

prosody:
  Installed: 0.11.4-1
  Candidate: 0.11.4-1
  Version table:
 *** 0.11.4-1 500
        500 http://ap-southeast-2.ec2.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
        100 /var/lib/dpkg/status

I tried disabling both token affiliation and token owner party and tried , Now I see something went wrong and re directing to the home page ,

Prosody logs

Feb 14 14:03:16 event_sync.mydomain:event_sync_component       info    Start tracking occupants for hello1231@conference.mydomain
Feb 14 14:03:17 mydomain:muc_lobby_rooms       info    Set room jid = hello1231@conference.mydomain as members only
Feb 14 14:03:17 event_sync.mydomain:event_sync_component       info    New occupant - {"occupant_jid":"84147c3f-4438-4bcd-aa41-54b17bdaab5c@mydomain/3Jdvdoxq","joined_at":1644847397,"name":"harish","email":"harishkrishna17@gmail.com"}
Feb 14 14:03:22 event_sync.mydomain:event_sync_component       info    Occupant left - {"email":"harishkrishna17@gmail.com","occupant_jid":"84147c3f-4438-4bcd-aa41-54b17bdaab5c@mydomain/3Jdvdoxq","name":"harish","left_at":1644847402,"joined_at":1644847397}
Feb 14 14:03:23 bosh0bd3369e-f6db-479a-ae39-e734a5c3f890        info    BOSH client disconnected: session close
Feb 14 14:03:27 mydomain:muc_breakout_rooms    info    Closing conference hello1231@conference.mydomain as all left for good.
Feb 14 14:03:27 speakerstats.mydomain:speakerstats_component   warn    A module has been configured that triggers external events.
Feb 14 14:03:27 speakerstats.mydomain:speakerstats_component   warn    Implement this lib to trigger external events.
Feb 14 14:03:27 event_sync.mydomain:event_sync_component       info    Room destroyed - hello1231@conference.mydomain

My prosody conf

plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }

-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "mydomain.test.com";

external_service_secret = "hd0aYzyQuRvcMnR1";
external_services = {
     { type = "stun", host = "mydomain.test.com", port = 3478 },
     { type = "turn", host = "mydomain.test.com", port = 3478, transport = "udp", secret = true, ttl = 86400, algorithm = "turn" },
     { type = "turns", host = "turn-mydomain.test.com", port = 443, transport = "tcp", secret = true, ttl = 86400, algorithm = "turn" }
};

cross_domain_bosh = false;
consider_bosh_secure = true;
https_ports = { }; -- Remove this line to prevent listening on port 5284

-- https://ssl-config.mozilla.org/#server=haproxy&version=2.1&config=intermediate&openssl=1.1.0g&guideline=5.4
ssl = {
    protocol = "tlsv1_2+";
    ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"
}

unlimited_jids = {
    "focus@auth.mydomain.test.com",
    "jvb@auth.mydomain.test.com"
}

VirtualHost "mydomain.test.com"
    -- enabled = false -- Remove this line to enable this host
    authentication = "token"
    -- Properties below are modified by jitsi-meet-tokens package config
    -- and authentication above is switched to "token"
    --app_id="video2"
    --app_secret="933f9b343bd40ec8c25318b8d745fa800e372c4f5ca3726262545abc67228c6f5ca8b32f0e92f2f2"
    app_id="xxxxx"
    app_secret="xxx"
        allow_empty_token = false
    -- Assign this host a certificate for TLS, otherwise it would use the one
    -- set in the global section (if any).
    -- Note that old-style SSL on port 5223 only supports one certificate, and will always
    -- use the global one.
    ssl = {
        key = "/etc/prosody/certs/mydomain.test.com.key";
        certificate = "/etc/prosody/certs/mydomain.test.com.crt";
    }
    av_moderation_component = "avmoderation.mydomain.test.com"
    speakerstats_component = "speakerstats.mydomain.test.com"
    conference_duration_component = "conferenceduration.mydomain.test.com"
    -- we need bosh
    modules_enabled = {
        "bosh";
        "pubsub";
        "ping"; -- Enable mod_ping
        "speakerstats";
        "external_services";
        "conference_duration";
        "muc_lobby_rooms";
        "muc_breakout_rooms";
        "av_moderation";
    }
    c2s_require_encryption = false
    lobby_muc = "lobby.mydomain.test.com"
    breakout_rooms_muc = "breakout.mydomain.test.com"
    main_muc = "conference.mydomain.test.com"
    muc_lobby_whitelist = { "recorder.mydomain.test.com" } -- Here we can whitelist jibri to enter lobby enabled rooms

Component "conference.mydomain.test.com" "muc"
    restrict_room_creation = true
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        "polls";
        "token_verification";
        "token_affiliation";
        "token_owner_party";
        "muc_rate_limit";
    }
    admins = { "focus@auth.mydomain.test.com" }
    muc_room_locking = false
    muc_room_default_public_jids = true

Component "breakout.mydomain.test.com" "muc"
    restrict_room_creation = true
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        "token_verification";
        --"token_affiliation";
        --"token_owner_party";
        "muc_rate_limit";
    }
    admins = { "focus@auth.mydomain.test.com" }
    muc_room_locking = false
    muc_room_default_public_jids = true

-- internal muc component
Component "internal.auth.mydomain.test.com" "muc"
    storage = "memory"
    modules_enabled = {
        "ping";
    }
    admins = { "focus@auth.mydomain.test.com", "jvb@auth.mydomain.test.com" }
    muc_room_locking = false
    muc_room_default_public_jids = true

VirtualHost "recorder.mydomain.test.com"
    modules_enabled = {
        "ping";
    }
    authentication = "internal_plain"

VirtualHost "auth.mydomain.test.com"
    ssl = {
        key = "/etc/prosody/certs/auth.mydomain.test.com.key";
        certificate = "/etc/prosody/certs/auth.mydomain.test.com.crt";
    }
    modules_enabled = {
        "limits_exception";
    }
    authentication = "internal_hashed"

-- Proxy to jicofo's user JID, so that it doesn't have to register as a component.
Component "focus.mydomain.test.com" "client_proxy"
    target_address = "focus@auth.mydomain.test.com"

Component "speakerstats.mydomain.test.com" "speakerstats_component"
    muc_component = "conference.mydomain.test.com"

Component "conferenceduration.mydomain.test.com" "conference_duration_component"
    muc_component = "conference.mydomain.test.com"

Component "avmoderation.mydomain.test.com" "av_moderation_component"
    muc_component = "conference.mydomain.test.com"

Component "lobby.mydomain.test.com" "muc"
    storage = "memory"
    restrict_room_creation = true
    muc_room_locking = false
    muc_room_default_public_jids = true
    modules_enabled = {
        "muc_rate_limit";
        "polls";
    }
Component "event_sync.mydomain.test.com" "event_sync_component"
    muc_component = "conference.mydomain.test.com"
    api_prefix = ""

Please let me know if I doing anything wrong , Thanks

I didn’t test prosody 0.11.4 with breakout rooms and I’m not sure it works with 0.11.4. I will get back to you when I test it

I am running token servers under ubuntu server 20 with prosody 0.11.4-1 as well as prosody 0.11.13-1~focal1 and pretty much the same /etc/prosody/conf.avail/[Domain].cfg.lua as shown above, no problems here…

@Reavus3 thanks for pointing that out. It got converted into a curly quote. I’ve fixed it. :blush:

1 Like

Hi @harish_kumar,

I found the problem. Can you disable conference.left event in /usr/share/jitsi-meet/body.html

//APP.conference._room.on("conference.left", redirect);

@emrah Thanks for pointing this out , But no luck on this

Below is my body.html

<script>
function redirect() {
    window.location.href="https://mydomain.com";
}

function subscribeToEvents() {
    try {
        if (!APP.store.getState()) {
            throw new Error("state is not ready. try again");
        } else if (!APP.store.getState()["features/base/connection"]) {
            throw new Error("connection is not ready. try again");
        }

        cnn = APP.store.getState()["features/base/connection"];
        if (cnn.error) {
            return redirect();
        }

        APP.conference._room.on("conference.kicked", redirect);
//        APP.conference._room.on("conference.left", redirect);
    } catch(e) {
        setTimeout(() => subscribeToEvents(), 3000);
    }
}

subscribeToEvents();
</script>

I have just test it and it works for me. I did 2 changes:

  • removing token_affiliation and token_owner_party from breakouts block in /etc/prosody/cond.d/yourdomain.cfg.lua
  • disable left in /usr/share/jitsi-meet/body.html

The installer is also fixed now.

1 Like