excalidraw-collaboration is a free, open source collaboration & communication project written in several languages and released under MIT. It has 634 GitHub stars, 106 forks and 4 open issues, and was last pushed 3 months ago. On this registry it ranks #54 of 62 tracked projects in Collaboration & Communication, with 5 head-to-head comparisons available. It gained 6 stars over the last 30 tracked days.

What is excalidraw-collaboration?

Excalidraw Collaboration is a self-hostable Excalidraw stack that adds live collaboration and scene storage to the drawing tool through a small set of Docker Compose deployment examples, and it is aimed at teams and individuals who want to run their own whiteboard instead of depending on a hosted third-party service.

What it is

The project is a deployment kit rather than a new drawing application. It bundles three services that are wired together for you: an Excalidraw frontend configured through runtime environment variables, an HTTP storage backend for scenes and files, and a Socket.IO room service for real-time collaboration that is powered by excalidraw-room-go, a Go implementation of the Excalidraw Socket.IO room server. The repository ships the exact service wiring in basic/docker-compose.yaml and advanced-nginx/compose.yml, so the topology of browser, frontend, storage backend, room server, and Nginx with TLS is already defined rather than left to the operator.

The concrete problem it solves is assembly. Excalidraw itself is a client, and running a private collaborative instance normally means separately obtaining a frontend image, a storage backend, a compatible room server, and a reverse proxy that knows how to route HTTP storage traffic and WebSocket upgrade traffic to the right places. This project replaces that manual assembly with a working stack: Nginx forwards / to the frontend, /storage/ to storage, and /socket.io/ to the room service with WebSocket upgrade headers. It lives in the Docker Compose and self-hosting ecosystem around Excalidraw, and it is released under the MIT licence.

Key capabilities

  • Runs an Excalidraw frontend configured at runtime through VITE_APP_HTTP_STORAGE_BACKEND_URL and VITE_APP_WS_SERVER_URL, which lets one image serve different storage and WebSocket endpoints.
  • Provides HTTP storage for scenes and files so drawings survive beyond a single browser session.
  • Supplies real-time collaboration through a Socket.IO room service, using the pinned image alswl/excalidraw-room-go:v0.1.0.
  • Exposes the standard collaboration flow: open the app, select Live Collaboration, then share the room link with another browser session.
  • Includes two deployment examples: basic/docker-compose.yaml for local development with frontend, storage backend, and room service on separate local ports, and advanced-nginx/compose.yml with advanced-nginx/draw.example.com.conf for one-domain HTTPS.
  • Offers a one-click Railway template and a live Railway demo that has been verified with alswl/excalidraw-room-go:v0.1.0.
  • Ships advanced-nginx/.env-example for setting host names and database credentials, and documents a configurable Traefik-based Compose example in Someone0nEarth/excalidraw-self-hosted.

Who uses it and how

  • Developers evaluating collaboration locally clone the repository and bring up basic/docker-compose.yaml, which exposes the frontend, storage backend, and room service on separate local ports.
  • Operators running a single public domain copy .env-example to .env, set host names and database credentials, and configure the supplied Nginx virtual host so that HTTPS terminates in front of all three services.
  • Teams that split traffic across load balancers configure TLS for the WebSocket and storage endpoints separately and point the frontend at each with the two public URL variables; the FAQ describes an AWS-oriented variant of this.
  • Users who need a throwaway or demonstration instance deploy from the Railway template, or open the hosted Railway demo.
  • Operators standardized on Traefik follow the external Traefik Compose example instead of the bundled Nginx configuration.

Getting started

With Docker Compose installed, clone https://github.com/alswl/excalidraw-collaboration.git, enter the directory, and run docker-compose -f basic/docker-compose.yaml up -d. For a public instance, deploy advanced-nginx/compose.yml with the supplied Nginx virtual host and .env, or use the one-click Railway template.

How it compares

It sits inside a small family of related projects: excalidraw-room-go supplies the Go Socket.IO room server, excalidraw-storage-backend supplies the storage backend, and a self-hosting-focused Excalidraw fork supplies the frontend image, while excalidraw.alswl.com is a separate static Excalidraw site with Chinese font support. This repository is the piece that combines the other three into a runnable deployment with reverse proxy configuration and deployment examples. A Traefik-based alternative for the same problem is maintained outside this project in Someone0nEarth/excalidraw-self-hosted.

When to use it — and when not to

