excalidraw / cli
git clone https://github.com/excalidraw/cli.git
Official Excalidraw CLI for humans and agents
+0
stars, 24h · #35,038
+~0
stars, 7 days · #35,513
+200
stars, 30 days · #2,644
202
★ total
7
forks · 2 open issues
Star history (as recorded here)
LanguageTypeScript
LicenseMIT
Created2026-10-08 (13d ago)
Last push13d ago
Watchers2
OwnerOrganization
Links
- GitHub: github.com/excalidraw/cli
- Releases · Issues · Hacker News mentions
README excerpt
# Excalidraw CLI Manage your Excalidraw+ workspace from the terminal, and render any `.excalidraw` file to PNG. Rendering runs locally and needs no account. [code] Output is JSON by default, so it works with `jq`, shell scripts and AI agents. ## Install [code] Or try it without installing: `npx @excalidraw/cli --help`. Requires Node.js 22 or newer. To update, run `excalidraw update`. It installs the latest version with the package manager you installed the CLI with: npm, pnpm, yarn, bun or Volta. `excalidraw update --check` only reports whether a newer version is out. Commands you run in a terminal check for a newer version at most once a day, while the command runs, and mention it after the output. Set `EXCALIDRAW_NO_UPDATE_NOTIFIER=1` to turn this off. ## Quick start Workspace commands need an Excalidraw+ API key. The authentication docs explain how to create one. [code] Every command has `--help` with examples, for instance `excalidraw scenes content patch --help`. ## Render to PNG `render` turns a local file into a PNG, no API key needed. `scenes render` does the same for a scene in your workspace. [code] With a file path, the command prints the PNG's path and dimensions as JSON. Pass `--out -` to write the PNG to stdout instead, for example to pipe it into another program: [code] Rendering uses a browser that's already installed: Chrome, Edge or Chromium, or Firefox (slower) if none of those is. The CLI doesn't download one. If it can't find yours, pass `--browser-path` or set `EXCALIDRAW_BROWSER_PATH`. | Option | Default | Notes | | --- | --- | --- | | `--out ` | required | File path, or `-` for stdout. | | `--frame-id ` | | Render just this frame. | | `--scale ` | `1` | Resolution multiplier, up to 16. | | `--max-width`, `--max-height` | `2048` | Size limits in pixels, up to 16384. Raise them along with `--scale`. | | `--padding ` | `20` | Ignored for frames. | | `--theme ` | scene setting | | | `--transparent` | off | Transparent background. | | `--timeout ` | `30000` | How long a render may take. | - Images must be embedded in the file. Image URLs and website embeds aren't loaded. - The output keeps the scene's aspect ratio and stays under 64 megapixels. - Chinese, Japanese and Korean text in the hand-drawn font needs a font that's downloaded the first time a scene uses it, then cached. Without network access, that text uses a system font. `--fonts-url` sets other download locations, or `none` to turn downloads off. - Emoji come from your system's fonts. ## Commands | Command | What it does | | --- | --- | | `login` | Check an API key and save it for later commands | | `logout` | Remove the saved API key | | `whoami` | Show the workspace, key type, credential source and API origin in use | | `scenes` | List, create, rename, move, pin and trash scenes | | `scenes content` | Read, replace or patch a scene's drawing | | `scenes render` | Render a workspace scene to PNG | | `render` | Render a local file to PNG | | `collections` |