Why does the Jitsi whiteboard open but not sync?

Short answer

Check three separate paths: the whiteboard settings served to browsers, the collaboration backend connection, and Jitsi room metadata that shares the board details. A loaded canvas or a 101 WebSocket response alone does not prove collaboration works. The October 2026 report remains unresolved; use the checks below to identify the failing layer. [S1][S2][S3]

Scope: Self-hosted Jitsi Meet. Docker configuration checked at stable-11248, collaboration backend 2026.3.0, and the bundled Jitsi Excalidraw 0.18.7. Package installations use a different configuration layout. The latest report does not identify an exact package version. Do not assume every installation has its cause. [S1][S4][S5]

Identify which layer fails

Observation What to check next
No Whiteboard control Served feature configuration, toolbar customization, moderator role and metadata support. [S2]
Canvas opens, but collaboration request fails Backend availability, requested host/path, certificate and WebSocket proxying. [S3][S5]
Connection opens, but only init-room appears Whether the client sends join-room and receives room events. Connection initialization is not room synchronization. [S3]
Other participants never receive the board, or report decrypt errors Shared room metadata and release compatibility, as well as the transport. An older documented failure involved different encryption keys. [S2][S7]
Live edits work, but reopening an empty meeting loses content or images fail Investigate persistence separately. A live peer-assisted rejoin is not proof of durable storage. [S6]

First record the installed versions. Note whether this is Docker, a package installation or a custom distribution. Keep the Meet release files, client assets and Prosody configuration aligned before borrowing settings from another version. [S4][S5][S8]

1. Reproduce with two independent clients

Use a disposable meeting with no private content. Open one browser session as moderator and join from another browser profile or device. Open the whiteboard from the moderator, add a simple shape, and check the other participant. Then add a different shape from the second client and check the first.

Record whether the second participant receives the board automatically, whether both see the same content, and whether either browser reports a connection or decrypt failure. This is a diagnostic procedure, not a promise that reopening the board repairs it. Jitsi shares collaboration details through conference metadata, while the collaboration backend relays updates. [S2][S3]

Avoid using two copies of a private invitation in a public support report. Do not publish room keys, full whiteboard state URLs, tokens or unredacted network exports.

2. Docker first: check the generated feature configuration

In stable-11248, the optional whiteboard.yml adds a whiteboard service using jitsi/excalidraw-backend:2026.3.0. Merely drawing a canvas does not demonstrate that this service is configured and reachable. [S5]

For the release’s built-in web proxy path, the documented environment input is:

dotenv
WHITEBOARD_COLLAB_SERVER_URL_BASE=http://whiteboard.meet.jitsi

Merge that entry into your existing environment only if you are enabling this topology. Include the release-matched whiteboard.yml in your normal Compose project and maintenance procedure. This internal Docker URL is for the web container; browsers should receive the public Meet URL as whiteboard.collabServerBaseUrl. It is not a public HTTP endpoint recommendation. [S5]

From that existing project, these read-only commands check the selected services and running status:

Terminal
docker compose -f docker-compose.yml -f whiteboard.yml config --services
docker compose -f docker-compose.yml -f whiteboard.yml ps whiteboard web

Preserve your actual project name, environment file and additional Compose overrides. The first command should include whiteboard; the second should show its running state if it was started. A service appearing in configuration alone does not prove it is running. Do not paste a full rendered Compose configuration into support channels because it can contain secrets. [S5]

If you deliberately host the backend at its own public origin, stable-11248 also accepts:

dotenv
WHITEBOARD_COLLAB_SERVER_PUBLIC_URL=https://whiteboard.example.com

Replace that placeholder with your real backend origin. In the checked template, this public setting takes precedence when both variables are present. Use an intentional topology and valid public HTTPS; do not expose an internal container hostname to browsers. [S5]

Inspect the actual config.js response in the browser’s Network panel, rather than trusting an old host file. Check whiteboard.enabled and whiteboard.collabServerBaseUrl. For the built-in proxy topology, expect the public Meet origin; for a separate backend, expect that backend’s public origin. If your custom values are missing, follow custom-config.js diagnostics. [S5]

3. Follow the actual collaboration request

In browser developer tools, open Network, filter WebSocket requests, then reopen the board. The checked client uses Socket.IO; the standard backend endpoint is /socket.io/. The Jitsi web template proxies that path when WHITEBOARD_COLLAB_SERVER_URL_BASE is set. This is a separate route from meeting signaling at /xmpp-websocket. [S3][S5][S6]

Check the requested origin and path, status, connection lifetime and proxy errors. A 101 Switching Protocols response confirms the WebSocket upgrade, not that a scene has synchronized. The backend sends init-room on connection; the client must join a collaboration room and exchange updates. In a healthy two-client session we observed join-room, room-user-change and binary client-broadcast traffic after the upgrade. These observations are from the component lab below. [S3][S6]

For a reverse proxy, verify that /socket.io/ reaches the intended backend, keeps its query parameters and permits WebSocket upgrade. The stable-11248 web template includes HTTP/1.1, Upgrade and Connection headers for this route. If an outer proxy forwards to Jitsi’s web container, it must also preserve this WebSocket path. See the reverse proxy guide. [S5]

If the request fails, correct the demonstrated problem: wrong endpoint, unavailable backend, upstream name resolution, failed TLS validation or missing upgrade handling. A backend home page returning HTTP 200 is only a reachability check. Keep certificate validation enabled and test the same HTTPS route participants use. [S3][S5]

4. Check room metadata when transport works

In the checked Meet source, the moderator’s new board setup generates an encryption key and publishes collaboration details through the conference metadata handler. Receiving clients configure their boards from those details. A working backend connection cannot compensate for missing or inconsistent meeting metadata. [S2]

