
Mermaid Tools
- 932 installs
- 1.3k repo stars
- Updated August 4, 2026
- daymade/claude-code-skills
mermaid-tools is a documentation skill that turns Mermaid blocks in repositories or docs into validated PNG and SVG diagrams using mermaid-cli and bundled extract-and-generate scripts for developers who need renderable a
About
mermaid-tools is a skill from daymade/claude-code-skills that automates Mermaid diagram rendering in codebases and documentation. It requires Node.js and a global @mermaid-js/mermaid-cli install verified with mmdc --version, then uses bundled extract-and-generate scripts to pull Mermaid fenced blocks from files and export validated PNG or SVG assets. Developers reach for mermaid-tools when README or docs contain ```mermaid blocks that must become checked-in images for PDFs, wikis, or PR review. The skill documents environment variables, WSL2 Chrome setup for headless rendering, and a validation workflow to catch broken diagram syntax before publish.
- Documents prerequisites for Node.js, global @mermaid-js/mermaid-cli, and Python 3 for the bundled extractor.
- WSL2-focused Google Chrome install steps plus dependency packages for headless mmdc rendering.
- Script paths under the skill’s scripts/ directory (extract-and-generate.sh and Python extractor).
- Environment variable and troubleshooting sections for failed renders and CLI setup.
- Validation workflow to confirm mmdc and Chrome before generating diagrams.
Mermaid Tools by the numbers
- 932 all-time installs (skills.sh)
- +51 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #279 of 1,879 Documentation skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/daymade/claude-code-skills --skill mermaid-toolsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 932 |
|---|---|
| repo stars | ★ 1.3k |
| Security audit | 3 / 3 scanners passed |
| Last updated | August 4, 2026 |
| Repository | daymade/claude-code-skills ↗ |
How do you render Mermaid diagrams to PNG from docs?
Turn Mermaid blocks in repos or docs into validated PNG/SVG diagrams using mermaid-cli and bundled extract-and-generate scripts.
Who is it for?
Developers maintaining architecture docs with inline Mermaid blocks who need automated PNG/SVG exports via mermaid-cli.
Skip if: Live interactive diagram editors or projects with no Mermaid syntax in markdown files.
When should I use this skill?
Repository or documentation files contain Mermaid blocks that must be extracted and rendered to PNG or SVG with validation.
What you get
Validated PNG and SVG diagram files generated from repository Mermaid code blocks.
- PNG diagram files
- SVG diagram files
Files
Mermaid Tools
Overview
This skill enables extraction of Mermaid diagrams from markdown files and generation of high-quality PNG images. The skill bundles all necessary scripts (extract-and-generate.sh, extract_diagrams.py, and puppeteer-config.json) in the scripts/ directory for portability and reliability.
Core Workflow
Standard Diagram Extraction and Generation
Extract Mermaid diagrams from a markdown file and generate PNG images using the bundled extract-and-generate.sh script:
cd "${CLAUDE_SKILL_DIR}/scripts"
./extract-and-generate.sh "<markdown_file>" "<output_directory>"Parameters:
<markdown_file>: Path to the markdown file containing Mermaid diagrams<output_directory>: (Optional) Directory for output files. Defaults to<markdown_file_directory>/diagrams
Example:
cd "${CLAUDE_SKILL_DIR}/scripts"
./extract-and-generate.sh "<markdown_file>" "<output_directory>"What the Script Does
1. Extracts all Mermaid code blocks from the markdown file 2. Numbers them sequentially (01, 02, 03, etc.) in order of appearance 3. Generates .mmd files for each diagram 4. Creates high-resolution PNG images with smart sizing 5. Validates all generated PNG files
Output Files
For each diagram, the script generates:
01-diagram-name.mmd- Extracted Mermaid code01-diagram-name.png- High-resolution PNG image
The numbering ensures diagrams maintain their order from the source document.
Advanced Usage
Custom Dimensions and Scaling
Override default dimensions using environment variables:
cd "${CLAUDE_SKILL_DIR}/scripts"
MERMAID_WIDTH=1600 MERMAID_HEIGHT=1200 ./extract-and-generate.sh "<markdown_file>" "<output_directory>"Available variables:
MERMAID_WIDTH(default: 1200) - Base width in pixelsMERMAID_HEIGHT(default: 800) - Base height in pixelsMERMAID_SCALE(default: 2) - Scale factor for high-resolution output
High-Resolution Output for Presentations
cd "${CLAUDE_SKILL_DIR}/scripts"
MERMAID_WIDTH=2400 MERMAID_HEIGHT=1800 MERMAID_SCALE=4 ./extract-and-generate.sh "<markdown_file>" "<output_directory>"Print-Quality Output
cd "${CLAUDE_SKILL_DIR}/scripts"
MERMAID_SCALE=5 ./extract-and-generate.sh "<markdown_file>" "<output_directory>"Smart Sizing Feature
The script automatically adjusts dimensions based on diagram type (detected from filename):
- Timeline/Gantt: 2400×400 (wide and short)
- Architecture/System/Caching: 2400×1600 (large and detailed)
- Monitoring/Workflow/Sequence/API: 2400×800 (wide for process flows)
- Default: 1200×800 (standard size)
Context-aware naming in the extraction process helps trigger appropriate smart sizing.
Important Principles
Use Bundled Scripts
CRITICAL: Use the bundled extract-and-generate.sh script from this skill's scripts/ directory. All necessary dependencies are bundled together.
Change to Script Directory
Run the script from its own directory to properly locate dependencies (extract_diagrams.py and puppeteer-config.json):
cd "${CLAUDE_SKILL_DIR}/scripts"
./extract-and-generate.sh "<markdown_file>" "<output_directory>"Running the script without changing to the scripts directory first may fail due to missing dependencies.
Prerequisites Verification
Before running the script, verify dependencies are installed:
1. mermaid-cli: mmdc --version 2. Google Chrome: google-chrome-stable --version 3. Python 3: python3 --version
If any are missing, consult references/setup_and_troubleshooting.md for installation instructions.
Troubleshooting
For detailed troubleshooting guidance, refer to references/setup_and_troubleshooting.md, which covers:
- Browser launch failures
- Permission issues
- No diagrams found
- Python extraction failures
- Output quality issues
- Diagram-specific sizing problems
Quick fixes for common issues:
Permission denied:
chmod +x "${CLAUDE_SKILL_DIR}/scripts/extract-and-generate.sh"Low quality output:
MERMAID_SCALE=3 ./extract-and-generate.sh "<markdown_file>" "<output_directory>"Chrome/Puppeteer errors: Verify all WSL2 dependencies are installed (see references for full list).
Bundled Resources
scripts/
This skill bundles all necessary scripts for Mermaid diagram generation:
- extract-and-generate.sh - Main script that orchestrates extraction and PNG generation
- extract_diagrams.py - Python script for extracting Mermaid code blocks from markdown
- puppeteer-config.json - Chrome/Puppeteer configuration for WSL2 environment
All scripts must be run from the scripts/ directory to properly locate dependencies.
references/setup_and_troubleshooting.md
Comprehensive reference documentation including:
- Complete prerequisite installation instructions
- Detailed environment variable reference
- Extensive troubleshooting guide
- WSL2-specific Chrome dependency setup
- Validation procedures
Load this reference when dealing with setup issues, installation problems, or advanced customization needs.
Security scan passed
Scanned at: 2026-06-13T19:44:41.931593
Tool: gitleaks + pattern-based validation
Content hash: aeb15891ceadd351bb4c313a0a2a145d68102593f507d89dfe4dc637e98b98a9
Mermaid Diagram Generation - Setup and Troubleshooting
Table of Contents
Prerequisites
1. Node.js and mermaid-cli
Install mermaid-cli globally:
npm install -g @mermaid-js/mermaid-cliVerify installation:
mmdc --version2. Google Chrome for WSL2
Install Chrome and dependencies:
# Add Chrome repository
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
# Update and install Chrome
sudo apt update
sudo apt install -y google-chrome-stable
# Install required dependencies for WSL2
sudo apt install -y libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb fonts-liberation libxml2-utilsVerify Chrome installation:
google-chrome-stable --version3. Python 3
The extraction script requires Python 3 (usually pre-installed on Ubuntu):
python3 --versionScript Locations
The mermaid diagram tools are bundled with this skill in the scripts/ directory:
- Main script:
${CLAUDE_SKILL_DIR}/scripts/extract-and-generate.sh - Python extractor:
${CLAUDE_SKILL_DIR}/scripts/extract_diagrams.py - Puppeteer config:
${CLAUDE_SKILL_DIR}/scripts/puppeteer-config.json
All scripts should be run from the scripts/ directory to properly locate dependencies.
Features
Smart Sizing
The script automatically adjusts diagram dimensions based on filename patterns:
- Timeline/Gantt charts: 2400x400 (wide and short)
- Architecture/System/Caching diagrams: 2400x1600 (large and detailed)
- Monitoring/Workflow/Sequence/API diagrams: 2400x800 (wide for process flows)
- Default: 1200x800 (standard size)
Sequential Numbering
Diagrams are automatically numbered sequentially (01, 02, 03, etc.) in the order they appear in the markdown file.
High-Resolution Output
Default scale factor is 2x for high-quality output. Can be customized with environment variables.
Environment Variables
Override default dimensions and scaling:
| Variable | Default | Description |
|---|---|---|
MERMAID_WIDTH | 1200 | Base width for generated PNGs |
MERMAID_HEIGHT | 800 | Base height for generated PNGs |
MERMAID_SCALE | 2 | Scale factor for high-resolution output |
Examples
# Custom dimensions
MERMAID_WIDTH=1600 MERMAID_HEIGHT=1200 ./extract-and-generate.sh "file.md" "output_dir"
# High-resolution mode for presentations
MERMAID_WIDTH=2400 MERMAID_HEIGHT=1800 MERMAID_SCALE=4 ./extract-and-generate.sh "file.md" "output_dir"
# Ultra-high resolution for print materials
MERMAID_SCALE=5 ./extract-and-generate.sh "file.md" "output_dir"Troubleshooting
Browser Launch Failures
Symptom: Errors about Chrome not launching or Puppeteer failures
Solution: 1. Verify Chrome is installed: google-chrome-stable --version 2. Check Chrome path in script matches: /usr/bin/google-chrome-stable 3. Ensure all dependencies are installed (see Prerequisites section 2) 4. Verify puppeteer-config.json exists at the expected location
Permission Issues
Symptom: "Permission denied" when running the script
Solution:
chmod +x "${CLAUDE_SKILL_DIR}/scripts/extract-and-generate.sh"No Diagrams Found
Symptom: Script reports "No .mmd files found" or "No diagrams extracted"
Solution: 1. Verify the markdown file contains Mermaid code blocks ( `mermaid) 2. Check the markdown file path is correct 3. Ensure Mermaid code blocks are properly formatted
Python Extraction Failures
Symptom: Errors during the extraction phase
Solution: 1. Verify Python 3 is installed: python3 --version 2. Check the markdown file encoding (should be UTF-8) 3. Review the markdown file for malformed Mermaid code blocks
Output Quality Issues
Symptom: Generated images are too small or low quality
Solution: Use environment variables to increase dimensions and scale:
MERMAID_WIDTH=2400 MERMAID_HEIGHT=1800 MERMAID_SCALE=3 ./extract-and-generate.sh "file.md" "output_dir"Diagram-Specific Sizing Issues
Symptom: Specific diagram types don't render well with default sizes
Solution: The script has smart sizing for common patterns, but you can override for specific cases:
# For very wide sequence diagrams
MERMAID_WIDTH=3000 MERMAID_HEIGHT=1000 ./extract-and-generate.sh "file.md" "output_dir"
# For very tall flowcharts
MERMAID_WIDTH=1200 MERMAID_HEIGHT=2400 ./extract-and-generate.sh "file.md" "output_dir"Validation
The script automatically validates generated PNG files by: 1. Checking file size is non-zero 2. Verifying the file is a valid PNG image 3. Reporting actual dimensions 4. Displaying file size in bytes
Look for ✅ validation messages in the output to confirm successful generation.
#!/usr/bin/env python3
"""
Extract Mermaid diagrams from markdown file and create numbered .mmd files
"""
import re
import sys
from pathlib import Path
def extract_mermaid_diagrams(markdown_file, output_dir):
"""Extract Mermaid diagrams from markdown file and create numbered .mmd files"""
try:
with open(markdown_file, 'r', encoding='utf-8') as f:
content = f.read()
except Exception as e:
print(f"ERROR: Cannot read markdown file: {e}")
return []
# Find all mermaid code blocks with their content
mermaid_pattern = r'```mermaid\n(.*?)\n```'
matches = re.findall(mermaid_pattern, content, re.DOTALL)
if not matches:
print("No Mermaid diagrams found in markdown file")
return []
# Extract diagram names from context (look backwards for section headers)
diagrams = []
lines = content.split('\n')
for i, match in enumerate(matches, 1):
# Find the position of this diagram in the content
diagram_pattern = f'```mermaid\n{re.escape(match)}\n```'
diagram_match = re.search(diagram_pattern, content)
if not diagram_match:
# Fallback: use simple search
diagram_start = content.find(f'```mermaid\n{match}\n```')
else:
diagram_start = diagram_match.start()
# Count lines up to this point to find context
if diagram_start >= 0:
lines_before = content[:diagram_start].count('\n')
else:
lines_before = 0
# Look backwards for the most recent section header or meaningful context
diagram_name = f"diagram-{i:02d}" # Default fallback
# Look for context clues in the 20 lines before the diagram
context_start = max(0, lines_before - 20)
context_lines = lines[context_start:lines_before] if lines_before > 0 else []
# Priority 1: Look for specific diagram descriptions
for line in reversed(context_lines):
line = line.strip().lower()
if 'system architecture' in line:
diagram_name = f"{i:02d}-system-architecture"
break
elif 'authentication flow' in line:
diagram_name = f"{i:02d}-authentication-flow"
break
elif 'caching architecture' in line or 'multi-layer cache' in line:
diagram_name = f"{i:02d}-caching-architecture"
break
elif 'data flow' in line or 'redshift schema' in line:
diagram_name = f"{i:02d}-data-flow"
break
elif 'api request' in line or 'dashboard metrics endpoints' in line:
diagram_name = f"{i:02d}-api-request-response"
break
elif 'dashboard layout' in line or 'presentation layer' in line:
diagram_name = f"{i:02d}-dashboard-layout"
break
elif 'agency' in line and ('hierarchy' in line or 'filter' in line):
diagram_name = f"{i:02d}-agency-hierarchy"
break
# Priority 2: Look for section headers (## or ###)
if diagram_name.startswith('diagram-'):
for line in reversed(context_lines):
line = line.strip()
if line.startswith('###') or line.startswith('##'):
# Extract meaningful part from header
header = re.sub(r'^#+\s*\*?\*?', '', line)
header = re.sub(r'\*?\*?$', '', header)
header = header.strip()
# Convert to filename-friendly format
name_part = re.sub(r'[^\w\s-]', '', header)
name_part = re.sub(r'\s+', '-', name_part.strip())
name_part = name_part.lower()[:30] # Limit length
if name_part and name_part != 'detailed-design':
diagram_name = f"{i:02d}-{name_part}"
break
diagrams.append({
'number': i,
'name': diagram_name,
'content': match.strip()
})
print(f"Found diagram {i}: {diagram_name}")
# Write .mmd files
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
created_files = []
for diagram in diagrams:
mmd_file = output_path / f"{diagram['name']}.mmd"
try:
with open(mmd_file, 'w', encoding='utf-8') as f:
f.write(diagram['content'])
created_files.append(str(mmd_file))
print(f"Created: {mmd_file}")
except Exception as e:
print(f"ERROR: Cannot create {mmd_file}: {e}")
return created_files
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python3 extract_diagrams.py <markdown_file> <output_directory>")
sys.exit(1)
markdown_file = sys.argv[1]
output_dir = sys.argv[2]
files = extract_mermaid_diagrams(markdown_file, output_dir)
print(f"\nExtracted {len(files)} diagrams successfully")#!/bin/bash
# Enhanced Mermaid diagram extraction and PNG generation script
# Extracts diagrams from markdown and numbers them sequentially
#
# Usage: ./extract-and-generate.sh <markdown_file> [output_directory]
# Example: ./extract-and-generate.sh <markdown_file> <output_directory>
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="$SCRIPT_DIR/puppeteer-config.json"
EXTRACTOR_SCRIPT="$SCRIPT_DIR/extract_diagrams.py"
# Parse arguments
if [ $# -lt 1 ]; then
echo "Usage: $0 <markdown_file> [output_directory]"
echo "Example: $0 <markdown_file> <output_directory>"
exit 1
fi
MARKDOWN_FILE="$1"
OUTPUT_DIR="${2:-$(dirname "$MARKDOWN_FILE")/diagrams}"
echo "=== Enhanced Mermaid Diagram Processor ==="
echo "Source markdown: $MARKDOWN_FILE"
echo "Output directory: $OUTPUT_DIR"
echo "Environment: WSL2 Ubuntu with Chrome dependencies"
echo
# Validate inputs
if [ ! -f "$MARKDOWN_FILE" ]; then
echo "ERROR: Markdown file not found: $MARKDOWN_FILE"
exit 1
fi
# Create output directory if it doesn't exist
mkdir -p "$OUTPUT_DIR"
# Configuration
CHROME_PATH="/usr/bin/google-chrome-stable"
# Check dependencies
echo "Checking dependencies..."
if ! command -v mmdc &> /dev/null; then
echo "ERROR: @mermaid-js/mermaid-cli not installed"
echo "Install with: npm install -g @mermaid-js/mermaid-cli"
exit 1
fi
if [ ! -f "$CHROME_PATH" ]; then
echo "ERROR: Google Chrome not found at $CHROME_PATH"
echo "Install Chrome and dependencies with the setup commands"
exit 1
fi
if [ ! -f "$CONFIG_FILE" ]; then
echo "ERROR: Puppeteer config not found: $CONFIG_FILE"
exit 1
fi
if [ ! -f "$EXTRACTOR_SCRIPT" ]; then
echo "ERROR: Python extractor script not found: $EXTRACTOR_SCRIPT"
exit 1
fi
echo "✅ Dependencies verified"
echo
# Extract Mermaid diagrams from markdown
echo "Extracting Mermaid diagrams from markdown..."
python3 "$EXTRACTOR_SCRIPT" "$MARKDOWN_FILE" "$OUTPUT_DIR"
if [ $? -ne 0 ]; then
echo "ERROR: Failed to extract diagrams from markdown"
exit 1
fi
echo
# Now generate PNGs using the existing generation logic
echo "Generating PNG files..."
cd "$OUTPUT_DIR"
# Default dimensions - can be overridden with environment variables
DEFAULT_WIDTH="${MERMAID_WIDTH:-1200}"
DEFAULT_HEIGHT="${MERMAID_HEIGHT:-800}"
SCALE_FACTOR="${MERMAID_SCALE:-2}"
# Process all .mmd files in order
mmd_files=(*.mmd)
if [ ${#mmd_files[@]} -eq 1 ] && [ "${mmd_files[0]}" = "*.mmd" ]; then
echo "No .mmd files found in output directory"
exit 0
fi
# Sort files numerically by their prefix
IFS=$'\n' mmd_files=($(sort -V <<< "${mmd_files[*]}"))
echo "Found ${#mmd_files[@]} Mermaid diagram(s) to process"
echo
for mmd_file in "${mmd_files[@]}"; do
if [ ! -f "$mmd_file" ]; then
continue
fi
# Extract filename without extension
diagram="${mmd_file%.mmd}"
# Use smart defaults based on diagram content or filename patterns
width="$DEFAULT_WIDTH"
height="$DEFAULT_HEIGHT"
# Smart sizing based on filename patterns
if [[ "$diagram" =~ timeline|gantt ]]; then
width=$((DEFAULT_WIDTH * 2)) # Wider for timelines
height=$((DEFAULT_HEIGHT / 2)) # Shorter for timelines
elif [[ "$diagram" =~ architecture|system ]]; then
width=$((DEFAULT_WIDTH * 2)) # Larger for complex diagrams
height=$((DEFAULT_HEIGHT * 2))
elif [[ "$diagram" =~ caching ]]; then
width=$((DEFAULT_WIDTH * 2)) # Larger for caching flowcharts
height=$((DEFAULT_HEIGHT * 2))
elif [[ "$diagram" =~ monitoring|workflow|sequence|api ]]; then
width=$((DEFAULT_WIDTH * 2)) # Wider for workflows and sequences
height="$DEFAULT_HEIGHT"
fi
echo "Generating $diagram.png (${width}x${height}, scale: ${SCALE_FACTOR}x)..."
PUPPETEER_EXECUTABLE_PATH="$CHROME_PATH" mmdc \
-i "$mmd_file" \
-o "$diagram.png" \
--puppeteerConfigFile "$CONFIG_FILE" \
-w "$width" \
-H "$height" \
-s "$SCALE_FACTOR"
if [ $? -eq 0 ]; then
echo " ✅ Generated successfully"
else
echo " ❌ Generation failed"
continue
fi
# Validate PNG
if test -s "$diagram.png" && file "$diagram.png" | grep -q "PNG image"; then
size=$(stat -c%s "$diagram.png")
dimensions_actual=$(identify -format "%wx%h" "$diagram.png" 2>/dev/null || echo "unknown")
echo " ✅ Validated PNG (${size} bytes, ${dimensions_actual})"
else
echo " ❌ PNG validation failed"
fi
echo
done
echo "=== Generation Complete ==="
echo "All PNG diagrams generated and validated successfully!"
echo
echo "Generated files (in sequence order):"
ls -la [0-9][0-9]-*.png 2>/dev/null | awk '{printf " %s (%s bytes)\n", $9, $5}' || echo " No numbered PNG files found"
echo
echo "Generated files (all):"
ls -la *.png 2>/dev/null | awk '{printf " %s (%s bytes)\n", $9, $5}' || echo " No PNG files found"
{
"args": [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--disable-gpu",
"--no-first-run",
"--disable-background-timer-throttling",
"--disable-backgrounding-occluded-windows",
"--disable-renderer-backgrounding",
"--disable-features=TranslateUI",
"--disable-ipc-flooding-protection"
]
}Related skills
FAQ
What does mermaid-tools require to render diagrams?
mermaid-tools requires Node.js and a global @mermaid-js/mermaid-cli install; verify with mmdc --version before running bundled extract-and-generate scripts for PNG or SVG output.
Can mermaid-tools process diagrams across a whole repository?
mermaid-tools includes bundled scripts that extract Mermaid fenced blocks from repository files and generate validated PNG or SVG assets, with troubleshooting notes for WSL2 Chrome headless rendering.
Is Mermaid Tools safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.