Jitsi Meet has had a whiteboard since 2023, but if you're running your own Jitsi server, chances are you've never seen the button. That's not a bug. Self-hosted deployments don't get the whiteboard enabled by default, unlike meet.jit.si, where it just works.

The feature itself is Excalidraw, the open-source drawing app, embedded inside a Jitsi Meet call. Getting it working on your own server means running a small backend service and pointing your Jitsi config at it. Not hard once you know what's missing, but the pieces are scattered across a handful of community forum threads and one GitHub compose file, which is why most self-hosters just give up and assume the feature doesn't exist for them. It does. Here's exactly how to turn it on, for both Docker and manual installs, checked against the current jitsi/docker-jitsi-meet and jitsi/excalidraw-backend repos as of July 2026.

What the Whiteboard Actually Does

Any participant a moderator allows can open a shared canvas mid-call: draw, add sticky notes, drop in shapes and text, and see everyone else's changes update live. It's built on Excalidraw, and Jitsi's own team has said as much directly, calling it "an excellent whiteboarding piece of software, which is open source, of course," with some tweaks to fit the video call UI.

Whatever gets drawn can be exported as a PNG or SVG at any point, so a session's output doesn't have to live only inside the call.

Why Self-Hosted Servers Miss It

The whiteboard isn't part of the core Jitsi Meet web app. It depends on a separate service, excalidraw-backend, that relays drawing updates between participants over WebSockets. meet.jit.si runs that service for you. A self-hosted install has to run it too, or the whiteboard button simply never renders, no matter what's in config.js.

Before you start

You'll need: a Jitsi Meet server you already control (Docker or a manual apt install), a domain or subdomain you can point at the whiteboard backend with a valid SSL certificate, and access to edit your Prosody configuration. If you're running Meetrix's pre-configured Jitsi Meet AMI, check the whiteboard button first, several of our AWS Marketplace listings already ship with it wired up.

Enable It on Docker

If your Jitsi Meet install runs on jitsi/docker-jitsi-meet, this is the fast path. The repo already ships a whiteboard.yml file that wires up the jitsi/excalidraw-backend image, you're just switching it on.

Step 1: Uncomment the whiteboard variables in .env

Open your .env file and set these two, uncommenting them if they're already there:

# Internal Docker network address of the whiteboard container
WHITEBOARD_COLLAB_SERVER_URL_BASE=http://whiteboard.meet.jitsi

# Public URL participants' browsers will actually connect to
WHITEBOARD_COLLAB_SERVER_PUBLIC_URL=https://whiteboard.yourdomain.com

Step 2: Start the stack with the whiteboard override

docker compose -f docker-compose.yml -f whiteboard.yml up -d

Docker Compose merges whiteboard.yml on top of your existing stack, adding the excalidraw-backend container on the same internal network as everything else. No source code to build, no systemd service to write.

Step 3: Confirm the public URL is reachable over HTTPS

Whatever domain you set as WHITEBOARD_COLLAB_SERVER_PUBLIC_URL needs a working SSL certificate and a reverse proxy rule that upgrades /socket.io/ connections to WebSockets. If you're already terminating SSL for your Jitsi domain, add the whiteboard as a location block on that same nginx config rather than standing up a whole new site.

Enable It on a Manual Install

If Jitsi Meet was installed the traditional way, straight from the Jitsi Debian/Ubuntu apt repo rather than Docker, there's more to wire up, since there's no bundled whiteboard container to lean on. This is the version that takes an afternoon, not ten minutes. If you're not already comfortable editing Prosody's Lua config, budget real time for it, or move to Docker first and skip this section entirely.

Step 1: Deploy the excalidraw-backend service

sudo useradd -r excali
sudo git clone https://github.com/jitsi/excalidraw-backend.git /opt/excalidraw-backend
sudo chown -R excali:excali /opt/excalidraw-backend
cd /opt/excalidraw-backend
sudo -u excali npm install
sudo -u excali npm run build

Copy .env.development to .env.production and set PORT to whatever port you want the service listening on locally, 3002 is the common default in most write-ups. Run it once by hand to confirm it starts cleanly, then wrap it in a systemd unit so it survives a reboot:

sudo nano /etc/systemd/system/excalidraw-backend.service
[Unit]
Description=Excalidraw backend for Jitsi Meet whiteboard
After=network.target

