How to enable new whiteboard feature?

Hello everyone,

I installed the new stable release (ubuntu) yesterday and configured it as usual:
jitsi-meet-prosody/stable,now 1.0.6644-1 all [installiert]
jitsi-meet-web-config/stable,now 1.0.6644-1 all [installiert]
jitsi-meet-web/stable,now 1.0.6644-1 all [installiert]
jitsi-videobridge2/stable,now 2.2-45-ge8b20f06-1 all [installiert]
jicofo/stable,now 1.0-940-1 all [installiert]
jigasi/stable,now 1.1-265-g4049f97-1 all [installiert]

I also enabled the whiteboard feature in config.js:

     whiteboard: {
          enabled: true,
          collabServerBaseUrl: 'https://excalidraw-backend-pilot.jitsi.net'
     },

For testing I entered the backend that Jitsi is stored on beta.jit.si.

Unfortunately, the whiteboard sharing button doesn’t appear in the options.
What have I done wrong or what needs to be done for the whiteboard function?

many thanks for hints!

Please don’t use our dev backend, or we’ll have to shut it down.

You need to enable the room metadata component: jitsi-meet/mod_room_metadata_component.lua at master · jitsi/jitsi-meet · GitHub

This should be enabled by default, isn’t it?

YOu also need to be a moderator to open it for the first time.

1 Like

Thanks for your answer! sorry, i won’t use it!

I activated the metadata component using the docs (doclink):

Component "metadata.hostname" "room_metadata_component"
    muc_component = "conference.hostname"
    breakout_rooms_component = "breakout.hostname"

i also enabled the module in my virtualhost für my main domain:

modules_enabled = {
"room_metadata";
[...]
}
  room_metadata_component = "metadata.hostname"
[...]

My prosody shows this error which i cant’t relate to:

Oct 13 14:23:55 general error No muc_component specified. No muc to operate on!

on my instance secure domain is configured. guests are allowed to join without a password.
Even with moderatorrights, the button for the whiteboard doesn’t appear.

did i miss something?

For those “xxx.hostname” entries, do you have them as VirtualHosts in the config?

yes, i think. my config:

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

muc_mapper_domain_base = "jitsi-test.hostname";

external_service_secret = "xxxx"
external_services = {
     { type = "stun", host = "turn.hostname", port = 5349 },
     { type = "turn", host = "turn.hostname", port = 5349, transport = "tcp", secret = true, ttl = 86400, algorithm = "turn" },
     { type = "turns", host = "turn.hostname", port = 5349, transport = "tcp", secret = true, ttl = 86400, algorithm = "turn" },
};

cross_domain_bosh = false;
consider_bosh_secure = true;

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.jitsi-test.hostname",
    "jvb@auth.jitsi-test.hostname"
}

VirtualHost "jitsi-test.hostname"
    authentication = "cyrus"
    ssl = {
        key = "/etc/prosody/certs/jitsi-test.hostname.key";
        certificate = "/etc/prosody/certs/jitsi-test.hostname.crt";
    }
    cyrus_application_name = "xmpp"
    allow_unencrypted_plain_auth = true

    av_moderation_component = "avmoderation.jitsi-test.hostname"
    speakerstats_component = "speakerstats.jitsi-test.hostname"
    conference_duration_component = "conferenceduration.jitsi-test.hostname"
    end_conference_component = "endconference.jitsi-test.hostname"
    modules_enabled = {
        "bosh";
        "pubsub";
        "ping"; -- Enable mod_ping
        "speakerstats";
        "external_services";
        "conference_duration";
        "end_conference";
        "muc_lobby_rooms";
        "muc_breakout_rooms";
        "av_moderation";
        "auth_cyrus";
        "room_metadata";
    }
    c2s_require_encryption = false
    lobby_muc = "lobby.jitsi-test.hostname"
    breakout_rooms_muc = "breakout.jitsi-test.hostname"
    room_metadata_component = "metadata.jitsi-test.hostname"
    main_muc = "conference.jitsi-test.hostname"

Component "conference.jitsi-test.hostname" "muc"
    restrict_room_creation = true
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        "polls";
        "muc_rate_limit";
    }
    admins = { "focus@auth.jitsi-test.hostname" }
    muc_room_locking = false
    muc_room_default_public_jids = true

