Co-edit Excalidraw drawings in real time with live cursors over a LAN or a virtual LAN such as Radmin VPN, Hamachi, ZeroTier or Tailscale.
Live collaboration for the Excalidraw plugin in Obsidian: several people draw on the same board in real time and see each other's cursors and laser pointer.
There is no server: one participant hosts, the others connect to them directly over TCP. Any network where participants can reach each other's IP works:
26.x.x.x addresses), Hamachi (25.x.x.x), ZeroTier, Tailscale;Desktop only: mobile Obsidian has no Node.js networking API.
This plugin talks to the network — that is its whole purpose. To be explicit:
47321 by default) on all network
interfaces of your computer, so participants on your LAN or VPN can connect.os.networkInterfaces()) only to show which
addresses participants can use; they are not sent anywhere. Its “Copy” button writes the chosen address
to the clipboard; the plugin never reads the clipboard.Everyone in a session needs the plugin, and the versions must match. The Excalidraw plugin must be enabled.
With BRAT (updates arrive automatically)
SHENID1/excalidraw-live-sync.Manually
Download main.js, manifest.json and styles.css from the latest release
into <vault>/.obsidian/plugins/excalidraw-live-sync/, then enable the plugin.
From source
npm install
npm run build
npm run install-plugin -- "C:/path/to/vault"
Host
Live: off in the status bar).Participant
IP or IP:port, your name and the password (if the host set one).Excalidraw Live folder (configurable);Everyone works on their own copy of the file in their own vault; Excalidraw autosaves the changes. The session ends when you close the drawing tab or open another file in it. After disconnecting, each participant keeps their copy as a regular local file.
The interface follows Obsidian's language: Russian when Obsidian is set to Russian, English otherwise.
Cursor name and color, port (default 47321), session password, folder for new drawings.
A fresh install starts with a random name like “Guest 4821” — change it in the settings or in the join dialog.
When the host sets a password:
scrypt with a random salt), not the password itself;Without a password anyone on the network can join, and traffic is not encrypted.
src/net.ts — TCP server and client: a JSON-lines handshake, then length-prefixed frames
(encrypted when a password is set) with keepalive. The host relays clients' messages to everyone else.src/crypto.ts — the password key, password proofs and frame encryption.src/session.ts — binds to the open ExcalidrawView: wraps its onChange / onPointerUpdate,
sends changed elements and merges incoming ones by Excalidraw's own rule
(higher version wins, ties go to the lower versionNonce), so all scenes converge.
Remote changes don't enter the undo history.files) are sent whole; cursors are shown through Excalidraw's collaborators.Bump version in manifest.json and package.json, commit, and push a tag with the same number:
git tag 0.3.2
git push origin 0.3.2
A GitHub Action builds the plugin, attests the build provenance and publishes a release with main.js, manifest.json and styles.css.
[[...]], embeddables) open for other participants only if they have those files too.