Skip to content

Releases: yibie/excali-mode

excali-mode 0.3.0 — Org whiteboards

Choose a tag to compare

@yibie yibie released this 06 Oct 06:52

Org whiteboards inside Emacs

This release introduces excali-board-mode, a derived mode of excali-mode for arranging Org notes and local reference material on a whiteboard.

Keep your Org document on the left and a connected board on the right. The notes remain in Org; the board adds spatial organization.

Linked Org cards

  • Bring an existing heading onto a board, display its full subtree, and jump back to its source.
  • Edit the source and see the card refresh; double-click for a fixed popup editor.
  • Move and resize cards independently of their content, with internal vertical and horizontal scrolling.
  • Read formatted headings, lists, tables, code blocks, clickable Org links, and inline local images.
  • Start with a standalone Org note on the board and convert it into a heading without entering its title again.

Connections and organization

  • Labeled, bound arrows follow cards as they move.
  • Create a connected note from a free arrow endpoint.
  • Organize cards with named groups and regions, and navigate between them.

Vaults and reliable references

Configure one or more local directories:

(require 'excali-board)
(setq excali-board-vaults
      '(("Notes" . "~/Documents/notes/")
        ("Work" . "~/Documents/work/")))

Run M-x excali-board-new while browsing an Org document within a configured vault. The source directory determines the vault automatically; nested roots use the closest match. The board is saved immediately and opens on the right.

  • Recursive, vault-bounded discovery of Org sources and attachments.
  • Explicit Org-ID-based reference repair after file or heading moves, with duplicate-ID reporting.
  • Reverse lookup of boards referencing a heading.
  • Safe refresh after external source changes, without overwriting unsaved Org edits.
  • Existing boards retain their saved vault roots.

Static media cards

Add PDF first-page previews, image thumbnails, video thumbnails, and audio artwork or fallback icons. Double-click a file card to open the original in another Emacs window.

Poppler and FFmpeg are optional preview helpers. These cards deliberately do not provide in-card playback, media editing, or PDF navigation. Files remain linked rather than embedded in board documents.

Format and scope

Boards remain .excalidraw documents with versioned board metadata, not JSON Canvas files. Rich Org rendering and live references are excali-board features; ordinary drawings remain independent of the optional board mode.

Excali DSL remains one-way: .excalidsl → .excalidraw. This release does not introduce DSL/scene bidirectional synchronization.

Upgrade

  • Requires an Emacs 32 build with native Canvas support and the excali native module.
  • Rebuild with make and restart Emacs: the native module has changed.
  • Configure excali-board-vaults before creating boards. This is the single configuration entry point for both single- and multi-vault setups.
  • Source release: build the platform-specific native module locally.

Configuration and usage · Changelog

Validation

All 506 ERT tests pass against an isolated snapshot of the release contents. The native module builds successfully, and Lisp byte-compilation passes with warnings treated as errors.

excali-mode 0.2.0 — Excali DSL and Org Babel

Choose a tag to compare

@yibie yibie released this 05 Oct 00:34

Excali DSL and Org Babel

This release introduces Excali DSL (.excalidsl), a text authoring language designed for excali-mode, and ob-excali for diagrams inside Org documents.

45-second feature demo

Watch / download the demo — 1080p, 30 fps, English captions, no audio.

The real Emacs recording demonstrates explicit relative node placement, blue fill and dashed-outline styling, and the same styled diagram being generated and updated inside Org Babel. The DSL computes coordinates from your placement rules rather than leaving the arrangement entirely to automatic layout.

Breaking: a new DSL

The former .edsl / excalidraw-dsl grammar has been replaced. Renaming a file alone is not a migration: rewrite its content using the new syntax.

node system "Application"
node system.ui "Interface"
node system.api "API" below system.ui
node database "Database" right of system level with system.api

edge system.ui -> system.api "request" from: bottom to: top
edge system.api -> database "query" from: right to: left
  • Explicit node and edge declarations; dotted identifiers define containers.
  • Readable relative placement, including cross-container alignment.
  • Appearance in separate { ... } blocks, reusable styles, and node/edge defaults.
  • Joint position/container-size solving with measured text and explicit arrow ports.
  • Native editable scenes with bound arrows and labels, deterministic sketch seeds, source-located diagnostics, and atomic scene export.

New: Org Babel

