New
- On Obsidian 1.13 and newer, Excalidraw now uses Obsidian's searchable, multi-page settings organized into clearer sections with breadcrumbs and clickable links between related options.
- If you prefer the previous experience you can turn off Use searchable settings at the top of Excalidraw settings and restart Obsidian. Older Obsidian versions continue using the legacy single-page layout automatically.
- Settings exposed by installed Excalidraw Automate scripts have moved to Excalidraw Automate → Settings for installed scripts.
- Excalidraw Automate can optionally load and monitor JavaScript (
.js) files in the Scripts folder, use an explicit.jsExcalidrawStartup script, and store Script Library downloads as either Markdown or JavaScript. Existing scripts can be moved between the two formats while updating startup and pinned-script paths. #2901 - Markdown notes created from unresolved links in a drawing now follow Obsidian's Default location for new notes setting. #2916
New from Excalidraw.com
- Improved bucket tool and eyedropper support. #11849
- Lasso selection now respects box selection mode: contain or overlap. #11862
- Customize color-picker top picks by dragging colors onto the strip; right-click the strip to reset it. #11872
Fixed
- Downloading very large SVG or PNG exports now avoids base64 conversion, substantially reducing peak memory use and preventing Electron renderer crashes on image-heavy drawings.
- Moving a dirty drawing out of a popout window now safely transfers and persists its latest edits from the replacement main-window view.
- Converting a legacy ".excalidraw" drawing now persists its embedded images as vault attachments during conversion, before the source file can be removed. #2898
- Entering text editing no longer scans and sorts the entire vault for link suggestions; file-link candidates are loaded only after typing
[[. #2907 - Settings changes are saved promptly without collapsing sections or interrupting fast typing. Writes are serialized, and Excalidraw keeps a device-local recovery copy so an empty or corrupted synchronized data.json cannot silently erase a large settings configuration.
- Text-to-diagram chat history is visible again, so saved chats can be restored or deleted.
- Stencil-library JSON is now tab-indented for cleaner Git diffs. #2883
Maintenance
- This is one of the Plugin's largest internal maintenance releases ever. The settings system, persistence pipeline, plugin lifecycle, runtime packaging, and several major managers were reorganized into clearer, independently maintained components. On the surface the plugin works as before, but the foundation is substantially safer for future features and fixes.
- The embedded Excalidraw runtime now uses a modern ESM-source build and React 19 instead of the retired UMD pipeline.
- Drawings with many cached embedded files load more efficiently by avoiding redundant cache rewrites, SVG reconstruction, image measurement, hashing, and normalization. Cached and direct images can appear before slower generated drawings, while drawing backups remain protected.
- Removed unused code and the obsolete Draw.io/Diagram integration, and retired the non-functional Create DrawIO file script.
New in Excalidraw Automate
- Added area-bounded view exports for image-heavy scenes.
createViewSVG()and the newcreateViewPNG()acceptexportArea: {x, y, width, height}, filter out off-area elements and unused image payloads, retain required bound elements, and crop to the requested viewport. Both methods also support a completeelementsOverrideexport set. - Added
getElementsIntersectionArea()for explicitly selecting elements whose rendered bounds intersect an area. The existinggetElementsInArea()method remains available as a backward-compatible alias. setView(null)now explicitly clearsea.targetView. UsesetView()orsetView("auto")when you want EA to select a sensible default drawing.- Scripts can register custom buttons in the selected-element context menu:
registerElementActionProvider(getActions: (element: ExcalidrawElement) => readonly {id: string, title: string, icon: string, action: () => void}[]): (() => void) | null;- Scripts can request permission to run automatically whenever an Excalidraw view opens. Manage permissions with the Autostart scripts command or under Excalidraw Automate settings:
registerAutostart(message?: string): Promise<"allow" | "deny" | "pending">;- Pass an optional message to explain what the script does during autostart. It appears between the permission question and the settings hint.
- Scripts can release listeners, timers, observers, and other external resources with EA-owned cleanup:
registerCleanup(cleanup: () => void): () => void;- Scripts can distinguish
manual,plugin-startup,view-autostart,sidepanel-restore,sidepanel-reload, anddrawing-onloadexecution throughutils.executionSource. Compilation caching is transparent and does not retain script runtime state.
What's Changed
- fix: guard null match when .excalidraw.md has no Text Elements heading by @verryp in #2872
- Refactoring: Remove duplicate functions by @zsviczian in #2873
- Refactor: move supporting logic out of main.ts into dedicated managers by @zsviczian in #2874
- Refactor: ExcalidrawView by @zsviczian in #2875
- Refactoring: main.js size reduction by @zsviczian in #2876
- Migrate to esm build by @zsviczian in #2877
- 0.18.120, moved to React 19, fixed mermaid text to diagram history po… by @zsviczian in #2878
- 2.27.0-beta.0 by @zsviczian in #2880
- stencil library formatted with 2 spaces by @dimateos in #2884
- Feat: Custom elements menu by @zsviczian in #2890
- Fix @excalidraw/common type resolution, eliminating a huge any-collapse by @zsviczian in #2892
- ExcalidrawAutomate and ExcalidrawView Utils cleanup by @zsviczian in #2893
- Register typed Excalidraw host adapters by @zsviczian in #2895
- Improve embedded scene loading performance by @zsviczian in #2896
- Migrate Excalidraw settings to Obsidian's declarative settings API by @zsviczian in #2906
- Fix stale canvas offsets when the view moves without resizing by @theslyprofessor in #2905
- Improve save and popout lifecycle performance by @zsviczian in #2908
- Improve popout migration performance and lifecycle safety by @zsviczian in #2911
- Fix legacy conversion assets and add JavaScript script support by @zsviczian in #2913
- feat: Improved scripting skills by @zsviczian in #2915
- Refactor EA script execution lifecycles by @zsviczian in #2917
- Add bounded ExcalidrawAutomate image exports by @zsviczian in #2918
- Fix false dirty state from selection and modifier keys by @zsviczian in #2919
New Contributors
- @verryp made their first contribution in #2872
- @dimateos made their first contribution in #2884
- @theslyprofessor made their first contribution in #2905
Full Changelog: 2.26.4...2.27.0