Component "breakout.jitsi-test.hostname" "muc"
    restrict_room_creation = true
    storage = "memory"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        "muc_rate_limit";
        "polls";
    }
    admins = { "focus@auth.jitsi-test.hostname" }
    muc_room_locking = false
    muc_room_default_public_jids = true

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

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

Component "focus.jitsi-test.hostname" "client_proxy"
    target_address = "focus@auth.jitsi-test.hostname"

Component "speakerstats.jitsi-test.hostname" "speakerstats_component"
    muc_component = "conference.jitsi-test.hostname"

Component "conferenceduration.jitsi-test.hostname" "conference_duration_component"
    muc_component = "conference.jitsi-test.hostname"

Component "endconference.jitsi-test.hostname" "end_conference"
    muc_component = "conference.jitsi-test.hostname"

Component "avmoderation.jitsi-test.hostname" "av_moderation_component"
    muc_component = "conference.jitsi-test.hostname"

Component "metadata.jitsi-test.hostname" "room_metadata_component"
    muc_component = "conference.jitsi-test.hostname"
    breakout_rooms_component = "breakout.jitsi-test.hostname"
    
Component "lobby.jitsi-test.hostname" "muc"
    storage = "memory"
    restrict_room_creation = true
    muc_room_locking = false
    muc_room_default_public_jids = true
    modules_enabled = {
        "muc_rate_limit";
        "polls";
    }

VirtualHost "guest.jitsi-test.hostname"
    authentication = "anonymous"
    c2s_require_encryption = false

Edit: “hostname” is my public top level domain.

Hum, the config looks ok. Can you check the prosody logs?

this is the log after restarting prosody with new configs:

