npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@swiftlysingh/excalidraw-cli

v1.2.0

Published

CLI for creating Excalidraw flowcharts programmatically

Readme

excalidraw-cli

Features

  • Text-based DSL for quick flowchart creation
  • JSON API for programmatic use
  • Auto-layout using ELK.js (Eclipse Layout Kernel)
  • Multiple flow directions: TB (top-bottom), BT, LR, RL
  • Export to PNG & SVG with dark mode, custom backgrounds, scale, and padding
  • Programmable API for integration into other tools

Installation

Requires Node >=20.19.0. Node 18 is no longer supported.

Using npm

npm i @swiftlysingh/excalidraw-cli

From Source (Local Development)

git clone https://github.com/swiftlysingh/excalidraw-cli.git
cd excalidraw-cli
npm install
npm run build
npm link  # Makes 'excalidraw-cli' available globally

Direct Usage (No Install)

# Run directly with node
node dist/cli.js create --inline "[A] -> [B]" -o diagram.excalidraw

Quick Start

Create from DSL

# Inline DSL
excalidraw-cli create --inline "(Start) -> [Process] -> {Decision?}" -o flow.excalidraw

# From file
excalidraw-cli create flowchart.dsl -o diagram.excalidraw

# From stdin
echo "[A] -> [B] -> [C]" | excalidraw-cli create --stdin -o diagram.excalidraw

Export to Image

# Convert an existing .excalidraw file to PNG
excalidraw-cli convert diagram.excalidraw --format png

# Convert with options
excalidraw-cli convert diagram.excalidraw --format png --scale 2 --dark

# Convert to SVG without background
excalidraw-cli convert diagram.excalidraw --format svg --no-export-background

DSL Syntax

| Syntax | Element | Description | |--------|---------|-------------| | [Label] | Rectangle | Process steps, actions | | {Label} | Diamond | Decisions, conditionals | | (Label) | Ellipse | Start/End points | | [[Label]] | Database | Data storage | | -> | Arrow | Connection | | --> | Dashed Arrow | Dashed connection | | -> "text" -> | Labeled Arrow | Connection with label |

Example DSL

(Start) -> [Enter Credentials] -> {Valid?}
{Valid?} -> "yes" -> [Dashboard] -> (End)
{Valid?} -> "no" -> [Show Error] -> [Enter Credentials]

Directives

@direction LR    # Left to Right (default: TB)
@spacing 60      # Node spacing in pixels

CLI Reference

Commands

create

Create an Excalidraw flowchart.

excalidraw-cli create [input] [options]

Options:

  • -o, --output <file> - Output file path (default: flowchart.excalidraw)
  • -f, --format <type> - Input format: dsl, json, dot (default: dsl)
  • --inline <dsl> - Inline DSL string
  • --stdin - Read from stdin
  • -d, --direction <dir> - Flow direction: TB, BT, LR, RL
  • -s, --spacing <n> - Node spacing in pixels
  • --verbose - Verbose output

convert

Convert an existing .excalidraw file to PNG or SVG.

excalidraw-cli convert <input> [options]

Options:

  • --format <format> - (required) Export format: png or svg
  • -o, --output <file> - Output file path (default: input file with swapped extension)
  • --export-background / --no-export-background - Include or exclude background
  • --background-color <color> - Background color (default: #ffffff)
  • --dark - Export with dark mode theme
  • --embed-scene - Embed scene data in exported image
  • --padding <n> - Padding around content in pixels (default: 10)
  • --scale <n> - Scale factor for PNG export (default: 1)
  • --verbose - Verbose output

parse

Parse and validate input without generating output.

excalidraw-cli parse <input> [options]

JSON API

For programmatic flowchart creation:

{
  "nodes": [
    { "id": "start", "type": "ellipse", "label": "Start" },
    { "id": "process", "type": "rectangle", "label": "Process" },
    { "id": "end", "type": "ellipse", "label": "End" }
  ],
  "edges": [
    { "from": "start", "to": "process" },
    { "from": "process", "to": "end" }
  ],
  "options": {
    "direction": "TB",
    "nodeSpacing": 50
  }
}
excalidraw-cli create flowchart.json -o diagram.excalidraw

Programmatic Usage

import {
  createFlowchartFromDSL,
  createFlowchartFromJSON,
  convertToSVG,
  convertToPNG,
} from '@swiftlysingh/excalidraw-cli';

// From DSL
const dsl = '(Start) -> [Process] -> (End)';
const json = await createFlowchartFromDSL(dsl);

// From JSON input
const input = {
  nodes: [
    { id: 'a', type: 'rectangle', label: 'Hello' },
    { id: 'b', type: 'rectangle', label: 'World' }
  ],
  edges: [{ from: 'a', to: 'b' }]
};
const json2 = await createFlowchartFromJSON(input);

Export API

import { convertToSVG, convertToPNG } from '@swiftlysingh/excalidraw-cli';
import { readFileSync, writeFileSync } from 'fs';

// Load an existing .excalidraw file
const file = JSON.parse(readFileSync('diagram.excalidraw', 'utf-8'));

// Export to SVG
const svg = await convertToSVG(file, { padding: 20 });
writeFileSync('diagram.svg', svg);

// Export to PNG with 2x scale and dark mode
const png = await convertToPNG(file, {
  scale: 2,
  dark: true,
});
writeFileSync('diagram.png', png);

@excalidraw/utils remains a required runtime dependency for image export. The CLI uses its exportToSvg() implementation for SVG generation, and reuses the bundled Excalidraw font assets so server-side PNG rendering keeps text output close to the browser version.

Examples

Here are some flowcharts created with excalidraw-cli:

Simple Flow

Simple Flow

iOS App Architecture

iOS App Architecture

LeetCode Problem Solving Flow

LeetCode Flow

Output

The generated .excalidraw files can be:

  1. Opened directly in Excalidraw (File > Open)
  2. Imported into Obsidian with the Excalidraw plugin
  3. Used with any tool that supports the Excalidraw format

With the convert command, you can also generate:

  • SVG — scalable vector graphics, ideal for embedding in docs or web pages
  • PNG — raster images at any scale (1×, 2×, 3×, etc.) for presentations or sharing

License

MIT