Enable (excali . t) through org-babel-do-load-languages, preserving your other enabled languages. The package directory must be on load-path.

#+begin_src excali :file diagrams/demo.svg :mkdirp yes :results file graphics
node source "Source" { fill: "#dbeafe" }
node result "Result" right of source { fill: "#dcfce7" }
edge source -> result "render"
#+end_src
  • C-c C-c in Org executes the block and inserts a result file link.
  • C-c ' opens the source in Excali DSL mode.
  • :file selects SVG, PNG, or editable .excalidraw output.
  • Supports Babel execution directories, directory creation, and standard confirmation / :eval controls.
  • Failed parsing, layout, or rendering preserves the previous output file and result link.
  • No interactive canvas or external rendering process is required; the native excali module is still required.

Fixed

  • Direct DSL preview now loads the canvas entry points when the mode was autoloaded independently.
  • Preview associations stay in the source buffer, so repeated C-c C-c refreshes the same canvas.
  • Installation documentation now includes complete deferred-loading configuration, extension distinctions, and troubleshooting.

Upgrade and try it

  • Run make after updating, then restart Emacs or reload the changed libraries. make regenerates byte-compiled Lisp files.
  • Associate .excalidsl, not .excalidraw, with excali-dsl-mode. Open JSON scenes with M-x excali-open.
  • Canvas edits do not update DSL source; regenerating a scene replaces manual edits.
  • Org sessions, :var substitution, command-line hooks, and automatic execution are not included in this release.

Configuration and usage · Language reference · Org example

Validation

All 368 ERT tests pass against an isolated snapshot of the release contents, including DSL and Babel cold-start tests, native image export, source editing, result links, and failure protection.

Source release; build the platform-specific native module locally as described in the README.

excali-mode 0.1.1

Choose a tag to compare

@yibie yibie released this 29 Sep 07:46

Breaking

  • Everything is named excali now, not excal: files (excali.el,
    excali-*.el), commands (excali-open, excali-new), the major mode
    (excali-mode), options and the module (excali-module). The
    repository moved from excal-mode to excali-mode; the old address
    redirects.
  • make byte-compiles the Lisp as well as building the module. Run it
    again after pulling: loaded from uncompiled .el files, excali runs
    several times slower.

New

  • Drawing from text: the .edsl language of excalidraw-dsl.
    excali-dsl-mode for .edsl files, C-c C-c draws the buffer in a
    scene beside it (again: refreshes it), excali-dsl-yank and
    excali-dsl-insert-file add a diagram to the current scene, and
    excali-dsl-elements and friends make diagrams from Lisp. Layout is
    automatic and layered; arrows and labels are bound, so the drawing
    stays editable.
  • The official library collection of libraries.excalidraw.com, from
    Emacs: C-c l o lists it, RET previews a library in place of the
    list (q goes back), + adds the item at point and a a whole
    library. Items the personal library holds are marked, added ones
    light up, and the list marks libraries wholly added.
  • Library items can be deleted: d in the library browser (C-c l b),
    or C-c l d by name.
  • One scene in several windows, each with its own zoom and scroll;
    editing in one redraws the others.
  • The style panel (s) follows upstream's properties panel: its
    properties in its order and words, only those the selection or tool
    takes, then layers, align and actions. Each property opens a panel
    of its values; colors open a picker like upstream's, with the fifteen
    colors on q .. b, the shades of the current color on 1 .. 5
    and # for a hex code.
  • Pointer shapes over handles, elements, links and line points, shown
    through the canvas image's hot spots so Emacs switches them itself.
  • Dragging with the right button pans, like the middle one; shift with
    a vertical wheel pans sideways.

Fixed

  • Wheel panning goes the way Emacs scrolls a buffer on every system and
    honors mouse-wheel-flip-direction. Sideways panning was reversed on
    Windows and Linux, and a tilted wheel on Windows panned vertically.

Faster

  • Large scenes stay responsive. With 2846 elements: dragging 300 of
    them went from 163 ms a frame to 9, a hit test from 30 ms to 1.4, and
    rebuilding pointer hot spots after a command from 160 ms to 2. The
    module keeps the elements it has read, a render repaints only what
    changed, and hot spots are built around the mouse.
  • Library thumbnails are cached on disk and drawn in the background,
    those in view first: a library of 249 icons opens in about 30 ms
    instead of blocking for a second.