Do not paste a 2023 module list into a current installation. Issue #14001 described a NixOS installation on Meet 1.0.6943 where older room_metadata handling discarded updates without jitsi_session. The reporter recovered after fixing that module configuration, and PR #14012 added a dependency. This is a dated, specific case, not the diagnosis of the October 2026 report. [S7]

Both the stable-11248 Docker template and the corresponding package Prosody example now define a room_metadata_component component with a muc_component reference. Compare your generated configuration against your exact release’s template, including the component domain and main MUC domain. Do not switch authentication modes, regenerate meeting keys manually or overwrite your full Prosody configuration to test a guess. [S5][S8]

For Debian/Ubuntu packages, the checked installer creates the domain-specific Prosody file under /etc/prosody/conf.avail/<your-domain>.cfg.lua. This is not the Docker host input layout. Review package-managed configuration and your distribution’s overrides together; the latest report is a package installation, while our runtime checks below are component checks from a Docker web image. [S1][S8]

5. Interpret storage messages carefully

Storage not initialized missing does not, by itself, establish a live-sync failure. In Excalidraw 0.18.7, storage initialization is conditional, and the collaboration connection is opened separately. Our two-client lab exchanged edits while this message was present and no persistence backend was configured. This does not mean storage is correctly configured for your intended saving behavior. [S6]

The same release’s storage code logs Missing required fields when a combined condition is true: a room ID, room key or socket is missing, or the scene is already considered saved. Consequently, a message listing all three as true is not proof that one of them is absent. Trace the surrounding failure instead of adding arbitrary settings to silence that log. [S6]

Do not install a storage backend solely because this message appears. If saved scenes or images are your failing feature, investigate the exact storage implementation, credentials and version separately. We did not test durable storage or image uploads in this research. [S6]

Verify the correction

Repeat both editing directions with independent clients. Leave one connected while the other exits and rejoins, then confirm it receives the current board and can send a fresh edit back. Test through the normal public proxy and TLS path. If your requirement includes recovery after everyone leaves, test that separately with your configured storage service. [S2][S3][S6]

If it still fails, prepare a sanitized report: exact Meet/backend releases, installation method, browser versions, whether the second client receives board metadata, endpoint origin/path without room identifiers, handshake result, event names and the smallest relevant error. State whether live edits, rejoin or persistence fails. The current report #18034 remained open with no confirmed fix when checked on 20 October 2026. [S1]

What we verified and what remains open

On 20 October we used the packaged stable-11248 standalone whiteboard page, bundled Excalidraw 0.18.7, and an unmodified-source build of backend 2026.3.0. Two Chrome tabs used different loopback origins to separate browser storage. We observed edits in both directions, then a rejoin through an Nginx WebSocket proxy with the other peer still connected. The received scene contained both edits. Six additional protocol checks passed across direct and proxied paths. [S3][S4][S6]

This was a component lab, not a full meeting, native mobile test or production deployment. It did not exercise Jitsi/Prosody metadata, durable persistence or image uploads, and did not reproduce #18034. Local loopback HTTP was used only inside this lab; public deployment guidance retains HTTPS. These observations do not establish a universal fix or production verification.

Sources and maintenance

Reviewed 20 October 2026. Recheck the exact templates and bundled Excalidraw version after upgrades, and update the unresolved-report section when a maintainer-confirmed diagnosis or released fix appears.

Written by the Jitsi Help engineering team

Jitsi infrastructure engineers who deploy and run Jitsi Meet servers in production. Last updated . How we write our guides

Stuck on something this page does not cover? Ask a question below. Jitsi Help engineers read every one.

Did this fix it?

Something on this page is outdated or wrong?

Collect debug info

These commands gather what an engineer needs to diagnose a Jitsi server. Copy them, run them, and keep the output.

Terminal
# Run on the server, from your docker-jitsi-meet folder

# 1. Every service should be "running" (or "healthy")
docker compose ps

# 2. Which images and release tags are running
docker compose images

# 3. Recent logs from the core services
docker compose logs --tail=200 web prosody jicofo jvb

# 4. The settings most fixes depend on
grep -E '^(PUBLIC_URL|JVB_ADVERTISE_IPS|ENABLE_LETSENCRYPT|ENABLE_AUTH|AUTH_TYPE)=' .env

# 5. Is anything listening for media on UDP 10000?
sudo ss -ulnp | grep 10000

Installed with the Debian packages instead of Docker? Read the service logs with:

Terminal
sudo journalctl -u prosody -u jicofo -u jitsi-videobridge2 --since "1 hour ago"

Remove passwords, secrets and tokens before you share any output.

Send the output to an engineer

Frequently asked questions

Does a working WebSocket prove the whiteboard is syncing?

No. The backend sends init-room when a client connects. Room joining, receiving updates and decrypting them still need to work. Verify an edit in each direction.

Does Storage not initialized missing mean live collaboration is broken?

Not by itself. We observed that message during working two-client live synchronization without a persistence backend. Saving scenes and images is a separate path.

Should I add jitsi_session to fix every whiteboard problem?

No. That advice came from a 2023 installation using older metadata modules. stable-11248 uses room_metadata_component. Compare your exact release's templates before changing Prosody.

Is there a confirmed universal fix for issue #18034?

No confirmed fix was present when we reviewed it on 20 October 2026. Our component lab did not reproduce that complete meeting failure.

Discussion

    Stuck, or would rather not do this by hand?

    Deploy it in one click

    A private Jitsi server in your own AWS account with SSL, your domain and optional recording, transcription and JWT. Free 15 minute trial.

    Start free trial

    Talk to a Jitsi engineer

    Setup, fixes, branding, recording, scaling. Tell us what is happening and we reply with a plan and a quote.

    Get expert help

    Related

    Recently updated