Skip to main content

Rendering

Render to SVG

const diagram = Diagram("My Diagram");
// ... add nodes

const svg = await diagram.render();
// Returns SVG string

Render to PNG

const png = await diagram.render({ format: "png" });
// Returns Uint8Array

Render to JPG

const jpg = await diagram.render({ format: "jpg" });
// Returns Uint8Array

Render as Data URL

Get the diagram as a base64 data URL for direct use in HTML:

// SVG as data URL
const svgDataUrl = await diagram.render({ dataUrl: true });
// Returns: data:image/svg+xml;base64,...

// PNG as data URL
const pngDataUrl = await diagram.render({ format: "png", dataUrl: true });
// Returns: data:image/png;base64,...

// JPG as data URL
const jpgDataUrl = await diagram.render({ format: "jpg", dataUrl: true });
// Returns: data:image/jpeg;base64,...

Browser Usage with Data URLs

Use data URLs to display diagrams in <img> tags or download them:

const dataUrl = await diagram.render({ dataUrl: true });

// Display in an image element
const img = document.createElement("img");
img.src = dataUrl;
document.body.appendChild(img);

// Or create a download link
const link = document.createElement("a");
link.href = dataUrl;
link.download = "diagram.svg";
link.click();

Save to File

// Auto-detects format from extension
await diagram.save("diagram.svg");
await diagram.save("diagram.png");

Render Options

const svg = await diagram.render({
format: "svg", // 'svg' | 'png' | 'jpg' | 'dot'
width: 800, // Output width (for PNG/JPG)
height: 600, // Output height (for PNG/JPG)
scale: 2, // Scale factor (default: 2 for PNG/JPG)
dataUrl: true, // Return as base64 data URL
embedData: false, // Disable embedded diagram metadata in SVG
});

SVG Data Embedding

By default, all SVG output includes embedded diagram metadata, allowing you to re-import the SVG later:

const svg = await diagram.render();
// SVG contains embedded data-diagram-json attribute

// Re-import later
const restored = await Diagram.fromSVG(svg);

To generate a clean SVG without embedded data:

const cleanSvg = await diagram.render({ embedData: false });

Import from SVG

Restore a diagram from an SVG that was previously exported or rendered:

import { Diagram } from "diagrams-js";

// From a rendered/exported SVG string
const restored = await Diagram.fromSVG(svgString);

// Or merge into an existing diagram
const diagram = Diagram("Merged");
await diagram.import(svgString, "svg");

Browser Usage

// Get SVG string
const svg = await diagram.render();

// Insert into DOM
document.getElementById("diagram").innerHTML = svg;

SVG DOM Manipulation

You can attach CSS classes and data attributes to nodes, edges, and clusters, then manipulate them in the browser after rendering.

Adding CSS Classes and Data Attributes

const diagram = Diagram("Interactive");

const server = diagram.add(
Node("Server", {
className: "server-node",
dataAttrs: { team: "backend", env: "prod" },
}),
);

const db = diagram.add(
Node("Database", {
className: "db-node",
dataAttrs: { team: "data" },
}),
);

server.to(
Edge({
className: "critical-edge",
dataAttrs: { latency: "50ms" },
}),
db,
);

const cluster = diagram.cluster("Production", {
className: "prod-cluster",
dataAttrs: { region: "us-east-1" },
});

Querying SVG Elements

After rendering and inserting into the DOM, use getElement() to access SVG elements:

const svg = await diagram.render();
document.getElementById("diagram").innerHTML = svg;

// Query from current document (browser only)
const serverEl = server.getElement();
const dbEl = db.getElement();
const edgeEl = edge.getElement();
const clusterEl = cluster.getElement();

// Or query within a specific SVG string/element
const serverEl2 = server.getElement(svg);

Adding Event Handlers

const serverEl = server.getElement();
if (serverEl) {
serverEl.addEventListener("click", () => {
console.log("Server clicked!");
serverEl.classList.add("selected");
});

serverEl.addEventListener("mouseenter", () => {
serverEl.style.opacity = "0.8";
});
}

Dynamic Styling

// Highlight all nodes in production
const nodes = document.querySelectorAll('[data-env="prod"]');
nodes.forEach((el) => el.classList.add("highlight"));

// Dim non-critical edges
const edges = document.querySelectorAll(".edge:not(.critical-edge)");
edges.forEach((el) => (el.style.opacity = "0.5"));

The after:layout Hook

For plugin authors, the after:layout hook fires after Graphviz produces the SVG but before format conversion (PNG/JPG). This lets you modify the SVG string and have changes reflected in raster output too.

import { HookEvent } from "diagrams-js";

const modifySvgPlugin = () => ({
name: "svg-modifier",
version: "1.0.0",
apiVersion: "1.0",
runtimeSupport: { node: true, browser: true, deno: true, bun: true },
capabilities: [
{
type: "hook",
hooks: [
{
event: HookEvent.AFTER_LAYOUT,
handler: async ({ svg, diagram, format }) => {
// Modify SVG before PNG/JPG conversion
const modified = svg.replace(/stroke="#7b8894"/g, 'stroke="red"');
return { svg: modified, diagram, format };
},
},
],
},
],
});

const diagram = Diagram("Test");
await diagram.registerPlugins([modifySvgPlugin()]);

Node.js Usage

import { writeFile } from "fs/promises";

const svg = await diagram.render();
await writeFile("output.svg", svg);

const png = await diagram.render({ format: "png" });
await writeFile("output.png", Buffer.from(png));

Export to JSON

const diagram = Diagram("Web Architecture");
diagram.add(EC2("Web Server"));
diagram.add(RDS("Database"));

// Export to JSON
const json = diagram.toJSON();
console.log(JSON.stringify(json, null, 2));

JSON Output Example

{
"name": "Web Architecture",
"nodes": [
{
"id": "n1",
"label": "Web Server",
"provider": "aws",
"type": "compute",
"resource": "EC2"
},
{
"id": "n2",
"label": "Database",
"provider": "aws",
"type": "database",
"resource": "RDS"
}
],
"edges": [{ "from": "n1", "to": "n2" }]
}

Import from JSON

Restore a diagram from JSON using the static Diagram.fromJSON() method:

import { Diagram } from "diagrams-js";

const json = {
name: "My Architecture",
nodes: [
{
id: "web",
label: "Web Server",
provider: "aws",
type: "compute",
resource: "EC2",
},
{
id: "db",
label: "Database",
provider: "aws",
type: "database",
resource: "RDS",
},
],
edges: [{ from: "web", to: "db", label: "SQL" }],
};

const diagram = await Diagram.fromJSON(json);
const svg = await diagram.render();

JSON Schema

The JSON format follows a JSON Schema for validation. Reference it in your JSON files:

{
"$schema": "https://diagrams-js.hatemhosny.dev/schema/diagram.json",
"name": "My Architecture",
"nodes": [...]
}