Skip to content

Releases

v0.12.0

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 12 Nov 18:34
93552d6

Open one instance at more than one address, pull the image from Docker Hub, and read the new blog.

New

  • More than one address with TRUSTED_ORIGINS. Set an optional, comma-separated list of extra origins, for example http://192.168.1.20:3000,http://nas.local:3000. Sign-in and live collaboration then work at those addresses too. NAS app stores (Umbrel, CasaOS, TrueNAS, Unraid) open apps this way. BASE_URL stays the main address: SSO and MCP OAuth still work only there. If an entry uses http://, sign-in cookies drop the Secure flag, so a plain-HTTP LAN address can keep a sign-in. See "More than one address" in the Environment docs (#286).
  • Docker Hub. The image is now also on Docker Hub as maciekzygmunt/excaliself, with the same tags as GHCR. GHCR stays the default in our compose files (#284).
  • Deploy on Hostinger and Portainer. The README and docs have a "Deploy on Hostinger" button, and the repo has a Portainer stack template (portainer-template.json). Deploy on Railway in one click still works: https://railway.com/deploy/excaliself (#285).
  • Blog. excaliself.com has a blog: how to self-host Excalidraw with collaboration that stays on your server, open-source alternatives to Excalidraw+, and short comparisons with ExcaliDash and Nextcloud Whiteboard (#283).

Fixes

  • Dev mode resolves roughjs imports again (#282).

Upgrade notes

  • No database migrations.
  • One new optional env var: TRUSTED_ORIGINS. Leave it unset if you open the app at one address only.
  • Run one replica only, as before.

v0.11.1

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 10 Nov 07:44
c99856e

Preview mode now tells you where to sign in.

New

  • Sign-in URL in preview logs. With PREVIEW_MODE=true, the server prints [preview] Sign in at http://localhost:<PORT>/preview/login when it starts, so docker run -e PREVIEW_MODE=true ... shows the link in the container logs (#280).

Upgrade notes

  • No database migrations.
  • No new env vars.

Thanks to @ZGRX for #280.

v0.11.0

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 09 Nov 15:35
96a6544

Comment on drawings, deploy on Railway in one click, and follow your OS theme.

New

  • Comments on drawings. Pin a comment thread to a spot or a shape. Open Comments in the top-right bar, click Add comment, and click the canvas. A comment on a shape stays on it when the shape moves, resizes, or rotates. Members reply and resolve threads, and new comments show up live in every open tab, on Private drawings too. A dot marks threads you have not read. See the Comments docs (#276).
  • Comments over MCP. list_comments, add_comment, reply_to_comment, and resolve_comment let your AI client read and answer review threads. Comments are not drawing content, so they save at once and show "via ". Changes to the drawing itself still need Apply (#276).
  • Deploy on Railway in one click. Excaliself is on the Railway template marketplace: https://railway.com/deploy/excaliself. It deploys the app and a Postgres database with the secret, domain, port, and healthcheck already set. The Railway docs page also has the steps to deploy by hand (#277, #278).
  • System theme. Settings → Appearance → Theme has a third option, System. It follows your OS light/dark setting and switches live, with no reload. Light stays the default (#273).

Upgrade notes

  • One database migration (0018_comments). It adds three tables for comment threads, comments, and read state. It runs on start, as before.
  • No new env vars.
  • Run one replica only, as before.

Thanks to @cepheiden for the System theme (#273).

v0.10.0

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 08 Nov 14:49
844d9c1

Organize many drawings at once, and let AI agents export and import drawings as files.

New

  • More actions on drawing cards. The ⋯ menu on a Home, All drawings, or folder card now has Star/Unstar, Rename, and Move to Team (private drawings, when Team is on), the same as the sidebar row. See the Organize docs (#269).
  • Export a drawing without opening it. Export .excalidraw in the card menu and the sidebar row menu downloads the drawing, images included. The file is the same one Excalidraw's own "Save to file" writes (#268).
  • Select many drawings. Each card has a select box. Shift-click selects a range, Select all takes the page, and Esc clears. A bar at the bottom can Star, Move to folder, Move to Team, Export (one drawing as .excalidraw, more as a .zip), or Move to trash with one Undo. Each action is all or nothing (#270).
  • Export drawings over MCP. export_drawing returns a drawing as a PNG or SVG that looks like Excalidraw's "Export image", with darkMode, background, padding, and scale options. export_scene returns the .excalidraw file; images only when includeImages is true. An agent can now put your diagrams into docs. See the MCP docs (#271).
  • Import a .excalidraw file over MCP. import_scene makes a new drawing from a .excalidraw file, with its images, in the Space and folder you pick. The server checks the scene first and names each problem it finds (#272).

Fixes

  • The rename dialog now selects the name when it opens, so typing replaces it. This also fixes Rename in the command palette (#269).

Upgrade notes

  • No database migrations.
  • No new env vars.
  • The Docker image now holds @resvg/resvg-wasm and wawoff2 for PNG export. If you build your own image, copy them into the runner like the Dockerfile does.
  • Run one replica only, as before.

Thanks to @helmut72 for the ideas in #265 and #266.

v0.9.0

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 07 Nov 11:31
318d4d4

AI agents can now change your drawings, and nothing changes until you click Apply.

New

  • Change a drawing over MCP. edit_drawing proposes a change to an existing drawing: shapes, text, and arrows to add, change, or remove, by the element ids that read_drawing now shows. It writes nothing. You see a card on the drawing with a preview (new, changed, and removed elements boxed in green, blue, and red), open it large to zoom and pan, and click Apply or Discard. Apply edits your canvas like a hand edit, so teammates see it live and undo takes it back. The tool tells the client applied, discarded, or stale, and get_drawing_edit checks later. See the MCP docs (#261).
  • Profile photos for SSO members. Members who sign in with Google, Microsoft, or OIDC now show their provider's photo in the sidebar, the member list, Team drawing cards, live badges, and the presence avatars on the canvas. Initials stay as the fallback. Each SSO sign-in refreshes the photo only, so the name and email a member set in the app stay as they are. See the SSO docs (#232).

Fixes

  • Drawings no longer open slightly blurry on 1x screens. The fitted view from v0.8.0 could land on half a pixel (#263).
  • One-click Coolify deploys no longer fail sign-in with "Invalid origin". BASE_URL now comes from the portless SERVICE_URL_EXCALISELF. Thanks to @cafadev for this fix (#259).

Upgrade notes

  • No database migrations.
  • No new env vars.
  • Coolify: redeploy to pick up the new docker-compose.coolify.yaml. Then check under Environment Variables that BASE_URL is the public URL, with no :3000.
  • A proposed edit waits in server memory. A restart drops edits that nobody applied yet. Nothing was written, so the client can propose again.
  • Better Auth's /update-user endpoint is now off. The app does not use it.
  • Run one replica only, as before.

v0.8.1

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 05 Nov 18:33
5a670ff

Try Excaliself's MCP server from Claude Desktop or Claude Code with one command, and no server of your own.

New

  • MCP over stdio in preview mode. With PREVIEW_MODE=true and MCP_STDIO=true, the app also answers MCP over stdin and stdout, as the example admin. Add it to Claude Code with:

    claude mcp add excaliself-preview -- docker run -i --rm -p 127.0.0.1:3000:3000 -e PREVIEW_MODE=true -e MCP_STDIO=true ghcr.io/maciekzygmunt/excaliself

    Then open http://localhost:3000/preview/login to watch the drawings that Claude makes appear live. The data is in memory and is gone when the client closes the server. The MCP docs have the Claude Desktop config too (#253).

    This also lets MCP directories that only speak stdio, such as Glama, start the server and list its tools.

Upgrade notes

  • No database migrations.
  • One new optional env var, MCP_STDIO. It works only together with PREVIEW_MODE=true. Without preview mode, the server refuses to start.
  • The server now checks its env vars when it starts, not on the first request. A server with an invalid env var stops at startup with a clear error.

v0.8.0

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 05 Nov 17:51
cae087c

AI agents can now keep your drawings in order: make folders, move drawings, and clean up into the trash.

New

  • Folder tools for MCP. create_folder makes a folder in your private space or in Team, optionally inside another folder. move_drawing moves a drawing into a folder of its space, or to the top of the space. A drawing cannot move between your private space and Team (#248).
  • Trash tools for MCP. trash_drawing and trash_folder move a drawing, or a folder with everything in it, to the same trash as the app. restore_drawing and restore_folder take them out again. Nothing is deleted for good over MCP: only a member can do that, and the 30-day purge stays the only automatic delete. A drawing that is open in a tab shows the trashed view at once (#249).
  • Mermaid colors. In a Mermaid flowchart, style id fill:…,stroke:… lines now color the nodes (hex or named colors). Before, they were dropped (#251).
  • Try MCP in preview mode. Preview mode has a public access token, exs_preview-mode-public-token, so you can connect a client, or let an MCP directory list the tools, with no sign-in. Only preview mode makes this token, and other instances refuse it. See the MCP docs (#251).

Fixes

  • A drawing now opens centered on its content and zoomed to fit (never past 100%). Before, every drawing opened at the origin, so a diagram made over MCP or imported from a file could sit under the toolbar (#250).
  • Imported .excalidraw files keep the file's date, so old files keep their order in Recent. Dates in the future become the import time. Thanks to @ZGRX for this contribution (#246).

Upgrade notes

  • No database migrations.
  • No new env vars.
  • Run one replica only, as before.

v0.7.0

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 04 Nov 19:20
af73eaa

Connect Claude.ai to your own Excaliself, with no access token.

New

  • Claude.ai connector (OAuth). Claude.ai on the web, desktop and mobile cannot send an access token, so it now connects with OAuth. In Claude, go to Settings → Connectors → Add custom connector and enter https://<your-instance>/api/mcp. Claude opens Excaliself. You sign in with a password or SSO and click Allow. Claude Code and other clients can still use exs_ access tokens (#211).
  • Connected apps. Settings → MCP lists the apps that you connected, next to your access tokens. Click Disconnect to stop an app at once. When an admin deletes a member, or a member links SSO, their connected apps stop too (#211).
  • Excaliself icon in AI clients. The MCP server now sends its name, icon and website, so clients that read them show the Excaliself icon and not your domain's favicon (#245).
  • Try it in 10 seconds. The README, the docs and the website now show the one-command preview: docker run --rm -p 127.0.0.1:3000:3000 -e PREVIEW_MODE=true ghcr.io/maciekzygmunt/excaliself, then open http://localhost:3000/preview/login. The data is in memory and is gone when the container stops (#237).

Fixes

  • When someone joins or leaves the drawing that you have open, the sidebar badge now changes at once. Before, it could take up to 25 seconds (#243).
  • The website's mobile menu shows the GitHub star count. Thanks to @LekhNayak for the first outside contribution (#242).

Upgrade notes

  • One database migration (0017_oauth). It adds two tables for OAuth clients and grants.
  • No new env vars. For the Claude.ai connector, the instance must be on the public internet over HTTPS (see the MCP docs).
  • Run one replica only, as before.

v0.6.1

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 03 Nov 18:54
e097f31

Security release: 16 fixes for sign-in, share links, live rooms and server limits. All self-hosters should update.

Security fixes

Sign-in and accounts

  • With a generic OIDC provider, a caller could sign in as another member by sending an ID token directly. The app now refuses ID-token sign-in and only allows the redirect flow (#217).
  • A member could take over the account of a person who signs in with SSO later. To do this, they changed their email to that person's address. Now the owner's first SSO sign-in removes all other SSO links, passwords, sessions and MCP tokens on that account (#221).
  • When you revoke a session (sign out other devices, revoke one device, change your password, or use an admin reset link), its open drawings now stop live editing at once. The routes that gave out the IdP tokens of a member now return 404. Microsoft sign-in no longer asks for offline_access (#223).
  • One invite link can no longer make more than one account (#226).
  • On PR previews, sign-in links can no longer send a tester to another site (#225).

Share links and live rooms

  • A page on a sibling subdomain (for example a PR preview) can no longer open or edit Team drawings as the signed-in member through the room socket, the lists socket or image upload (#218, #224).
  • With one crafted frame, a share-link guest could stop a drawing from saving, or make an element that nobody could delete. The server now refuses bad versions, bad nonces and very deep nesting (#219).
  • Share-link guests no longer get the text of content that was deleted more than 24 hours ago (#220).
  • With parallel uploads, a guest could exceed the 20 MB image limit of a drawing, and then nobody could open the drawing (#230).
  • Invalid share tokens from one person no longer block valid share links for everyone on the same IP (#227).

Server load and limits

  • Guests and anonymous callers can no longer exhaust memory or CPU. This release adds a body size limit, cheaper password-reset checks, a rate limit on the real client IP, back-pressure for slow room sockets, and a size limit on rooms (#222).
  • A very large Team drawing, name or library item from one member can no longer break the drawings list or the Team library for every member (#231, #233).
  • Signed-in pages now send Cache-Control: private, no-store, so a CDN cannot cache them. The app shell no longer sends the session token to the browser (#229).
  • PR previews log a warning when production SSO client secrets are still set. The PR preview docs now tell you to clear them and DATABASE_URL (#228).

Upgrade notes

  • One database migration (0016). It removes duplicate image rows and adds a unique index. You can go back to v0.6.0 without a restore.

  • No new env vars.

  • The host of BASE_URL must match your public host. If it does not, live collaboration does not work (sign-in already needs this). If the room refuses the owner, the owner now sees a "Live editing stopped" message.

  • New limits:

    • Drawing and folder names: up to 1,000 characters.
    • Live rooms: up to 50,000 elements or 20 MB.
    • Team library: up to 1 MB for each item and 10 MB in total, and 60 changes a minute for each member.
    • Request bodies: up to 64 MB.

    The docs give all the limits.

  • Members who use two SSO providers lose the other link each time they sign in for the first time with a different provider.

  • After the update, members who use Microsoft sign-in still have their old refresh tokens in the database, but no route can read them.

  • Run one replica only, as before.

Install

Image: ghcr.io/maciekzygmunt/excaliself:0.6.1 (also :0.6 and :latest), for amd64 and arm64.

To update, run docker compose pull && docker compose up -d, or redeploy in Coolify. See Docker Compose or Coolify.

Full changelog: v0.6.0...v0.6.1

v0.6.0

Choose a tag to compare

@maciekzygmunt maciekzygmunt released this 02 Nov 17:11
376863c

Sign in with Google, Microsoft, or your own OIDC provider, and read the new docs on the website.

Features

  • Single sign-on: members can sign in with Google Workspace, Microsoft Entra ID, or one OIDC provider (Okta, Authentik, Keycloak and others). Each provider turns on when you set its env vars. New people get an account on their first SSO sign-in only if their email domain is in SSO_ALLOWED_DOMAINS. Everyone else still needs an invite. See Single sign-on (#202, #209).
  • Docs on the website: setup and usage docs are now at excaliself.com/docs. The deployment guide moved there from docs/deployment.md (#205).
  • Star on GitHub: admins see a small prompt in the sidebar one time, and a permanent link in Settings → Instance. Members who are not admins see nothing (#207).

Fixes

  • Settings → Instance shows the real version. It always showed v0.1.0 before (#208).

Upgrade notes

  • No database migrations. You can go back to v0.5.0 without a restore.
  • SSO is optional. If you set no SSO env vars, nothing changes.
  • When an existing member signs in with SSO for the first time, their account links by email. This removes their password, signs out their other sessions, and revokes their MCP access tokens. An admin reset link gives the password back.
  • The app does not start if a provider has only some of its variables set, or if MICROSOFT_TENANT_ID is common, organizations, or consumers.
  • For OIDC, existing members can link only if your provider sends email_verified: true.
  • Run one replica only, as before.

Install

Image: ghcr.io/maciekzygmunt/excaliself:0.6.0 (also :0.6 and :latest), for amd64 and arm64.

To update, run docker compose pull && docker compose up -d, or redeploy in Coolify. See Docker Compose or Coolify.

Full changelog: v0.5.0...v0.6.0