# Obsidian Excalidraw CLI

Create, inspect, edit and render Obsidian Excalidraw drawings through the running app's...

- Repository: https://github.com/zsviczian/obsidian-excalidraw-plugin (7812 stars)
- Category: Engineering
- License: AGPL-3.0
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add zsviczian/obsidian-excalidraw-plugin --skill obsidian-excalidraw-cli -g -a claude-code -y`
Codex: `npx skills add zsviczian/obsidian-excalidraw-plugin --skill obsidian-excalidraw-cli -g -a codex -y`
Cursor: `npx skills add zsviczian/obsidian-excalidraw-plugin --skill obsidian-excalidraw-cli -g -a cursor -y`
Gemini CLI: `npx skills add zsviczian/obsidian-excalidraw-plugin --skill obsidian-excalidraw-cli -g -a gemini-cli -y`

## Description

Create, inspect, edit and render Obsidian Excalidraw drawings through the running app's native CLI.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

Use a local terminal with Obsidian running and CLI enabled (API 1.12.2+).
Always put vault="<name or ID>" before the command. Native root: obsidian-excalidraw-plugin.
Start with obsidian vault="<vault>" obsidian-excalidraw-plugin:help, then :schema action=create.
All results use apiVersion 1. Check ok, mutation and persistence; process exit zero alone does not prove success.
Put large requests in a visible vault-relative JSON file and pass input="<file>". Inline json is for small requests.
Requests in files include apiVersion:1; the native command supplies command. The in-process ea.executeCLI request also includes command.
Use exact drawing paths including extensions. Never assume an active drawing. :open explicitly creates a tab and can run configured drawing scripts.
Loop: :read source=live detail=elements (or detail=images to inventory) → :apply with expectedRevision and a unique requestId → check persistence=saved → :export → inspect the image file.
For duplicate views use the view ID from :open or :read. Refresh after STALE_REVISION; retry BUSY with the same requestId only when refused before execution; unknown outcomes require read-back.
New skeleton IDs are local labels; use returned idMap actual IDs for updates. Updates reject identity, bindings and asset internals.
Every write requires requestId. Repeat the identical effective request to retrieve its receipt; different content with the same ID fails.
:result requestId=<id> recovers a receipt after lost stdout. Receipts expire after 15 minutes/reload; unknown outcome requires read-back before another write.
:api surface=ea name=<method> gives existing EA signatures. :api surface=lib lists the supported installed Lib reference; advanced exports remain available to scripts.
:icons query=<name> discovers installed canonical Lucide names (paged); create icons / apply op=lucide insert editable native groups. groupMap maps logical icon aliases to groupId/elementIds; idMap remains single-element only. Defaults: si

The rest: https://github.com/zsviczian/obsidian-excalidraw-plugin/blob/HEAD/docs/AITrainingData/excalidraw-cli/SKILL.md