Oct 13 14:41:03 startup	info	Hello and welcome to Prosody version 0.11.4
Oct 13 14:41:03 startup	info	Prosody is using the select backend for connection handling
Oct 13 14:41:03 metadata.jitsi-test.hostname:room_metadata_component	info	Starting room metadata for conference.jitsi-test.hostname
Oct 13 14:41:03 portmanager	info	Activated service 's2s' on [*]:5269, [::]:5269
Oct 13 14:41:03 portmanager	info	Activated service 'c2s' on [*]:5222, [::]:5222
Oct 13 14:41:03 portmanager	info	Activated service 'legacy_ssl' on no ports
Oct 13 14:41:03 conferenceduration.jitsi-test.hostname:conference_duration_component	info	Starting conference duration timer for conference.jitsi-test.hostname
Oct 13 14:41:03 conferenceduration.jitsi-test.hostname:conference_duration_component	info	No muc component found, will listen for it: conference.jitsi-test.hostname
Oct 13 14:41:03 portmanager	info	Activated service 'http' on [*]:5280, [::]:5280
Oct 13 14:41:03 portmanager	error	Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281
Oct 13 14:41:03 portmanager	error	Error binding encrypted port for https: No certificate present in SSL/TLS configuration for https port 5281
Oct 13 14:41:03 portmanager	info	Activated service 'https' on no ports
Oct 13 14:41:03 jitsi-test.hostname:muc_lobby_rooms	info	Lobby component loaded lobby.jitsi-test.hostname
Oct 13 14:41:03 general	error	No muc_component specified. No muc to operate on!
Oct 13 14:41:03 endconference.jitsi-test.hostname:end_conference	info	Starting end_conference for conference.jitsi-test.hostname
Oct 13 14:41:03 avmoderation.jitsi-test.hostname:av_moderation_component	info	Starting av_moderation for conference.jitsi-test.hostname
Oct 13 14:41:03 avmoderation.jitsi-test.hostname:av_moderation_component	info	No muc component found, will listen for it: conference.jitsi-test.hostname
Oct 13 14:41:03 speakerstats.jitsi-test.hostname:speakerstats_component	info	Starting speakerstats for conference.jitsi-test.hostname
Oct 13 14:41:03 speakerstats.jitsi-test.hostname:speakerstats_component	info	Conference component loaded conference.jitsi-test.hostname
Oct 13 14:41:03 conferenceduration.jitsi-test.hostname:conference_duration_component	info	Hook to muc events on conference.jitsi-test.hostname
Oct 13 14:41:03 avmoderation.jitsi-test.hostname:av_moderation_component	info	Hook to muc events on conference.jitsi-test.hostname
Oct 13 14:41:03 speakerstats.jitsi-test.hostname:speakerstats_component	info	Hook to muc events on table: 0x55dfa567f880
Oct 13 14:41:03 speakerstats.jitsi-test.hostname:speakerstats_component	info	Main muc service table: 0x55dfa55deec0
Oct 13 14:41:03 metadata.jitsi-test.hostname:room_metadata_component	info	Hook to muc events on conference.jitsi-test.hostname
Oct 13 14:41:03 jitsi-test.hostname:muc_breakout_rooms	info	Hook to muc events on conference.jitsi-test.hostname
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host metadata.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host auth.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host conferenceduration.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host guest.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host endconference.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host conference.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host lobby.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host focus.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host speakerstats.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host avmoderation.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host internal.auth.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host localhost!
Oct 13 14:41:03 speakerstats.jitsi-test.hostname:speakerstats_component	info	Breakout component loaded breakout.jitsi-test.hostname
Oct 13 14:41:03 jitsi-test.hostname:muc_breakout_rooms	info	Breakout rooms component created breakout.jitsi-test.hostname
Oct 13 14:41:03 speakerstats.jitsi-test.hostname:speakerstats_component	info	Hook to muc events on table: 0x55dfa5b14870
Oct 13 14:41:03 jitsi-test.hostname:muc_breakout_rooms	info	Hook to muc events on breakout.jitsi-test.hostname
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host metadata.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host auth.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host conferenceduration.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host guest.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host endconference.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host avmoderation.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host speakerstats.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host conference.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host lobby.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host focus.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host internal.auth.jitsi-test.hostname!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host localhost!
Oct 13 14:41:03 breakout.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host breakout.jitsi-test.hostname!
Oct 13 14:41:03 conference.jitsi-test.hostname:muc_domain_mapper	info	Loading mod_muc_domain_mapper for host breakout.jitsi-test.hostname!
Oct 13 14:41:03 metadata.jitsi-test.hostname:room_metadata_component	info	Hook to muc events on breakout.jitsi-test.hostname
Oct 13 14:41:05 c2s55dfa5643be0	info	Client connected
Oct 13 14:41:05 c2s55dfa5643be0	info	Stream encrypted (TLSv1.3 with TLS_AES_256_GCM_SHA384)
Oct 13 14:41:05 c2s55dfa5643be0	info	Authenticated as jvb@auth.jitsi-test.hostname
Oct 13 14:41:10 c2s55dfa5b821b0	info	Client connected
Oct 13 14:41:10 c2s55dfa5b821b0	info	Stream encrypted (TLSv1.3 with TLS_AES_256_GCM_SHA384)
Oct 13 14:41:10 c2s55dfa5b821b0	info	Authenticated as focus@auth.jitsi-test.hostname
Oct 13 14:41:22 c2s55dfa5b821b0	info	Client disconnected: closed
Oct 13 14:41:23 c2s55dfa58ccb10	info	Client connected
Oct 13 14:41:23 c2s55dfa58ccb10	info	Stream encrypted (TLSv1.3 with TLS_AES_256_GCM_SHA384)
Oct 13 14:41:23 c2s55dfa58ccb10	info	Authenticated as focus@auth.jitsi-test.hostname
Oct 13 14:41:38 mod_bosh	info	New BOSH session, assigned it sid '9aa8f42e-f759-4c42-a28b-8f0f04c3fcf5'
Oct 13 14:41:39 bosh9aa8f42e-f759-4c42-a28b-8f0f04c3fcf5	info	Authenticated as 2g31axl4axupi2tp@guest.jitsi-test.hostname
Oct 13 14:41:44 mod_bosh	info	New BOSH session, assigned it sid '70f220d2-2ca1-414e-9e4e-07589659cd1c'
Oct 13 14:41:45 bosh70f220d2-2ca1-414e-9e4e-07589659cd1c	info	Authenticated as username@jitsi-test.hostname
Oct 13 14:41:45 bosh70f220d2-2ca1-414e-9e4e-07589659cd1c	info	BOSH client disconnected: session close
Oct 13 14:42:16 bosh9aa8f42e-f759-4c42-a28b-8f0f04c3fcf5	info	BOSH client disconnected: session close
Oct 13 14:42:16 speakerstats.jitsi-test.hostname:speakerstats_component	warn	A module has been configured that triggers external events.
Oct 13 14:42:16 speakerstats.jitsi-test.hostname:speakerstats_component	warn	Implement this lib to trigger external events.
Oct 13 14:42:18 mod_bosh	info	New BOSH session, assigned it sid '208cabd6-f6c4-4e26-8b00-f85a72ccba30'
Oct 13 14:42:18 bosh208cabd6-f6c4-4e26-8b00-f85a72ccba30	info	Authenticated as rcagmmnyyqgs80ph@guest.jitsi-test.hostname
Oct 13 14:42:27 mod_bosh	info	New BOSH session, assigned it sid '036731d4-3a15-463e-bca2-caaf79c22283'
Oct 13 14:42:27 bosh036731d4-3a15-463e-bca2-caaf79c22283	info	Authenticated as username@jitsi-test.hostname
Oct 13 14:42:28 bosh036731d4-3a15-463e-bca2-caaf79c22283	info	BOSH client disconnected: session close
Oct 13 14:42:37 speakerstats.jitsi-test.hostname:speakerstats_component	warn	A module has been configured that triggers external events.
Oct 13 14:42:37 speakerstats.jitsi-test.hostname:speakerstats_component	warn	Implement this lib to trigger external events.
Oct 13 14:42:37 general	info	Room actualclaritiesplaceby@conference.jitsi-test.hostname destroyed by occupant rcagmmnyyqgs80ph@guest.jitsi-test.hostname/s03cgwd5
Oct 13 14:42:45 bosh208cabd6-f6c4-4e26-8b00-f85a72ccba30	info	BOSH client disconnected: session close

