github zsviczian/obsidian-excalidraw-plugin 2.27.0

latest release: 2.27.1
4 hours ago

Watch the video

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 .js ExcalidrawStartup 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 new createViewPNG() accept exportArea: {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 complete elementsOverride export set.
  • Added getElementsIntersectionArea() for explicitly selecting elements whose rendered bounds intersect an area. The existing getElementsInArea() method remains available as a backward-compatible alias.
  • setView(null) now explicitly clears ea.targetView. Use setView() or setView("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, and drawing-onload execution through utils.executionSource. Compilation caching is transparent and does not retain script runtime state.

What's Changed

New Contributors

Full Changelog: 2.26.4...2.27.0

Don't miss a new obsidian-excalidraw-plugin release

NewReleases is sending notifications on new releases.