No description
  • TypeScript 94.4%
  • SCSS 2.6%
  • MDX 1.7%
  • JavaScript 1.2%
Find a file
Oss 865c9bf007 fix(selfhost): mark storage-backend calls as XHR for forward_auth
draw.ossalali.com is now gated by Authelia via Caddy forward_auth instead
of basic_auth. An expired session answers a plain fetch with a 302 to the
login portal rather than a 401, because fetch sends `Accept: */*` and
Authelia reads that as "this client renders HTML". The redirect is
cross-origin and carries no CORS headers, so the request rejects with an
opaque TypeError and the caller cannot tell an auth failure from a network
outage — saves and image uploads fail behind a generic error indicator.

Route every storage-backend call through an authFetch helper adding
X-Requested-With: XMLHttpRequest, which makes Authelia answer 401 instead.
Verified against the live host: /api/v2/* returns 302 with `Accept: */*`
and 401 with the header present.
2026-08-04 22:37:01 +02:00
.codesandbox chore(docker): bump node (#11208) 2026-04-20 22:07:00 +02:00
.github ci(repo): skip docs & example deployments in CI (#11674) 2026-07-16 14:36:11 +00:00
.husky build: temporarily disable pre-commit (#6132) 2023-01-19 13:50:42 +01:00
dev-docs ci(repo): skip docs & example deployments in CI (#11674) 2026-07-16 14:36:11 +00:00
examples ci(repo): skip docs & example deployments in CI (#11674) 2026-07-16 14:36:11 +00:00
excalidraw-app fix(selfhost): mark storage-backend calls as XHR for forward_auth 2026-08-04 22:37:01 +02:00
firebase-project fix: update storage.rules (#5020) 2022-04-17 22:47:00 +02:00
packages feat(editor): bind text to hovered arrow endpoint (#11777) 2026-07-28 18:12:33 +02:00
public feat(editor): tweak sidebar promo style (#11181) 2026-07-09 11:41:13 +02:00
scripts fix: Fractional index validation (#11258) 2026-05-04 11:37:17 +02:00
.dockerignore fix: Docker build in CI (#8312) 2024-08-06 13:21:20 +02:00
.editorconfig add editorconfig (#1198) 2020-04-03 19:19:01 +02:00
.env.development feat(selfhost): point production env at draw.ossalali.com 2026-07-30 11:14:00 +02:00
.env.production feat(selfhost): point production env at draw.ossalali.com 2026-07-30 11:14:00 +02:00
.env.test test(repo): less noisy test output (#11505) 2026-06-15 18:19:20 +02:00
.eslintignore feat: canvas search (#8438) 2024-09-09 17:12:07 +02:00
.eslintrc.json feat(packages/excalidraw): state tracking, api hook, and others (#10870) 2026-03-08 23:15:18 +01:00
.gitattributes Add gitattributes (#2164) 2020-09-15 21:59:00 +02:00
.gitignore chore: init CLAUDE.md (#9563) 2025-05-25 21:23:40 +02:00
.lintstagedrc.js Keep errors, elements and comments consistent (#2340) 2020-11-05 18:06:18 +01:00
.npmrc feat: color picker redesign (#6216) 2023-05-18 16:06:27 +02:00
.prettierignore Change target branch of coverage and pretty print (#1850) 2020-07-01 12:05:21 +03:00
.watchmanconfig Don't reset cache while zooming using a gesture (#1103) 2020-03-28 16:59:36 -07:00
CLAUDE.md chore: init CLAUDE.md (#9563) 2025-05-25 21:23:40 +02:00
CONTRIBUTING.md docs: migrating dev docs to docusaurus :) (#6073) 2023-02-01 19:57:54 +05:30
crowdin.yml build: decouple package deps and introduce yarn workspaces (#7415) 2023-12-12 11:32:51 +05:30
docker-compose.yml build: Docker compose version removed (#10074) 2025-10-05 14:48:54 +02:00
Dockerfile ci(docker): fix docker dep bundling and pin remaining actions (#11398) 2026-05-25 14:39:21 +02:00
LICENSE Add MIT License (#176) 2020-01-05 13:09:29 -08:00
package.json feat(editor): LaserPointer based freedraw (#11507) 2026-06-24 09:16:22 +02:00
README.md Fix typo in Discord badge URL parameter (#11096) 2026-04-02 10:37:02 +02:00
setupTests.ts test(repo): less noisy test output (#11505) 2026-06-15 18:19:20 +02:00
tsconfig.json fix(editor): Modern TS require imports from rootDir (#11552) 2026-06-24 10:52:56 +00:00
vercel.json feat(editor): LaserPointer based freedraw (#11507) 2026-06-24 09:16:22 +02:00
vitest.config.mts feat(editor): LaserPointer based freedraw (#11507) 2026-06-24 09:16:22 +02:00
yarn.lock feat(editor): LaserPointer based freedraw (#11507) 2026-06-24 09:16:22 +02:00

Excalidraw

Excalidraw Editor | Blog | Documentation | Excalidraw+

An open source virtual hand-drawn style whiteboard.
Collaborative and end-to-end encrypted.


Excalidraw is released under the MIT license. npm downloads/month PRs welcome! Chat on Discord Ask DeepWiki Follow Excalidraw on Twitter

Product showcase

Create beautiful hand-drawn like diagrams, wireframes, or whatever you like.

Features

The Excalidraw editor (npm package) supports:

  • 💯 Free & open-source.
  • 🎨 Infinite, canvas-based whiteboard.
  • ✍️ Hand-drawn like style.
  • 🌓 Dark mode.
  • 🏗️ Customizable.
  • 📷 Image support.
  • 😀 Shape libraries support.
  • 🌐 Localization (i18n) support.
  • 🖼️ Export to PNG, SVG & clipboard.
  • 💾 Open format - export drawings as an .excalidraw json file.
  • ⚒️ Wide range of tools - rectangle, circle, diamond, arrow, line, free-draw, eraser...
  • ➡️ Arrow-binding & labeled arrows.
  • 🔙 Undo / Redo.
  • 🔍 Zoom and panning support.

Excalidraw.com

The app hosted at excalidraw.com is a minimal showcase of what you can build with Excalidraw. Its source code is part of this repository as well, and the app features:

  • 📡 PWA support (works offline).
  • 🤼 Real-time collaboration.
  • 🔒 End-to-end encryption.
  • 💾 Local-first support (autosaves to the browser).
  • 🔗 Shareable links (export to a readonly link you can share with others).

We'll be adding these features as drop-in plugins for the npm package in the future.

Quick start

Note: following instructions are for installing the Excalidraw npm package when integrating Excalidraw into your own app. To run the repository locally for development, please refer to our Development Guide.

Use npm or yarn to install the package.

npm install react react-dom @excalidraw/excalidraw
# or
yarn add react react-dom @excalidraw/excalidraw

Check out our documentation for more details!

Contributing

Integrations

Who's integrating Excalidraw

Google CloudMetaCodeSandboxObsidian ExcalidrawReplitSliteNotionHackerRank • and many others

Sponsors & support

If you like the project, you can become a sponsor at Open Collective or use Excalidraw+.

Thank you for supporting Excalidraw

Last but not least, we're thankful to these companies for offering their services for free:

Vercel Sentry Crowdin