> Source: https://meetrix.io/blogs/enable-whiteboard-jitsi-meet/
> Markdown copy of that page. Cite the URL above, not this file.

Collaboration

# Jitsi Whiteboard: How to Enable It in Jitsi Meet (Excalidraw Setup)

[By Binuka Ranatunga](https://meetrix.io/blogs/authors/binuka-ranatunga/) • September 29, 2026 • 9 min read

Revised by

-   ![Portrait of Hiruna Kumara, Senior DevOps Engineer at Meetrix](https://meetrix.io/blog-images/assets/authors/hiruna-kumara.webp)[Hiruna Kumara](https://meetrix.io/blogs/authors/hiruna-kumara/)Senior DevOps Engineer, Meetrix

This article was reviewed and refreshed for accuracy. Last reviewed September 2026.

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](https://github.com/jitsi/docker-jitsi-meet) and [jitsi/excalidraw-backend](https://github.com/jitsi/excalidraw-backend) repos as of July 2026.

## What the Jitsi Meet 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](https://excalidraw.com/), which also shows up on most lists of [open-source whiteboard tools](https://meetrix.io/blogs/open-source-whiteboard-tools/), 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. Like Etherpad and a few other [Jitsi Meet features most people never find](https://meetrix.io/blogs/jitsi-meet-hidden-features/), 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 the Excalidraw Backend 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. If the base stack isn't running yet, our [Jitsi Docker Compose walkthrough](https://meetrix.io/blogs/jitsi-docker-compose/) gets you there first, and the [Jitsi handbook's Docker guide](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker/) lists every other `.env` option.

### Step 1: Uncomment the whiteboard variables in .env

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

```bash
# 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

```bash
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 on Ubuntu](https://meetrix.io/blogs/install-jitsi-meet-ubuntu/), 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

```bash
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:

```bash
sudo nano /etc/systemd/system/excalidraw-backend.service
```

```ini
[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
```

```bash
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:

```nginx
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. Prosody is the XMPP server that carries room state between participants (see [how Jitsi's components fit together](https://meetrix.io/blogs/jitsi-architecture/)), and the whiteboard's open or closed status travels through it. `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.

```bash
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:

```lua
Component "metadata.your-domain" "room_metadata_component"
    muc_component = "conference.your-domain"
```

```bash
sudo systemctl restart prosody
```

### Step 4: Point config.js at your whiteboard backend

```bash
sudo nano /etc/jitsi/meet/your-domain-config.js
```

```javascript
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. For failures outside the whiteboard, our list of [common Jitsi Meet errors](https://meetrix.io/blogs/jitsi-meet-common-errors/) covers the usual suspects.

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 Jitsi Drawing Sessions 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 the Jitsi Meet whiteboard button?

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.

What does "real-time collaboration requires a separate WebSocket server" mean?

Jitsi shows this when the whiteboard opens but no collab server URL is set. You can still draw alone, but nobody sees your strokes. Set collabServerBaseUrl in config.js, or WHITEBOARD\_COLLAB\_SERVER\_PUBLIC\_URL on Docker, to your excalidraw-backend address.

## Related Articles

[

### Jitsi Video Conferencing: Transforming Education Through Seamless Virtual Classrooms

A detailed exploration of how Jitsi Video Conferencing is transforming education with seamless virtual classrooms, enhancing student engagement, and providing a secure, collaborative learning environment.

By Maneesha Shehara • Meetrix.io

](https://meetrix.io/blogs/jitsi-virtual-classrooms/)

[

### Jitsi Customization: How to Customize the Jitsi Meet Front End

Jitsi customization step by step: change the Jitsi Meet logo and favicon, brand the UI with dynamicBrandingUrl in config.js, trim the toolbar, then build and deploy.

By Kelum Sampath • Meetrix.io

](https://meetrix.io/blogs/customize-jitsi-meet-frontend/)

[

### Setup Jitsi Meet on AWS-Developer Guide

A developer guide to set up Jitsi Meet on AWS for a scalable and secure video conferencing platform.

By Dinesh Chathuranga • Meetrix.io

](https://meetrix.io/blogs/setup-jitsi-meet-aws-dev-guide/)

[

### Setup Jitsi Meet on GCP - Developer Guide

Deploy and self-host Jitsi Meet on Google Cloud Platform with our step-by-step developer guide. Launch from the GCP Marketplace, point your domain, secure it with SSL, and manage the server for reliable, high-performance video conferencing.

By Hiruna Kumara • Meetrix.io

](https://meetrix.io/blogs/setup-jitsi-meet-on-gcp-developer-guide/)

## 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](https://aws.amazon.com/marketplace/pp/prodview-sc2ngkllox3gs)

Meetrix Store

Jitsi Meet

Self-hosted video calls for 50 to 500 users

[Deploy it](https://meetrix.io/store/jitsi-meet/)

Meetrix Store New

Deploy what this guide covers, pre-configured.

-    [Jitsi Meet Self-hosted video calls for 50 to 500 users](https://meetrix.io/store/jitsi-meet/)
-    [Coturn TURN/STUN for WebRTC, no per-minute relay fees](https://meetrix.io/store/coturn/)
-    [Mattermost Team chat, a self-hosted Slack alternative](https://meetrix.io/store/mattermost/)
-    [RustDesk Remote desktop AMI, a TeamViewer alternative](https://meetrix.io/store/rustdesk/)
-    [Plane Issues, cycles and roadmaps, a Jira alternative](https://meetrix.io/store/plane/)
-    [Mailcow Business email on your own domain](https://meetrix.io/store/mailcow/)

[Browse all products](https://meetrix.io/store/)
