bpmn-diagram
Converts BPMN 2.0 XML to PNG diagram images. Use when user provides BPMN XML content or file path and asks to visualize, render, or create a diagram from a BPMN process definition.
When & Why to Use This Skill
This Claude skill automates the conversion of BPMN 2.0 XML process definitions into high-quality PNG diagram images. By transforming complex XML code into intuitive visual workflows, it helps users document, analyze, and communicate business processes effectively, bridging the gap between technical definitions and visual understanding.
Use Cases
- Standard Operating Procedure (SOP) Creation: Automatically generate visual flowcharts from BPMN XML to include in organizational playbooks and training manuals.
- Business Process Documentation: Convert technical process exports from modeling tools into shareable image formats for stakeholder presentations and reports.
- Workflow Validation and Debugging: Visually inspect and verify the logic of a BPMN process by rendering the XML structure to identify errors or bottlenecks.
- Architectural Design Visualization: Assist system architects in quickly rendering process diagrams during the design phase of software or business infrastructure.
| name | bpmn-diagram |
|---|---|
| description | Converts BPMN 2.0 XML to PNG diagram images. Use when user provides BPMN XML content or file path and asks to visualize, render, or create a diagram from a BPMN process definition. |
BPMN Diagram Skill
This skill converts BPMN 2.0 XML into PNG diagram images using the bpmn-js rendering toolkit.
Prerequisites
Before first use, ensure dependencies are installed:
cd ~/.claude/skills/bpmn-diagram/scripts && ./setup.sh
Or for project-local skills:
cd .claude/skills/bpmn-diagram/scripts && ./setup.sh
Usage
Input Formats
The skill accepts BPMN 2.0 XML in two ways:
- File path: Path to an existing
.bpmnor.xmlfile - Inline XML: Raw BPMN XML content provided directly
Rendering a Diagram
From a file:
node scripts/render-bpmn.js /path/to/diagram.bpmn /path/to/output.png
From inline XML:
- First, write the BPMN XML to a temporary file
- Then run the render script
- The PNG will be created at the specified output path
Script Options
| Option | Description | Default |
|---|---|---|
--scale=N |
Image scale factor (e.g., 2 for 2x resolution) | 1 |
--min-dimensions=WxH |
Minimum output dimensions in pixels | 800x600 |
Example with options:
node scripts/render-bpmn.js input.bpmn output.png --scale=2 --min-dimensions=1200x800
Workflow
When a user requests a BPMN diagram:
- Identify the input: Determine if XML is inline or in a file
- Validate the XML: Check for valid BPMN 2.0 structure
- Must have
<definitions>root element with BPMN namespace - Should contain
<bpmndi:BPMNDiagram>for visual layout
- Must have
- Prepare input file: If inline XML, write to a temp
.bpmnfile - Execute render script: Run
node scripts/render-bpmn.js - Report result: Provide the output PNG path to the user
BPMN 2.0 XML Structure
Valid BPMN 2.0 XML must follow this structure:
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
id="Definitions_1"
targetNamespace="http://bpmn.io/schema/bpmn">
<!-- Process definition -->
<process id="Process_1" isExecutable="false">
<!-- BPMN elements: events, tasks, gateways, flows -->
</process>
<!-- Diagram interchange (visual layout) -->
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
<!-- Shape and edge definitions for visual rendering -->
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
Error Handling
| Error | Cause | Solution |
|---|---|---|
| "Not valid XML" | Malformed XML syntax | Check XML structure, escape special characters |
| "Not BPMN 2.0 format" | Missing <definitions> root |
Ensure proper BPMN namespace and root element |
| "No diagram layout" | Missing <bpmndi:BPMNDiagram> |
Add diagram interchange section or use auto-layout |
| "Render failed" | Canvas/dependencies issue | Ensure setup.sh was run, check system dependencies |
| "File not found" | Invalid input path | Verify file path exists |
Known Limitations
This skill uses a pure Node.js rendering approach with jsdom and canvas, which has some limitations compared to browser-based rendering:
- SVG Transform Positioning: Some complex transform operations may not be perfectly positioned
- Text Rendering: Font rendering depends on system fonts available
- Complex Diagrams: Very large or complex diagrams may have rendering artifacts
For production use with complex diagrams, consider:
- Using
bpmn-to-imagewith Puppeteer (requires Chrome/Chromium) - Running the rendering in an actual browser environment
Common BPMN Elements
See references/bpmn-elements.md for a complete reference of supported BPMN 2.0 elements.
Quick Reference
Events:
startEvent,endEvent,intermediateCatchEvent,intermediateThrowEvent
Activities:
task,userTask,serviceTask,scriptTask,sendTask,receiveTasksubProcess,callActivity
Gateways:
exclusiveGateway(XOR),parallelGateway(AND),inclusiveGateway(OR)eventBasedGateway,complexGateway
Flows:
sequenceFlow,messageFlow,association
Swimlanes:
participant(Pool),lane
Example
Input (simple-process.bpmn):
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
id="Definitions_1">
<process id="Process_1" isExecutable="false">
<startEvent id="Start_1" name="Start"/>
<task id="Task_1" name="Do Something"/>
<endEvent id="End_1" name="End"/>
<sequenceFlow id="Flow_1" sourceRef="Start_1" targetRef="Task_1"/>
<sequenceFlow id="Flow_2" sourceRef="Task_1" targetRef="End_1"/>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
<bpmndi:BPMNShape id="Start_1_di" bpmnElement="Start_1">
<dc:Bounds x="152" y="102" width="36" height="36"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Task_1_di" bpmnElement="Task_1">
<dc:Bounds x="240" y="80" width="100" height="80"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="End_1_di" bpmnElement="End_1">
<dc:Bounds x="392" y="102" width="36" height="36"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
<di:waypoint x="188" y="120"/>
<di:waypoint x="240" y="120"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2">
<di:waypoint x="340" y="120"/>
<di:waypoint x="392" y="120"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
Command:
node scripts/render-bpmn.js simple-process.bpmn simple-process.png
Output: simple-process.png - A PNG image of the rendered BPMN diagram