[Service]
Type=simple
User=excali
WorkingDirectory=/opt/excalidraw-backend
ExecStart=/usr/bin/npm start
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now excalidraw-backend

Step 2: Reverse proxy the WebSocket connection

Add a location block to your Jitsi web nginx config (or a dedicated subdomain's config) that proxies Socket.IO traffic to the backend and upgrades the connection:

location /socket.io/ {
    proxy_pass http://127.0.0.1:3002/socket.io/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

Reload nginx after saving, and confirm the SSL certificate covers whatever hostname you're using here.

Step 3: Enable the room_metadata Prosody module

The whiteboard button won't show up without this, even with a fully working backend. mod_room_metadata_component ships with jitsi-meet-prosody already, in /usr/share/jitsi-meet/prosody-plugins/, it just isn't switched on by default.

sudo nano /etc/prosody/conf.avail/your-domain.cfg.lua

Add "room_metadata" to the modules_enabled list inside your existing Component "conference.your-domain" block, then add a new component for the metadata service itself:

Component "metadata.your-domain" "room_metadata_component"
    muc_component = "conference.your-domain"
sudo systemctl restart prosody

Step 4: Point config.js at your whiteboard backend

sudo nano /etc/jitsi/meet/your-domain-config.js
whiteboard: {
    enabled: true,
    collabServerBaseUrl: 'https://whiteboard.yourdomain.com',
    userLimit: 25,
}

No restart needed for config.js changes, Jitsi Meet's web frontend picks it up on the next page load. Reload a meeting and the whiteboard icon should appear in the toolbar.

Whiteboard button still not showing?

Work through these in order, they cover nearly every case reported on the Jitsi community forum: the browser console shows a failed WebSocket connection to the collab server (usually a proxy or certificate problem), room_metadata isn't actually in modules_enabled after a Prosody restart, or the collabServerBaseUrl in config.js doesn't match the domain your reverse proxy is actually listening on. That last one catches people constantly. It's an easy typo to miss because nothing errors, the button just quietly never appears.

One thing worth flagging: some older blog posts and forum answers reference a single WHITEBOARD_ENABLED environment variable for Docker installs. That's not how the current docker-jitsi-meet repo does it. It's the two URL variables above, nothing toggles the feature on its own. If you copy an env file from a two-year-old tutorial, this is where it'll quietly break.

Keeping the Whiteboard Usable

Excalidraw's canvas is collaborative in real time, which means it gets sluggish once too many people are drawing on it at once. Set userLimit in the whiteboard config block to keep it responsive. I'd start at 20-25 for most team calls and only raise it if nobody complains, and add a limitUrl pointing to an internal help page for when people hit that ceiling and ask why.

Frequently Asked Questions

Why don't I see a whiteboard button in Jitsi Meet?

Self-hosted Jitsi Meet servers don't enable the whiteboard by default. You need to deploy the excalidraw-backend service yourself and add a whiteboard block to config.js. On meet.jit.si it's already on.

Is Jitsi's whiteboard the same as Excalidraw?

Yes. Jitsi built its whiteboard directly on Excalidraw, the open-source drawing app, with some UI adjustments to fit inside a video call. The backend service is literally called excalidraw-backend.

Do I need a separate domain for the whiteboard?

You need a reachable URL over HTTPS with working WebSocket support, either a subdomain like whiteboard.yourdomain.com behind its own SSL certificate, or a path on your existing Jitsi domain's nginx config.

What is room_metadata and why does the whiteboard need it?

It's a Prosody module bundled with jitsi-meet-prosody that lets participants sync shared room state, including whether a whiteboard is currently open. Without it enabled in modules_enabled, the whiteboard button won't appear even with a working backend.

Can I limit how many people join a whiteboard at once?

Yes, set userLimit in the whiteboard config block. Excalidraw's collaborative canvas gets sluggish with a lot of simultaneous editors, so capping it protects performance in larger calls.

Does docker-jitsi-meet make this easier?

Considerably. Docker installs ship a whiteboard.yml file with the excalidraw-backend container already wired up, so it's mostly uncommenting two environment variables and starting one more container instead of building anything from source.

Related Articles

Skip the Config Files Entirely

Meetrix's pre-configured Jitsi Meet AMI (50 users, with recording) handles the server setup, TURN configuration, and SSL for you, so features like the whiteboard are one less thing to wire up by hand.

Launch Jitsi Meet on AWS Marketplace