is there anything else to do to get the newest update running? i changed my config.js, prosody-conf and interface_config.js with these from github and install normally the ubuntu-packages.

i checked my config.js and found out that i was hiding some buttons, here is my config:

    toolbarButtons: [
        'camera',
        'chat',
        'closedcaptions',
        'desktop',
  //    'dock-iframe'
        'download',
        'embedmeeting',
  //    'etherpad',
  //    'feedback',
        'filmstrip',
        'fullscreen',
        'hangup',
        'help',
    //    'highlight',
        'invite',
    //    'linktosalesforce',
    //    'livestreaming',
        'microphone',
        'noisesuppression',
        'participants-pane',
        'profile',
        'raisehand',
    //    'recording',
        'security',
        'select-background',
        'settings',
        'shareaudio',
        'sharedvideo',
        'shortcuts',
        'stats',
        'tileview',
        'toggle-camera',
     //    'undock-iframe',
       'videoquality',
   ],

if i uncomment my hidingoptions, the whiteboard-tool is there! so in config.js there is something missing for the whiteboard feature, isn’t it?

if i add

'whiteboard',

to the list of buttons, it works as well.

thanks for your reminder and help.

so my last question: is there already an installation guide to install an own whiteboard-backend?

Aha, the button!

The backend is here and the README contains instructions: GitHub - jitsi/excalidraw-backend: Excalidraw collaboration backend for Jitsi

Hi,

I would like to integrate a new whiteboard tldraw.com
What is the best possible way to do it ?

We “just” render the whiteboard component and use a new Prosody plugin to store the metadata (room ID and encryption key) so others can join.

You could try to replace it, but I don’t think ti will be very simple.

Requesting you to elaborate a bit more to understand the approach properly

I don’t think I can elaborate because we have never attempted to do that.

Hi saghul,
Is there any possible to add a callback/api in jitsi sdk, so we can integrate another white board solution with a simple way?
Such as, we already have an existing white board online, it will be better that jitsi can allow us only to specify a URL through the new callback/api to replace current the stream of white-board when the “whiteboard” button is clicked,
if so, all white board related stuff (room, roles and so on) can be delegated to another existing white board solution of us.

We have no plans (or available resources TBH) to attain that, sorry.