A self-hoster takes on Docker Compose, an Nginx reverse proxy with TLS, a storage backend, and the database credentials it needs, plus the requirement that HTTPS be present because collaboration depends on browser crypto APIs. Anyone who wants a managed, zero-ops whiteboard should not pick it. Note also that the collaboration service is pinned to a single released room image, alswl/excalidraw-room-go:v0.1.0, and that the production path expects the operator to edit .env and an Nginx virtual host by hand.

project readme (upstream, from github) — read inline

Excalidraw Collaboration

Self-hosted Excalidraw with live collaboration, scene storage, and a small set of Docker Compose deployment examples.

Try it online

  • The Railway demo is live and has been verified with alswl/excalidraw-room-go:v0.1.0.

If the demo is unavailable, deploy your own instance from the Railway template:

Deploy on Railway

Snapshot

Excalidraw collaboration snapshot

What is included

  • An Excalidraw frontend configured through runtime environment variables.
  • HTTP storage for scenes and files.
  • A Socket.IO room service for real-time collaboration, powered by excalidraw-room-go.
  • A local Compose example and an HTTPS/Nginx production example.
flowchart LR
  Browser[Browser] --> Frontend[Excalidraw frontend]
  Browser -->|scenes and files| Storage[Storage backend]
  Browser <-->|Socket.IO| Room[Go room server]
  Nginx[Nginx + TLS] --> Frontend
  Nginx --> Storage
  Nginx --> Room

The exact service wiring is defined in basic/docker-compose.yaml and advanced-nginx/compose.yml.

Quick start

Prerequisite: Docker Compose.

git clone https://github.com/alswl/excalidraw-collaboration.git
cd excalidraw-collaboration
docker-compose -f basic/docker-compose.yaml up -d

Open , select Live Collaboration, then share the room link with another browser session.

Service Local address
Excalidraw
Storage backend
Room server

To stop the stack:

docker-compose -f basic/docker-compose.yaml down

Deploy

Local development

Use basic/docker-compose.yaml. It exposes the frontend, storage backend, and room service on separate local ports.

One-domain HTTPS deployment

Use advanced-nginx/compose.yml together with draw.example.com.conf. Copy .env-example to .env, set the host names and database credentials, then configure the supplied Nginx virtual host.

The Nginx configuration forwards / to the frontend, /storage/ to storage, and /socket.io/ to the room service with WebSocket upgrade headers. HTTPS is required for browser crypto APIs used by collaboration.

Public endpoints

For a public deployment, configure these frontend variables with your public URLs:

  • VITE_APP_HTTP_STORAGE_BACKEND_URL
  • VITE_APP_WS_SERVER_URL

The values used by each example are visible in its Compose file. Keep the room image pinned to a released version; the current examples use alswl/excalidraw-room-go:v0.1.0.

Traefik

A configurable Traefik-based Docker Compose example is available in Someone0nEarth/excalidraw-self-hosted.

Related projects

Community and support

Questions, bug reports, and deployment experiences are welcome in GitHub Issues. For a code change, please open a pull request with a short description and the validation you ran.

FAQ

How do I deploy with separate public endpoints?

If frontend traffic, WebSocket traffic, and storage traffic are exposed through separate load balancers, configure TLS for the WebSocket and storage endpoints. Set VITE_APP_HTTP_STORAGE_BACKEND_URL to the storage endpoint and VITE_APP_WS_SERVER_URL to the WebSocket endpoint.

For an AWS-oriented deployment discussion, see issue #22.

Why does collaboration fail with generateKey errors?

TypeError: Cannot read properties of undefined (reading 'generateKey')

Excalidraw uses browser cryptography APIs for collaboration. Open the site over HTTPS, or use http://localhost for local development.

Upgrade guide

v0.15.0 → v0.16.1

Replace REACT_APP_ environment variables with VITE_APP_ variables.

Roadmap

  • Self-hosting
  • Live collaboration
  • Docker Compose support
  • Dynamic frontend environment configuration
  • Docker Hub images
  • HTTPS demo and documentation
  • Railway one-click deployment
  • S3 storage support
  • SSO support
  • Helm support

Further reading

License

MIT

Contributors

Contributors

Frequently asked questions

Is excalidraw-collaboration free to use?

excalidraw-collaboration is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does excalidraw-collaboration do?

excalidraw with collaboration feature, self-hosting, and only one-click deploy

What is excalidraw-collaboration written in?

excalidraw-collaboration's source is publicly available at https://github.com/alswl/excalidraw-collaboration, with 634 GitHub stars.