Self-hosted Excalidraw workspaces with collections, real-time collaboration, sharing, history, backups, and local or OpenID Connect authentication.
Self-host Excalidraw with Docker Compose, or read the documentation at excalidash.xyz.
git clone https://github.com/ZimengXiong/ExcaliDash.git
cd ExcaliDash
docker compose -f docker-compose.prod.yml up -dOpen http://localhost:6767. Configuration and deployment guidance live in the documentation.
Drop a comment pin anywhere on a canvas, reply in a thread, and resolve it when it is handled. Pins stay anchored to their spot while you pan and zoom, appear live for everyone in the drawing, and are open to anyone who can view it — including share-link recipients. Drag a pin to re-anchor it if the drawing moved on underneath it. The drawing's owner can moderate any thread; everyone else can remove and move their own comments.
The canvas uses Excalidraw's wheel behaviour (wheel pans, Cmd/Ctrl+wheel zooms) by default. Turn on Settings → Scroll wheel zooms the canvas to make a plain wheel zoom instead; the choice is stored per user.
ExcaliDash serves a remote MCP endpoint at <your ExcaliDash URL>/mcp (Streamable HTTP). It lets AI assistants store .excalidraw files as drawings, optionally in a collection, read drawings back, and replace or edit existing ones.
Claude Desktop / claude.ai: add a custom connector with the URL https://excalidash.example.com/mcp (on Team/Enterprise plans an owner adds it once for everyone). Each person then clicks Connect, signs in to ExcaliDash, and approves access. Behind the scenes this creates a non-expiring API key named "Claude (OAuth)" for them; revoking it under Settings → API Keys disconnects Claude.
Claude Code or other clients: use the same OAuth flow, or pass an API key from Settings → API Keys directly:
claude mcp add --transport http excalidash https://excalidash.example.com/mcp \
--header "Authorization: Bearer exd_..."Either way, the tools can do exactly what the key's scopes allow. OAuth only accepts Claude's callback URLs and localhost (loopback) redirects.
| Tool | What it does |
|---|---|
list_collections |
Collections you own or that are shared with you. |
list_drawings |
Drawings, newest first; filter by collection and/or search. |
get_drawing |
Read a drawing as compact elements (format: "summary", labels folded into their shapes) or full Excalidraw elements (format: "file"); paged with offset/limit. |
add_drawing |
Create a drawing from the file's JSON (content), with optional name, collection and createCollectionIfMissing. |
replace_drawing |
Overwrite a drawing's scene, found by drawingId or exact name (+ optional collection); optional rename. |
upsert_elements |
Add or update elements by id and delete others (deleteIds), leaving the rest of the drawing untouched. |
collection accepts an id or a name, and drawingId an id or the drawing's URL. Replacing keeps the drawing's id, link, collection and sharing, and editors that have it open reload; upsert_elements does the same. To upload a drawing too large for one tool call, create it with the first batch of elements and send the rest through upsert_elements. Thumbnails are regenerated by the dashboard. The server is remote, so it cannot read files on your machine; the assistant sends the file contents. Code: backend/src/mcp/.
ExcaliDash is licensed under the GNU Lesser General Public License v3.0.
