
Fireworks Tech Graph
- 14.7k installs
- 9.5k repo stars
- Updated July 17, 2026
- yizhiyanhua-ai/fireworks-tech-graph
Fireworks Tech Graph is a skill for generating production-quality SVG technical diagrams that export as PNG via multiple rendering engines.
About
Fireworks Tech Graph is a skill for generating production-quality SVG technical diagrams with multiple export formats. It supports architecture, data flow, flowchart, sequence, UML, ER, and network topology diagrams. Developers and technical writers use it to create documentation and specification visuals without manual diagram tools.
- Generate production-quality SVG technical diagrams exported as PNG via cairosvg, rsvg-convert, or puppeteer
- Supports 14+ diagram types including architecture, sequence, flowchart, UML (class, state machine, use case), ER, and ne
- Helper scripts for SVG generation, validation, and batch PNG export
Fireworks Tech Graph by the numbers
- 14,662 all-time installs (skills.sh)
- +761 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #46 of 1,896 Design & UI/UX skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
fireworks-tech-graph capabilities & compatibility
- Capabilities
- svg generation · diagram validation · png export · arrow routing
- Use cases
- documentation · code review
What fireworks-tech-graph says it does
Generate production-quality SVG technical diagrams exported as PNG via `cairosvg` (recommended), `rsvg-convert`, or `puppeteer`.
npx skills add https://github.com/yizhiyanhua-ai/fireworks-tech-graph --skill fireworks-tech-graphAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 14.7k |
|---|---|
| repo stars | ★ 9.5k |
| Security audit | 2 / 3 scanners passed |
| Last updated | July 17, 2026 |
| Repository | yizhiyanhua-ai/fireworks-tech-graph ↗ |
How do you generate architecture diagrams from descriptions?
Create technical diagrams for software architecture, API documentation, and system design during Build and documentation phases.
Who is it for?
Architects, technical writers, and developers creating system architecture diagrams, API flows, data pipelines, and database schemas for documentation.
Skip if: UI/UX mockups for user-facing applications; hand-drawn or informal sketches; non-technical diagrams.
When should I use this skill?
A developer asks to draw, visualize, or generate an architecture diagram, flowchart, sequence diagram, or concept map from a system description.
What you get
Production-quality SVG diagram files and PNG exports for architecture, flowchart, sequence, and concept-map visualizations.
- SVG technical diagram
- PNG exported diagram
- Validated diagram
By the numbers
- Supports 6 diagram types: architecture, data flow, flowchart, sequence, agent memory, and concept map
- Exports via 3 renderers: cairosvg, rsvg-convert, and puppeteer
Files
Fireworks Tech Graph
Generate production-quality SVG technical diagrams exported as PNG via cairosvg (recommended), rsvg-convert, or puppeteer.
Install Source
Install this skill from GitHub:
npx skills add yizhiyanhua-ai/fireworks-tech-graphPublic package page:
https://www.npmjs.com/package/@yizhiyanhua-ai/fireworks-tech-graphDo not pass @yizhiyanhua-ai/fireworks-tech-graph directly to skills add, because the CLI expects a GitHub or local repository source.
Update command:
npx skills add yizhiyanhua-ai/fireworks-tech-graph --force -g -yHelper Scripts (Recommended)
Four helper scripts in scripts/ directory provide stable SVG generation and validation:
1. generate-diagram.sh - Validate SVG + export PNG
./scripts/generate-diagram.sh -t architecture -s 1 -o ./output/arch.svg- Validates an existing SVG file
- Exports PNG after validation
- Example:
./scripts/generate-diagram.sh -t architecture -s 1 -o ./output/arch.svg
2. generate-from-template.py - Create starter SVG from template
python3 ./scripts/generate-from-template.py architecture ./output/arch.svg '{"title":"My Diagram","nodes":[],"arrows":[]}'- Loads a built-in SVG template
- Renders nodes, arrows, and legend entries from JSON input
- Escapes text content to keep output XML-valid
3. validate-svg.sh - Validate SVG syntax
./scripts/validate-svg.sh <svg-file>- Checks XML syntax
- Verifies tag balance
- Validates marker references
- Checks attribute completeness
- Validates path data
4. test-all-styles.sh - Batch test all styles
./scripts/test-all-styles.sh- Tests multiple diagram sizes
- Validates all generated SVGs
- Generates test report
When to use scripts:
- Use scripts when generating complex SVGs to avoid syntax errors
- Scripts provide automatic validation and error reporting
- Recommended for production diagrams
When to generate SVG directly:
- Simple diagrams with few elements
- Quick prototypes
- When you need full control over SVG structure
Workflow (Always Follow This Order)
1. Classify the diagram type (see Diagram Types below) 2. Extract structure — identify layers, nodes, edges, flows, and semantic groups from user description 3. Plan layout — apply the layout rules for the diagram type 4. Load style reference — always load references/style-1-flat-icon.md unless user specifies another; load the matching references/style-N.md for exact color tokens and SVG patterns 5. Map nodes to shapes — use Shape Vocabulary below 6. Check icon needs — load references/icons.md for known products 7. Write SVG with adaptive strategy (see SVG Generation Strategy below) 8. Validate: Run python3 -c "import xml.etree.ElementTree as ET; ET.parse('file.svg')" to check XML syntax 9. Export PNG: Use cairosvg (recommended). See SVG → PNG Conversion section below for full method comparison 10. Report the generated file paths 11. (Optional) Visual self-review — if your runtime can read images, load the exported PNG back and inspect it. Syntactic validity does not guarantee visual correctness: arrows may cross through component interiors, labels may collide with lifelines or other labels, boxes may overlap, alt-frame text may sit on top of a message, or a legend may cover content. If you see any of these, revise the SVG and re-export; repeat until the rendered image is clean. Common fixes:
- Route arrows through gaps between boxes, not through box interiors
- Move arrow labels 6-8px away from the arrow line (offset-first); add background rects only when offset is insufficient
- Widen inter-row/inter-column gutters so same-layer arrows have clear corridors
- Collapse repeated cross-layer arrows into a single "delegates down" rail outside the content area
- Move legend/notes out of any region where arrows or labels land
- Increase viewBox height/width rather than packing elements tighter
- If a filtered element (drop-shadow, blur) is missing one side of its border, move it ≥30px away from that viewBox edge, or remove the filter and rely on color/contrast for visual separation
Skip this step silently if image reading is unavailable — do not guess.
Diagram Types & Layout Rules
Architecture Diagram
Nodes = services/components. Group into horizontal layers (top→bottom or left→right).
- Typical layers: Client → Gateway/LB → Services → Data/Storage
- Use
<rect>dashed containers to group related services in the same layer - Arrow direction follows data/request flow
- ViewBox:
0 0 960 600standard,0 0 960 800for tall stacks
Data Flow Diagram
Emphasizes what data moves where. Focus on data transformation.
- Label every arrow with the data type (e.g., "embeddings", "query", "context")
- Use wider arrows (
stroke-width: 2.5) for primary data paths - Dashed arrows for control/trigger flows
- Color arrows by data category (not just Agent/RAG — use semantics)
Flowchart / Process Flow
Sequential decision/process steps.
- Top-to-bottom preferred; left-to-right for wide flows
- Diamond shapes for decisions, rounded rects for processes, parallelograms for I/O
- Keep node labels short (≤3 words); put detail in sub-labels
- Align nodes on a grid: x positions snap to 120px intervals, y to 80px
Agent Architecture Diagram
Shows how an AI agent reasons, uses tools, and manages memory. Key conceptual layers to always consider:
- Input layer: User, query, trigger
- Agent core: LLM, reasoning loop, planner
- Memory layer: Short-term (context window), Long-term (vector/graph DB), Episodic
- Tool layer: Tool calls, APIs, search, code execution
- Output layer: Response, action, side-effects
Use cyclic arrows (loop arcs) to show iterative reasoning. Separate memory types visually.
Memory Architecture Diagram (Mem0, MemGPT-style)
Specialized agent diagram focused on memory operations.
- Show memory write path and read path separately (different arrow colors)
- Memory tiers: Working Memory → Short-term → Long-term → External Store
- Label memory operations:
store(),retrieve(),forget(),consolidate() - Use stacked rects or layered cylinders for storage tiers
Sequence Diagram
Time-ordered message exchanges between participants.
- Participants as vertical lifelines (top labels + vertical dashed lines)
- Messages as horizontal arrows between lifelines, top-to-bottom time order
- Activation boxes (thin filled rects on lifeline) show active processing
- Group with
<rect>loop/alt frames with label in top-left corner - ViewBox height = 80 + (num_messages × 50)
Comparison / Feature Matrix
Side-by-side comparison of approaches, systems, or components.
- Column headers = systems, row headers = attributes
- Row height: 40px; column width: min 120px; header row height: 50px
- Checked cell: tinted background (e.g.
#dcfce7) +✓checkmark; unsupported:#f9fafbfill - Alternating row fills (
#f9fafb/#ffffff) for readability - Max readable columns: 5; beyond that, split into two diagrams
Timeline / Gantt
Horizontal time axis showing durations, phases, and milestones.
- X-axis = time (weeks/months/quarters); Y-axis = items/tasks/phases
- Bars: rounded rects, colored by category, labeled inside or beside
- Milestone markers: diamond or filled circle at specific x position with label above
- ViewBox:
0 0 960 400typical; wider for many time periods:0 0 1200 400
Mind Map / Concept Map
Radial layout from central concept.
- Central node at
cx=480, cy=280 - First-level branches: evenly distributed around center (360/N degrees)
- Second-level branches: branch off first-level at 30-45° offset
- Use curved
<path>with cubic bezier for branches, not straight lines
Class Diagram (UML)
Static structure showing classes, attributes, methods, and relationships.
- Class box: 3-compartment rect (name / attributes / methods), min width 160px
- Top compartment: class name, bold, centered (abstract = italic)
- Middle: attributes with visibility (
+public,-private,#protected) - Bottom: method signatures, same visibility notation
- Relationships:
- Inheritance (extends): solid line + hollow triangle arrowhead, child → parent
- Implementation (interface): dashed line + hollow triangle, class → interface
- Association: solid line + open arrowhead, label with multiplicity (1, 0.., 1..)
- Aggregation: solid line + hollow diamond on container side
- Composition: solid line + filled diamond on container side
- Dependency: dashed line + open arrowhead
- Interface:
<<interface>>stereotype above name, or circle/lollipop notation - Enum: compartment rect with
<<enumeration>>stereotype, values in bottom - Layout: parent classes top, children below; interfaces to the left/right of implementors
- ViewBox:
0 0 960 600standard;0 0 960 800for deep hierarchies
Use Case Diagram (UML)
System functionality from user perspective.
- Actor: stick figure (circle head + body line) placed outside system boundary
- Label below figure, 13-14px
- Primary actors on left, secondary/supporting on right
- Use case: ellipse with label centered inside, min 140×60px
- Keep names verb phrases: "Create Order", "Process Payment"
- System boundary: large rect with dashed border + system name in top-left
- Relationships:
- Include: dashed arrow
<<include>>from base to included use case - Extend: dashed arrow
<<extend>>from extension to base use case - Generalization: solid line + hollow triangle (specialized → general)
- Layout: system boundary centered, actors outside, use cases inside
- ViewBox:
0 0 960 600standard
State Machine Diagram (UML)
Lifecycle states and transitions of an entity.
- State: rounded rect with state name, min 120×50px
- Internal activities: small text
entry/ action,exit/ action,do/ activity - Initial state: filled black circle (r=8), one outgoing arrow
- Final state: filled circle (r=8) inside hollow circle (r=12)
- Choice: small hollow diamond, guard labels on outgoing arrows
[condition] - Transition: arrow with optional label
event [guard] / action - Guard conditions in square brackets
- Actions after
/ - Composite/nested state: larger rect containing sub-states, with name tab
- Fork/join: thick horizontal or vertical black bar (synchronization)
- Layout: initial state top-left, final state bottom-right, flow top-to-bottom
- ViewBox:
0 0 960 600standard
ER Diagram (Entity-Relationship)
Database schema and data relationships.
- Entity: rect with entity name in header (bold), attributes below
- Primary key attribute: underlined
- Foreign key: italic or marked with (FK)
- Min width: 160px; attribute font-size: 12px
- Relationship: diamond shape on connecting line
- Label inside diamond: "has", "belongs to", "enrolls in"
- Cardinality labels near entity:
1,N,0..1,0..*,1..* - Weak entity: double-bordered rect with double diamond relationship
- Associative entity: diamond + rect hybrid (rect with diamond inside)
- Line style: solid for identifying relationships, dashed for non-identifying
- Layout: entities in 2-3 rows, relationships between related entities
- ViewBox:
0 0 960 600standard; wider0 0 1200 600for many entities
Network Topology
Physical or logical network infrastructure.
- Devices: icon-like rects or rounded rects
- Router: circle with cross arrows
- Switch: rect with arrow grid
- Server: stacked rect (rack icon)
- Firewall: brick-pattern rect or shield shape
- Load Balancer: horizontal split rect with arrows
- Cloud: cloud path (overlapping arcs)
- Connections: lines between device centers
- Ethernet/wired: solid line, label bandwidth
- Wireless: dashed line with WiFi symbol
- VPN: dashed line with lock icon
- Subnets/Zones: dashed rect containers with zone label (DMZ, Internal, External)
- Labels: device hostname + IP below, 12-13px
- Layout: tiered top-to-bottom (Internet → Edge → Core → Access → Endpoints)
- ViewBox:
0 0 960 600standard
UML Coverage Map
Full mapping of UML 14 diagram types to supported diagram types:
| UML Diagram | Supported As | Notes |
|---|---|---|
| Class | Class Diagram | Full UML notation |
| Component | Architecture Diagram | Use colored fills per component type |
| Deployment | Architecture Diagram | Add node/instance labels |
| Package | Architecture Diagram | Use dashed grouping containers |
| Composite Structure | Architecture Diagram | Nested rects within components |
| Object | Class Diagram | Instance boxes with underlined name |
| Use Case | Use Case Diagram | Full actor/ellipse/relationship |
| Activity | Flowchart / Process Flow | Add fork/join bars |
| State Machine | State Machine Diagram | Full UML notation |
| Sequence | Sequence Diagram | Add alt/opt/loop frames |
| Communication | — | Approximate with Sequence (swap axes) |
| Timing | Timeline | Adapt time axis |
| Interaction Overview | Flowchart | Combine activity + sequence fragments |
| ER Diagram | ER Diagram | Chen/Crow's foot notation |
Shape Vocabulary
Map semantic concepts to consistent shapes across all diagram types:
| Concept | Shape | Notes |
|---|---|---|
| User / Human | Circle + body path | Stick figure or avatar |
| LLM / Model | Rounded rect with brain/spark icon or gradient fill | Use accent color |
| Agent / Orchestrator | Hexagon or rounded rect with double border | Signals "active controller" |
| Memory (short-term) | Rounded rect, dashed border | Ephemeral = dashed |
| Memory (long-term) | Cylinder (database shape) | Persistent = solid cylinder |
| Vector Store | Cylinder with grid lines inside | Add 3 horizontal lines |
| Graph DB | Circle cluster (3 overlapping circles) | |
| Tool / Function | Gear-like rect or rect with wrench icon | |
| API / Gateway | Hexagon (single border) | |
| Queue / Stream | Horizontal tube (pipe shape) | |
| File / Document | Folded-corner rect | |
| Browser / UI | Rect with 3-dot titlebar | |
| Decision | Diamond | Flowcharts only |
| Process / Step | Rounded rect | Standard box |
| External Service | Rect with cloud icon or dashed border | |
| Data / Artifact | Parallelogram | I/O in flowcharts |
Arrow Semantics
Always assign arrow meaning, not just color:
| Flow Type | Color | Stroke | Dash | Meaning |
|---|---|---|---|---|
| Primary data flow | blue #2563eb | 2px solid | none | Main request/response path |
| Control / trigger | orange #ea580c | 1.5px solid | none | One system triggering another |
| Memory read | green #059669 | 1.5px solid | none | Retrieval from store |
| Memory write | green #059669 | 1.5px | 5,3 | Write/store operation |
| Async / event | gray #6b7280 | 1.5px | 4,2 | Non-blocking, event-driven |
| Embedding / transform | purple #7c3aed | 1px solid | none | Data transformation |
| Feedback / loop | purple #7c3aed | 1.5px curved | none | Iterative reasoning loop |
Always include a legend when 2+ arrow types are used.
Layout Rules & Validation
Spacing:
- Same-layer nodes: 80px horizontal, 120px vertical between layers
- Canvas margins: 40px minimum, 60px between node edges
- Snap to 8px grid: horizontal 120px intervals, vertical 120px intervals
Arrow Labels (CRITICAL):
- Offset-first (default): place label 6-8px above horizontal arrows, or 8px left/right of vertical arrows — do not overlap the arrow line
- Background fallback: add
<rect fill="canvas_bg" opacity="0.95"/>only when the offset label still crosses another visual element (another arrow, a node edge, etc.) - Place mid-arrow, ≤3 words, stagger by 15-20px when multiple arrows converge
- Maintain 10px safety distance from nodes
Arrow Routing:
- Prefer orthogonal (L-shaped) paths to minimize crossings
- Anchor arrows on component edges, not geometric centers
- Route around dense node clusters, use different y-offsets for parallel arrows
- Jump-over arcs (5px radius) for unavoidable crossings
Post-Generation Arrow Optimization:
When a user asks to "优化箭头" / "fix arrow routing" / "optimize the diagram" on an already-generated diagram, preserve all nodes, containers, styles, and layout — only modify the arrows entries in the JSON data, then re-render with generate-from-template.py.
Available arrow override fields (in recommended order of use):
| Field | Type | When to Use |
|---|---|---|
source_port / target_port | "left" / "right" / "top" / "bottom" | Arrow exits/enters from the wrong edge |
corridor_x | [x, ...] | Hint vertical segments toward this x lane (soft preference) |
corridor_y | [y, ...] | Hint horizontal segments toward this y lane (soft preference) |
route_points | [[x1,y1], [x2,y2], ...] | Force exact waypoints (bypasses auto-routing); keep segments orthogonal |
routing_padding | number (default: 24) | (Advanced) Adjust obstacle clearance for this arrow |
port_clearance | number | (Advanced) Adjust first-segment offset from node edge |
label_style | "badge" / "offset" | Choose "offset" when badge backgrounds create visual clutter; keep "badge" (default) for legacy/high-contrast labels |
For JSON/template rendering, the default remains "badge" for backward compatibility. Set "label_style": "offset" on individual arrows when you want offset-first labels without background rects.
Optimization steps: 1. Read the existing SVG — identify which arrows overlap, cross nodes, or look misaligned 2. Find those arrows in the JSON data by source / target pair 3. Add source_port / target_port if the exit/entry direction is wrong; add corridor_x / corridor_y to space parallel arrows apart; use route_points only when hints alone cannot resolve the path 4. Re-run generate-from-template.py with the updated JSON and validate with validate-svg.sh
Example — spacing two overlapping arrows into separate corridors:
{ "source": "nodeA", "target": "nodeB", "corridor_y": [280] }
{ "source": "nodeC", "target": "nodeD", "corridor_y": [320] }Line Overlap Prevention (CRITICAL - most common bug on Codex): When two arrows must cross each other, ALWAYS use jump-over arcs to prevent visual overlap:
- Crossing horizontal arrows: add a small semicircle arc (radius 5px, stroke same color as arrow, fill none) that "jumps over" the other line
- SVG pattern for jump-over: use a white/matching-background arc on the lower layer, then draw the upper arc on top
- Multiple crossings: stagger arc radii (5px, 7px, 9px) so arcs don't overlap each other
- Never let two arrows' straight-line segments cross without a jump-over arc
Validation Checklist (run before finalizing): 1. Arrow-Component Collision: Arrows MUST NOT pass through component interiors (route around with orthogonal paths) 2. Text Overflow: All text MUST fit with 8px padding (estimate: text.length × 7px ≤ shape_width - 16px) 3. Arrow-Text Alignment: Arrow endpoints MUST connect to shape edges (not floating); arrow labels should not overlap arrow lines (use offset positioning or background rects) 4. Container Discipline: Prefer arrows entering and leaving section containers through open gaps between components, not through inner component bodies 5. Filter Boundary Safety: For every element with filter="url(...)", verify (element_x + element_width + filter_extension) ≤ viewBox_width AND element_x ≥ filter_extension. The default filter region extends 10-20% beyond bbox; staying near viewBox edges causes Chrome/cairosvg to clip the element's edge-side stroke (one side of the border vanishes while other sides render correctly) 6. Arrow-Title Collision: Arrows MUST NOT cross through section/container title text or region labels (font-size ≥ 13px). For smaller annotations (< 13px), prefer routing around but tolerate if layout constraints require it. (Visual self-review check — not covered by `validate-svg.sh` automated checks) 7. Frame Label–Arrow Alignment (sequence diagrams): Section/frame label badges MUST be vertically centered with their first message arrow. Compute badge_y = first_arrow_y - (badge_height / 2). When appending new sections to an existing diagram, verify alignment matches the existing sections — this is the most common regression when adding content incrementally. Use variables in Python list generation to enforce the constraint: sec_y = 840; badge_y = sec_y - 9 # for height=18 badge
SVG Technical Rules
- ViewBox:
0 0 960 600default;0 0 960 800tall;0 0 1200 600wide - Fonts: embed via
<style>font-family: ...</style>— no external@import(cairosvg / rsvg-convert cannot fetch external URLs) <defs>: arrow markers, gradients, filters, clip paths- Text: minimum 12px, prefer 13-14px labels, 11px sub-labels, 16-18px titles
- All arrows:
<marker>withmarkerEnd, sizedmarkerWidth="10" markerHeight="7" - Drop shadows:
<feDropShadow>in<filter>, apply sparingly (key nodes only) - Curved paths: use
M x1,y1 C cx1,cy1 cx2,cy2 x2,y2cubic bezier for loops/feedback arrows - Clip content: use
<clipPath>if text might overflow a node box - Z-order (drawing order): SVG uses painter's model — later elements cover earlier ones. Recommended layer order (bottom → top): ① canvas background ② dashed containers / region backgrounds ③ arrows and connection lines ④ node shapes (rects, circles) ⑤ text labels and annotations ⑥ legends and overlays. When arrows pass near text, draw arrows BEFORE text so text stays readable. Adjust per diagram needs — this is guidance, not rigid.
SVG Generation & Error Prevention
MANDATORY: Python List Method (ALWAYS use this):
python3 << 'EOF'
lines = []
lines.append('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 700">')
lines.append(' <defs>')
# ... each line separately
lines.append('</svg>')
with open('/path/to/output.svg', 'w') as f:
f.write('\n'.join(lines))
print("SVG generated successfully")
EOFWhy mandatory: Prevents character truncation, typos, and syntax errors. Each line is independent and easy to verify.
Pre-Tool-Call Checklist (CRITICAL - use EVERY time): 1. ✅ Can I write out the COMPLETE command/content right now? 2. ✅ Do I have ALL required parameters ready? 3. ✅ Have I checked for syntax errors in my prepared content?
If ANY answer is NO: STOP. Do NOT call the tool. Prepare the content first.
Error Recovery Protocol:
- First error: Analyze root cause, apply targeted fix
- Second error: Switch method entirely (Python list → chunked generation)
- Third error: STOP and report to user - do NOT loop endlessly
- Never: Retry the same failing command or call tools with empty parameters
Validation (run after generation):
python3 -c "import xml.etree.ElementTree as ET; ET.parse('file.svg')" && echo "✓ Valid XML"
# Or use cairosvg as a render-time check:
python3 -c "import cairosvg; cairosvg.svg2png(url='file.svg', write_to='/tmp/test.png')" && echo "✓ Renders" && rm /tmp/test.pngIf using `generate-from-template.py`:
- Prefer
source/targetnode ids in arrow JSON so the generator can snap to node edges - Keep
x1,y1,x2,y2as hints or fallback coordinates, not the main routing primitive - Let the generator choose orthogonal routes; avoid hardcoding center-to-center straight lines unless the path is guaranteed clear
Common Syntax Errors to Avoid:
- ❌
yt-anchor→ ✅y="60" text-anchor="middle" - ❌
x="390(missing y) → ✅x="390" y="250" - ❌
fill=#fff→ ✅fill="#ffffff" - ❌
marker-end=→ ✅marker-end="url(#arrow)" - ❌
L 29450→ ✅L 290,220 - ❌ Missing
</svg>at end - ❌ Element with
filternear viewBox edge — filter region extends 20% (default) or more beyond bbox; if that region exceeds viewBox, Chrome/cairosvg clip the filter rendering AND can drop the element's own stroke on that side. Keep filtered elements at leastmax(20% of element size, shadow blur radius × 3)away from viewBox edges, or omit the filter.
Output
- Default:
./[derived-name].svgand./[derived-name].pngin current directory - Custom: user specifies path with
--output /path/or输出到 /path/ - PNG export: see SVG → PNG Conversion below
SVG → PNG Conversion
Method Comparison
| Tool | Install | Render Quality | Notes |
|---|---|---|---|
rsvg-convert | System (often preinstalled) | ⚠️ Fair | Drops some CSS styles and <foreignObject> elements — missing borders/text on complex SVGs |
| `cairosvg` (recommended) | pip install cairosvg | ✅ Good | Solid CSS support; clearly better than rsvg-convert |
puppeteer (headless Chrome) | npm install puppeteer | ✅✅ Best | Real browser engine; 100% fidelity but heavy (Node + Chromium) |
Recommended: cairosvg (Python one-liner)
# Single file (2x resolution for retina/docs)
python3 -c "import cairosvg; cairosvg.svg2png(url='input.svg', write_to='output.png', scale=2)"
# Batch convert all SVGs in a directory
python3 -c "
import cairosvg, os, glob
d = 'docs/00-core'
for svg in sorted(glob.glob(os.path.join(d, '*.svg'))):
png = svg.replace('.svg', '.png')
cairosvg.svg2png(url=svg, write_to=png, scale=2)
print(f'Done: {os.path.basename(svg)} -> {os.path.basename(png)}')
"scale=2 produces 2x resolution PNG, ideal for high-DPI screens and embedded docs.Fallback: rsvg-convert (simple but may drop styles)
# Single file
rsvg-convert -w 1920 file.svg -o file.png
# Batch (not recommended — complex SVGs may lose elements)
for f in docs/00-core/*.svg; do rsvg-convert -o "${f%.svg}.png" "$f"; done
# 2x resolution
for f in docs/00-core/*.svg; do rsvg-convert -z 2 -o "${f%.svg}.png" "$f"; doneHighest Fidelity: puppeteer (headless Chrome)
npm install puppeteer # auto-downloads Chromium
node svg2png.js [directory]<details> <summary>svg2png.js — full puppeteer script</summary>
const puppeteer = require('puppeteer');
const fs = require('fs');
const path = require('path');
(async () => {
const dir = process.argv[2] || '.';
const svgFiles = fs.readdirSync(dir).filter(f => f.endsWith('.svg'));
const browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
for (const file of svgFiles) {
const svgPath = path.resolve(dir, file);
const pngPath = svgPath.replace(/\.svg$/, '.png');
const svgContent = fs.readFileSync(svgPath, 'utf-8');
const wMatch = svgContent.match(/width="(\d+)/);
const hMatch = svgContent.match(/height="(\d+)/);
const vbMatch = svgContent.match(/viewBox="[^"]*\s(\d+)\s(\d+)"/);
let width = wMatch ? parseInt(wMatch[1]) : (vbMatch ? parseInt(vbMatch[1]) : 1200);
let height = hMatch ? parseInt(hMatch[1]) : (vbMatch ? parseInt(vbMatch[2]) : 800);
const scale = 2;
const page = await browser.newPage();
await page.setViewport({ width, height, deviceScaleFactor: scale });
const html = `<!DOCTYPE html>
<html><head><style>
body { margin: 0; padding: 0; background: transparent; }
img { display: block; }
</style></head>
<body>
<img src="data:image/svg+xml;base64,${Buffer.from(svgContent).toString('base64')}" width="${width}" height="${height}" />
</body></html>`;
await page.setContent(html, { waitUntil: 'networkidle0' });
await page.screenshot({ path: pngPath, type: 'png', omitBackground: true });
await page.close();
console.log(`Done: ${file} -> ${path.basename(pngPath)} (${width}x${height} @${scale}x)`);
}
await browser.close();
})();</details>
Gotchas (lessons learned)
rsvg-convertrenders SVGs containing<foreignObject>, CSSfilter, or complex<style>blocks incompletely — missing borders / missing text are the typical symptomscairosvg(built on Cairo) has much better CSS support than rsvg and is sufficient for most casescairosvgmay fail to render CJK characters and emoji in<text>elements — Cairo's font API (cairo_select_font_face) does not reliably perform system fontconfig fallback, so glyphs not present in the matched font face render as □ (empty box). This commonly affects Chinese/Japanese/Korean text and emoji, depending on system font configuration. Workaround: use SVG as primary format for web/GitHub rendering (browsers handle CJK natively); reserve PNG export for Latin-only diagrams, or switch to the puppeteer path for full CJK+emoji fidelity- If the SVG was generated by a browser (D3.js, Mermaid, etc.), only headless Chrome (puppeteer) renders it 100% faithfully
- Chrome headless CLI `--window-size=W,H` is not the drawable area — even in
--headless=newmode, browser chrome (scrollbars, internal UI surfaces) consumes ~15-20% of both width and height, so the actual SVG viewport is only ~0.84×W by ~0.84×H. Symptom: SVG content pastx ≈ 0.84 × Wory ≈ 0.84 × His cut off and renders as a solid white band, even though the SVG file itself is correct. Typical failure modes: a Legend in the top-right corner loses its right border; a bottom-row container loses its bottom dashed line. Fix: pass window dimensions ≥ SVG width × 1.2 AND SVG height × 1.2, then crop the raw screenshot back to(SVG_width × scale, SVG_height × scale)with PIL or ImageMagick. Example: for a 1280×580 SVG at 3× DPR, use--window-size=1600,800then crop the output to 3840×1740. The Puppeteer /page.setViewport()path does NOT have this issue — it sets a precise viewport regardless of window UI.
Picking a Method
1. Default → cairosvg (pip install once, one-line conversion, good fidelity) 2. No Python available → rsvg-convert (acceptable for simple flat-color diagrams) 3. Browser-generated SVG or pixel-perfect required → puppeteer
Styles
| # | Name | Background | Best For |
|---|---|---|---|
| 1 | Flat Icon (default) | White | Blogs, docs, presentations |
| 2 | Dark Terminal | #0f0f1a | GitHub, dev articles |
| 3 | Blueprint | #0a1628 | Architecture docs |
| 4 | Notion Clean | White, minimal | Notionnce |
| 5 | Glassmorphism | Dark gradient | Product sites, keynotes |
| 6 | Claude Official | Warm cream #f8f6f3 | Anthropic-style diagrams |
| 7 | OpenAI Official | Pure white #ffffff | OpenAI-style diagrams |
| 8 | Dark Luxury (AI-authored) | #0a0a0a deep black | Architecture docs, premium editorial — hand-craft SVG from references/style-8-dark-luxury.md |
Load references/style-N.md for exact color tokens and SVG patterns.
Style Selection
Default: Style 1 (Flat Icon) for most diagrams. Load references/style-diagram-matrix.md for detailed style-to-diagram-type recommendations.
These patterns appear frequently — internalize them:
RAG Pipeline: Query → Embed → VectorSearch → Retrieve → Augment → LLM → Response Agentic RAG: adds Agent loop with Tool use between Query and LLM Agentic Search: Query → Planner → [Search Tool / Calculator / Code] → Synthesizer → Response Mem0 / Memory Layer: Input → Memory Manager → [Write: VectorDB + GraphDB] / [Read: Retrieve+Rank] → Context Agent Memory Types: Sensory (raw input) → Working (context window) → Episodic (past interactions) → Semantic (facts) → Procedural (skills) Multi-Agent: Orchestrator → [SubAgent A / SubAgent B / SubAgent C] → Aggregator → Output Tool Call Flow: LLM → Tool Selector → Tool Execution → Result Parser → LLM (loop)
# macOS
.DS_Store
.AppleDouble
.LSOverride
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
# Test outputs
test-output/
*.png
# Backup files
*.backup
*.bak
*~
# Temporary/broken files
*.tmp
*.temp
temlass.svg
agentloture.svg
# IDE
.vscode/
.idea/
*.swp
*.swo
# Node (if any)
node_modules/
package-lock.json
.DS_Store
node_modules/
test-output/
scripts/__pycache__/
*.py[cod]
*.backup
*.bak
*~
agentloop-core.png
agentloop-core.svg
SKILL.md.backup
interface:
display_name: "Fireworks Tech Graph"
short_description: "Generate polished SVG and PNG technical diagrams"
default_prompt: "Turn the user's system or workflow description into a polished SVG diagram and export a PNG."
{
"template_type": "memory",
"style": 4,
"width": 1120,
"height": 760,
"title": "Agent Memory Types",
"subtitle": "Five memory systems an AI agent can use — characteristics, storage backends, and persistence",
"containers": [
{
"x": 18,
"y": 32,
"width": 1084,
"height": 696,
"label": "",
"subtitle": "",
"stroke": "#e5e7eb",
"fill": "none",
"rx": 6
}
],
"nodes": [
{
"id": "sensory",
"kind": "rect",
"x": 56,
"y": 118,
"width": 266,
"height": 106,
"label": "Raw input, very short-lived",
"sublabel": "\"Current image / audio\"",
"type_label": "SENSORY MEMORY",
"fill": "#ffffff",
"stroke": "#e5e7eb",
"flat": true,
"tags": [
{ "label": "RAM / context", "fill": "#eff6ff", "stroke": "#bfdbfe", "text_fill": "#3b82f6" }
]
},
{
"id": "working",
"kind": "rect",
"x": 56,
"y": 308,
"width": 266,
"height": 106,
"label": "Active context, session-scoped",
"sublabel": "\"Current conversation\"",
"type_label": "WORKING MEMORY",
"fill": "#ffffff",
"stroke": "#e5e7eb",
"flat": true,
"tags": [
{ "label": "Context Window", "fill": "#eff6ff", "stroke": "#bfdbfe", "text_fill": "#3b82f6" }
]
},
{
"id": "episodic",
"kind": "rect",
"x": 56,
"y": 498,
"width": 266,
"height": 106,
"label": "Past interactions, retrievable",
"sublabel": "\"Last week's chat summary\"",
"type_label": "EPISODIC MEMORY",
"fill": "#ffffff",
"stroke": "#e5e7eb",
"flat": true,
"tags": [
{ "label": "Vector DB + timestamp", "fill": "#eff6ff", "stroke": "#bfdbfe", "text_fill": "#3b82f6" }
]
},
{
"id": "agent",
"kind": "hexagon",
"x": 492,
"y": 324,
"width": 118,
"height": 90,
"label": "Agent",
"sublabel": "LLM + Planner",
"type_label": "CORE",
"fill": "#ffffff",
"stroke": "#3b82f6",
"stroke_width": 1.6,
"flat": true
},
{
"id": "semantic",
"kind": "rect",
"x": 810,
"y": 218,
"width": 266,
"height": 106,
"label": "Facts & knowledge, long-term",
"sublabel": "\"User prefers Python\"",
"type_label": "SEMANTIC MEMORY",
"fill": "#ffffff",
"stroke": "#e5e7eb",
"flat": true,
"tags": [
{ "label": "Vector DB + Graph DB", "fill": "#eff6ff", "stroke": "#bfdbfe", "text_fill": "#3b82f6" }
]
},
{
"id": "procedural",
"kind": "rect",
"x": 810,
"y": 408,
"width": 266,
"height": 106,
"label": "Skills & how-to, persistent",
"sublabel": "\"How to call Stripe API\"",
"type_label": "PROCEDURAL MEMORY",
"fill": "#ffffff",
"stroke": "#e5e7eb",
"flat": true,
"tags": [
{ "label": "Code store / fine-tune", "fill": "#eff6ff", "stroke": "#bfdbfe", "text_fill": "#3b82f6" }
]
}
],
"arrows": [
{
"source": "agent",
"target": "sensory",
"source_port": "left",
"target_port": "right",
"flow": "read",
"label": "read/write",
"route_points": [[432, 360], [386, 360], [386, 172], [322, 172]],
"label_dx": -18,
"label_dy": -8
},
{
"source": "agent",
"target": "working",
"source_port": "left",
"target_port": "right",
"flow": "read",
"label": "read/write",
"route_points": [[432, 369], [404, 369], [322, 360]],
"label_dx": -6,
"label_dy": -6
},
{
"source": "agent",
"target": "episodic",
"source_port": "left",
"target_port": "right",
"flow": "read",
"label": "read/write",
"route_points": [[432, 394], [386, 430], [386, 552], [322, 552]],
"label_dx": -18,
"label_dy": -6
},
{
"source": "agent",
"target": "semantic",
"source_port": "right",
"target_port": "left",
"flow": "read",
"label": "read/write",
"route_points": [[668, 360], [726, 360], [726, 271], [810, 271]],
"label_dx": 10,
"label_dy": -8
},
{
"source": "agent",
"target": "procedural",
"source_port": "right",
"target_port": "left",
"flow": "read",
"label": "read/write",
"route_points": [[668, 388], [740, 404], [810, 461]],
"label_dx": 8,
"label_dy": -8
}
],
"footer": ""
}
{
"template_type": "architecture",
"style": 7,
"width": 1100,
"height": 680,
"title": "API Integration Flow",
"subtitle": "OpenAI-style clean integration diagram with precise control and response stages",
"containers": [
{ "x": 40, "y": 118, "width": 1020, "height": 104, "label": "ENTRY", "subtitle": "", "stroke": "#e2e8f0", "fill": "none" },
{ "x": 40, "y": 252, "width": 1020, "height": 154, "label": "MODEL + TOOLS", "subtitle": "", "stroke": "#e2e8f0", "fill": "none" },
{ "x": 40, "y": 438, "width": 1020, "height": 154, "label": "DELIVERY", "subtitle": "", "stroke": "#e2e8f0", "fill": "none" }
],
"nodes": [
{ "id": "app", "kind": "rect", "x": 90, "y": 146, "width": 176, "height": 56, "label": "Application", "type_label": "CLIENT", "fill": "#ffffff", "stroke": "#dce5e3", "flat": true },
{ "id": "sdk", "kind": "double_rect", "x": 350, "y": 142, "width": 196, "height": 64, "label": "OpenAI SDK Layer", "type_label": "SDK", "fill": "#ffffff", "stroke": "#10a37f" },
{ "id": "prompt", "kind": "rect", "x": 114, "y": 300, "width": 188, "height": 60, "label": "Prompt Builder", "type_label": "INPUT", "fill": "#ffffff", "stroke": "#dce5e3", "flat": true },
{ "id": "model", "kind": "double_rect", "x": 418, "y": 292, "width": 236, "height": 76, "label": "Model Runtime", "type_label": "REASONING", "fill": "#ffffff", "stroke": "#10a37f" },
{ "id": "tools", "kind": "rect", "x": 782, "y": 300, "width": 188, "height": 60, "label": "Tool Calls", "type_label": "ACTIONS", "fill": "#ffffff", "stroke": "#dce5e3", "flat": true },
{ "id": "formatter", "kind": "rect", "x": 148, "y": 486, "width": 198, "height": 60, "label": "Response Formatter", "type_label": "OUTPUT", "fill": "#ffffff", "stroke": "#dce5e3", "flat": true },
{ "id": "obs", "kind": "rect", "x": 470, "y": 486, "width": 176, "height": 60, "label": "Observability", "type_label": "METRICS", "fill": "#ffffff", "stroke": "#dce5e3", "flat": true },
{ "id": "release", "kind": "rect", "x": 770, "y": 486, "width": 176, "height": 60, "label": "Release Control", "type_label": "CONFIG", "fill": "#ffffff", "stroke": "#dce5e3", "flat": true }
],
"arrows": [
{ "source": "app", "target": "sdk", "source_port": "right", "target_port": "left", "flow": "control" },
{ "source": "sdk", "target": "prompt", "source_port": "bottom", "target_port": "top", "flow": "read", "label": "prepare", "route_points": [[370,232], [236,232], [236,300]] },
{ "source": "sdk", "target": "model", "source_port": "bottom", "target_port": "top", "flow": "control", "corridor_x": [520] },
{ "source": "model", "target": "tools", "source_port": "right", "target_port": "left", "flow": "read", "label": "tool use" },
{ "source": "model", "target": "formatter", "source_port": "bottom", "target_port": "top", "flow": "control", "corridor_x": [278] },
{ "source": "model", "target": "obs", "source_port": "bottom", "target_port": "top", "flow": "feedback", "dashed": true },
{ "source": "obs", "target": "release", "source_port": "right", "target_port": "left", "flow": "control" }
],
"legend": [
{ "flow": "control", "label": "Primary integration path" },
{ "flow": "read", "label": "Prompt / tool context" },
{ "flow": "feedback", "label": "Operational feedback" }
],
"legend_position": "bottom-left",
"legend_y": 612,
"footer": ""
}
{
"template_type": "memory",
"style": 1,
"width": 1080,
"height": 760,
"title": "Mem0 Memory Architecture",
"subtitle": "Personalized AI Memory Layer for LLM Applications",
"containers": [
{
"x": 30,
"y": 84,
"width": 1020,
"height": 74,
"label": "Input Layer",
"subtitle": "",
"stroke": "#dbeafe"
},
{
"x": 30,
"y": 186,
"width": 1020,
"height": 118,
"label": "Memory Manager (mem0 Core)",
"subtitle": "",
"stroke": "#e9d5ff",
"fill": "#fdf4ff"
},
{
"x": 30,
"y": 332,
"width": 1020,
"height": 204,
"label": "Storage Layer",
"subtitle": "",
"stroke": "#bbf7d0",
"fill": "#f0fdf4"
},
{
"x": 30,
"y": 564,
"width": 1020,
"height": 118,
"label": "Output / Retrieval",
"subtitle": "",
"stroke": "#fed7aa",
"fill": "#fff7ed"
}
],
"nodes": [
{
"id": "user",
"kind": "user_avatar",
"x": 54,
"y": 108,
"width": 90,
"height": 46,
"label": "User",
"fill": "#eff6ff",
"stroke": "#2563eb",
"icon_fill": "#dbeafe",
"icon_stroke": "#2563eb",
"flat": true
},
{
"id": "app",
"kind": "rect",
"x": 190,
"y": 102,
"width": 160,
"height": 58,
"label": "AI App / Agent",
"type_label": "APPLICATION",
"fill": "#ffffff",
"stroke": "#d1d5db"
},
{
"id": "llm",
"kind": "double_rect",
"x": 418,
"y": 102,
"width": 136,
"height": 58,
"label": "LLM",
"type_label": "MODEL",
"fill": "#f5f3ff",
"stroke": "#8b5cf6",
"sublabel": "retrieve()"
},
{
"id": "client",
"kind": "rect",
"x": 620,
"y": 102,
"width": 158,
"height": 58,
"label": "mem0 Client",
"type_label": "SDK",
"fill": "#eef2ff",
"stroke": "#6366f1"
},
{
"id": "extractor",
"kind": "rect",
"x": 78,
"y": 226,
"width": 158,
"height": 66,
"label": "Fact Extractor",
"type_label": "PROCESSOR",
"fill": "#ffffff",
"stroke": "#d1d5db"
},
{
"id": "manager",
"kind": "double_rect",
"x": 370,
"y": 222,
"width": 340,
"height": 74,
"label": "Memory Manager",
"fill": "#ffffff",
"stroke": "#8b5cf6",
"tags": [
{ "label": "store()", "fill": "#faf5ff", "stroke": "#ddd6fe", "text_fill": "#7c3aed" },
{ "label": "retrieve()", "fill": "#faf5ff", "stroke": "#ddd6fe", "text_fill": "#7c3aed" },
{ "label": "update()", "fill": "#faf5ff", "stroke": "#ddd6fe", "text_fill": "#7c3aed" }
]
},
{
"id": "resolver",
"kind": "rect",
"x": 812,
"y": 226,
"width": 172,
"height": 66,
"label": "Conflict Resolver",
"type_label": "RESOLVER",
"fill": "#ffffff",
"stroke": "#d1d5db"
},
{
"id": "vector",
"kind": "cylinder",
"x": 82,
"y": 390,
"width": 136,
"height": 106,
"label": "Vector Store",
"sublabel": "embeddings",
"fill": "#ecfdf5",
"stroke": "#10b981"
},
{
"id": "graph",
"kind": "circle_cluster",
"x": 306,
"y": 380,
"width": 176,
"height": 126,
"label": "Graph DB",
"sublabel": "relations",
"fill": "#dbeafe",
"stroke": "#3b82f6"
},
{
"id": "kv",
"kind": "rect",
"x": 560,
"y": 390,
"width": 162,
"height": 96,
"label": "Key-Value Store",
"fill": "#fff7ed",
"stroke": "#f97316",
"type_label": "WORKING MEMORY",
"sublabel": "user_123 likes Python"
},
{
"id": "history",
"kind": "document",
"x": 790,
"y": 390,
"width": 136,
"height": 96,
"label": "History Store",
"fill": "#faf5ff",
"stroke": "#8b5cf6",
"line_stroke": "#c4b5fd",
"sublabel": "Episodic Memory"
},
{
"id": "builder",
"kind": "rect",
"x": 224,
"y": 608,
"width": 180,
"height": 58,
"label": "Context Builder",
"type_label": "ASSEMBLER",
"fill": "#ffffff",
"stroke": "#d1d5db"
},
{
"id": "ranker",
"kind": "rect",
"x": 484,
"y": 608,
"width": 180,
"height": 58,
"label": "Ranked Results",
"type_label": "RERANKER",
"fill": "#ffffff",
"stroke": "#d1d5db"
},
{
"id": "output",
"kind": "rect",
"x": 744,
"y": 608,
"width": 204,
"height": 58,
"label": "Personalized Response",
"type_label": "OUTPUT",
"fill": "#faf5ff",
"stroke": "#8b5cf6"
}
],
"arrows": [
{ "source": "user", "target": "app", "source_port": "right", "target_port": "left", "flow": "read" },
{ "source": "app", "target": "llm", "source_port": "right", "target_port": "left", "flow": "control" },
{ "source": "llm", "target": "client", "source_port": "right", "target_port": "left", "flow": "control" },
{
"source": "llm",
"target": "manager",
"source_port": "bottom",
"target_port": "top",
"flow": "control",
"label": "retrieve()",
"label_dx": 12,
"label_dy": -10
},
{
"source": "client",
"target": "manager",
"source_port": "bottom",
"target_port": "top",
"flow": "control",
"label": "store()",
"corridor_x": [760],
"label_dx": 18,
"label_dy": -12
},
{ "source": "extractor", "target": "manager", "source_port": "right", "target_port": "left", "flow": "data", "label": "facts" },
{ "source": "resolver", "target": "manager", "source_port": "left", "target_port": "right", "flow": "data", "label": "resolved" },
{
"source": "manager",
"target": "vector",
"source_port": "bottom",
"target_port": "top",
"flow": "write",
"dashed": true,
"label": "write",
"route_points": [[370, 332], [150, 332]]
},
{ "source": "manager", "target": "graph", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true, "route_points": [[470, 332], [394, 332]] },
{ "source": "manager", "target": "kv", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true, "route_points": [[610, 332], [641, 332]] },
{ "source": "manager", "target": "history", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true, "route_points": [[725, 332], [858, 332]] },
{ "source": "vector", "target": "builder", "source_port": "bottom", "target_port": "top", "flow": "read", "label": "read" },
{ "source": "graph", "target": "builder", "source_port": "bottom", "target_port": "top", "flow": "read" },
{ "source": "kv", "target": "ranker", "source_port": "bottom", "target_port": "top", "flow": "read" },
{ "source": "history", "target": "ranker", "source_port": "bottom", "target_port": "top", "flow": "read" },
{ "source": "builder", "target": "ranker", "source_port": "right", "target_port": "left", "flow": "control" },
{ "source": "ranker", "target": "output", "source_port": "right", "target_port": "left", "flow": "control" },
{
"source": "client",
"target": "output",
"source_port": "right",
"target_port": "right",
"flow": "control",
"dashed": true,
"route_points": [[1060, 131], [1060, 637]],
"corridor_x": [970],
"label": "context",
"label_dx": 28,
"label_dy": -14
}
],
"legend": [
{ "flow": "control", "label": "API / control flow" },
{ "flow": "write", "label": "Memory write" },
{ "flow": "read", "label": "Memory read" },
{ "flow": "data", "label": "Data transform" }
],
"legend_position": "bottom-left",
"legend_y": 666,
"footer": ""
}
{
"template_type": "architecture",
"style": 3,
"width": 1120,
"height": 760,
"title": "Microservices Architecture",
"subtitle": "Blueprint style with tiered zones, service groups, and deployment pathways",
"blueprint_title_block": {
"title": "AI MICROSERVICES",
"subtitle": "SYSTEM ARCHITECTURE",
"center_caption": "BLUEPRINT STYLE 3",
"left_caption": "REV: 1.0",
"right_caption": "DWG: ARCH-001",
"width": 220,
"height": 76,
"x": 868,
"y": 664
},
"containers": [
{ "x": 40, "y": 96, "width": 1040, "height": 94, "label": "EDGE", "header_prefix": "01", "subtitle": "", "stroke": "#0ea5e9", "fill": "none" },
{ "x": 40, "y": 224, "width": 1040, "height": 152, "label": "APPLICATION SERVICES", "header_prefix": "02", "subtitle": "", "stroke": "#0ea5e9", "fill": "none" },
{ "x": 40, "y": 410, "width": 1040, "height": 150, "label": "DATA + EVENT INFRA", "header_prefix": "03", "subtitle": "", "stroke": "#0ea5e9", "fill": "none" },
{ "x": 40, "y": 590, "width": 1040, "height": 100, "label": "OBSERVABILITY", "header_prefix": "04", "subtitle": "", "stroke": "#0ea5e9", "fill": "none" }
],
"nodes": [
{ "id": "clients", "kind": "rect", "x": 80, "y": 120, "width": 160, "height": 54, "label": "Client Apps", "type_label": "TRAFFIC", "fill": "#0b3b5e", "stroke": "#67e8f9", "flat": true },
{ "id": "gateway", "kind": "double_rect", "x": 314, "y": 116, "width": 184, "height": 62, "label": "API Gateway", "type_label": "EDGE", "fill": "#0b3b5e", "stroke": "#67e8f9" },
{ "id": "auth", "kind": "rect", "x": 572, "y": 120, "width": 164, "height": 54, "label": "Auth / Policy", "type_label": "GUARD", "fill": "#0b3b5e", "stroke": "#67e8f9", "flat": true },
{ "id": "svc-a", "kind": "rect", "x": 110, "y": 270, "width": 176, "height": 60, "label": "Order Service", "type_label": "SERVICE", "fill": "#0b3b5e", "stroke": "#67e8f9", "flat": true },
{ "id": "svc-b", "kind": "rect", "x": 356, "y": 270, "width": 176, "height": 60, "label": "Catalog Service", "type_label": "SERVICE", "fill": "#0b3b5e", "stroke": "#67e8f9", "flat": true },
{ "id": "svc-c", "kind": "rect", "x": 602, "y": 270, "width": 176, "height": 60, "label": "Billing Service", "type_label": "SERVICE", "fill": "#0b3b5e", "stroke": "#67e8f9", "flat": true },
{ "id": "bus", "kind": "double_rect", "x": 848, "y": 262, "width": 166, "height": 76, "label": "Event Router", "type_label": "STREAM", "fill": "#0b3b5e", "stroke": "#fde047" },
{ "id": "pg", "kind": "cylinder", "x": 116, "y": 446, "width": 144, "height": 90, "label": "Postgres", "sublabel": "orders", "fill": "#0b3b5e", "stroke": "#67e8f9" },
{ "id": "cache", "kind": "rect", "x": 370, "y": 456, "width": 144, "height": 70, "label": "Redis Cache", "type_label": "LOW LATENCY", "fill": "#0b3b5e", "stroke": "#67e8f9", "flat": true },
{ "id": "warehouse", "kind": "cylinder", "x": 624, "y": 446, "width": 154, "height": 90, "label": "Warehouse", "sublabel": "analytics", "fill": "#0b3b5e", "stroke": "#67e8f9" },
{ "id": "metrics", "kind": "rect", "x": 94, "y": 620, "width": 188, "height": 44, "label": "Metrics / Traces", "type_label": "OPS", "fill": "#0b3b5e", "stroke": "#67e8f9", "flat": true }
],
"arrows": [
{ "source": "clients", "target": "gateway", "source_port": "right", "target_port": "left", "flow": "read" },
{ "source": "gateway", "target": "auth", "source_port": "right", "target_port": "left", "flow": "control" },
{ "source": "gateway", "target": "svc-a", "source_port": "bottom", "target_port": "top", "flow": "read", "label": "route" },
{ "source": "gateway", "target": "svc-b", "source_port": "bottom", "target_port": "top", "flow": "read", "corridor_x": [444] },
{ "source": "gateway", "target": "svc-c", "source_port": "bottom", "target_port": "top", "flow": "read", "corridor_x": [688] },
{ "source": "svc-a", "target": "pg", "source_port": "bottom", "target_port": "top", "flow": "read" },
{ "source": "svc-b", "target": "cache", "source_port": "bottom", "target_port": "top", "flow": "read" },
{ "source": "svc-c", "target": "warehouse", "source_port": "bottom", "target_port": "top", "flow": "data" },
{ "source": "svc-a", "target": "bus", "source_port": "right", "target_port": "left", "flow": "feedback", "dashed": true, "route_points": [[286,300], [286,246], [818,246], [818,300]] },
{ "source": "svc-b", "target": "bus", "source_port": "right", "target_port": "left", "flow": "feedback", "dashed": true, "route_points": [[532,300], [532,246], [824,246], [824,300]] },
{ "source": "svc-c", "target": "bus", "source_port": "right", "target_port": "left", "flow": "feedback", "dashed": true, "route_points": [[778,300], [812,300]] },
{ "source": "bus", "target": "metrics", "source_port": "bottom", "target_port": "top", "flow": "control", "label": "events", "route_points": [[942, 620], [188, 620]], "label_dx": 8 }
],
"legend": [
{ "flow": "read", "label": "Primary request flow" },
{ "flow": "control", "label": "Control routing" },
{ "flow": "data", "label": "Analytics path" },
{ "flow": "feedback", "label": "Event stream" }
],
"legend_position": "bottom-right",
"legend_box": true,
"legend_box_fill": "#0b3552",
"legend_x": 760,
"legend_y": 572,
"footer": ""
}
{
"template_type": "agent",
"style": 5,
"width": 1160,
"height": 720,
"title": "Multi-Agent Collaboration",
"subtitle": "Glassmorphism style with coordinator, specialists, shared memory, and delivery loop",
"containers": [
{ "x": 42, "y": 108, "width": 1076, "height": 150, "label": "MISSION CONTROL", "subtitle": "", "stroke": "rgba(255,255,255,0.2)", "fill": "rgba(255,255,255,0.05)" },
{ "x": 42, "y": 290, "width": 1076, "height": 204, "label": "SPECIALIST AGENTS", "subtitle": "", "stroke": "rgba(255,255,255,0.2)", "fill": "rgba(255,255,255,0.05)" },
{ "x": 42, "y": 526, "width": 1076, "height": 138, "label": "SYNTHESIS", "subtitle": "", "stroke": "rgba(255,255,255,0.2)", "fill": "rgba(255,255,255,0.05)" }
],
"nodes": [
{ "id": "request", "kind": "speech", "x": 78, "y": 142, "width": 148, "height": 66, "label": "User brief", "fill": "rgba(255,255,255,0.12)", "stroke": "rgba(255,255,255,0.35)", "flat": true },
{ "id": "coord", "kind": "double_rect", "x": 416, "y": 136, "width": 220, "height": 78, "label": "Coordinator Agent", "type_label": "ORCHESTRATOR", "fill": "rgba(255,255,255,0.12)", "stroke": "#c084fc" },
{ "id": "research", "kind": "rect", "x": 112, "y": 344, "width": 206, "height": 74, "label": "Research Agent", "type_label": "SPECIALIST", "fill": "rgba(255,255,255,0.12)", "stroke": "#60a5fa" },
{ "id": "coding", "kind": "terminal", "x": 478, "y": 332, "width": 198, "height": 108, "label": "Coding Agent", "fill": "#0f172a", "stroke": "rgba(255,255,255,0.24)", "header_fill": "rgba(255,255,255,0.12)" },
{ "id": "review", "kind": "rect", "x": 826, "y": 344, "width": 206, "height": 74, "label": "Review Agent", "type_label": "SPECIALIST", "fill": "rgba(255,255,255,0.12)", "stroke": "#34d399" },
{ "id": "memory", "kind": "cylinder", "x": 158, "y": 560, "width": 168, "height": 92, "label": "Shared Memory", "sublabel": "facts + plans", "fill": "rgba(255,255,255,0.08)", "stroke": "#34d399" },
{ "id": "merge", "kind": "double_rect", "x": 472, "y": 566, "width": 210, "height": 74, "label": "Synthesis Engine", "type_label": "MERGE", "fill": "rgba(255,255,255,0.12)", "stroke": "#c084fc" },
{ "id": "response", "kind": "speech", "x": 884, "y": 568, "width": 166, "height": 70, "label": "Final response", "fill": "rgba(255,255,255,0.12)", "stroke": "#f59e0b", "flat": true }
],
"arrows": [
{ "source": "request", "target": "coord", "source_port": "right", "target_port": "left", "flow": "read" },
{ "source": "coord", "target": "research", "source_port": "bottom", "target_port": "top", "flow": "control", "label": "delegate" },
{ "source": "coord", "target": "coding", "source_port": "bottom", "target_port": "top", "flow": "control", "corridor_x": [590] },
{ "source": "coord", "target": "review", "source_port": "bottom", "target_port": "top", "flow": "control", "corridor_x": [910] },
{ "source": "research", "target": "memory", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true },
{ "source": "coding", "target": "memory", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true, "corridor_x": [560] },
{ "source": "review", "target": "memory", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true, "corridor_x": [930], "route_points": [[929, 470], [242, 470]] },
{ "source": "memory", "target": "merge", "source_port": "right", "target_port": "left", "flow": "read", "label": "shared context" },
{ "source": "merge", "target": "response", "source_port": "right", "target_port": "left", "flow": "feedback" }
],
"legend": [
{ "flow": "read", "label": "Input / retrieval" },
{ "flow": "control", "label": "Delegation" },
{ "flow": "write", "label": "Shared memory write" },
{ "flow": "feedback", "label": "Synthesis output" }
],
"legend_position": "bottom-left",
"legend_y": 604,
"legend_box": true,
"legend_box_fill": "rgba(15,23,42,0.68)",
"footer": ""
}
{
"template_type": "architecture",
"style": 6,
"width": 1120,
"height": 700,
"style_overrides": {
"title_align": "center"
},
"title": "System Architecture",
"subtitle": "Claude official style with warm structure, restrained hierarchy, and deployment clarity",
"containers": [
{ "x": 44, "y": 118, "width": 1032, "height": 110, "label": "", "side_label": "Interface Layer", "side_label_x": 28, "side_label_anchor": "start", "subtitle": "", "stroke": "#ded8cf", "fill": "none" },
{ "x": 44, "y": 262, "width": 1032, "height": 154, "label": "", "side_label": "Core Layer", "side_label_x": 28, "side_label_anchor": "start", "subtitle": "", "stroke": "#ded8cf", "fill": "none" },
{ "x": 44, "y": 450, "width": 1032, "height": 178, "label": "", "side_label": "Foundation Layer", "side_label_x": 28, "side_label_anchor": "start", "subtitle": "", "stroke": "#ded8cf", "fill": "none" }
],
"nodes": [
{ "id": "entry", "kind": "rect", "x": 82, "y": 146, "width": 170, "height": 54, "label": "Client Surface", "type_label": "ENTRY", "fill": "#e9f1fb", "stroke": "#8c6f5a", "flat": true },
{ "id": "gateway", "kind": "double_rect", "x": 340, "y": 142, "width": 196, "height": 62, "label": "Gateway", "type_label": "ROUTER", "fill": "#f7ecda", "stroke": "#d97757" },
{ "id": "planner", "kind": "rect", "x": 144, "y": 306, "width": 188, "height": 60, "label": "Task Planner", "type_label": "ORCHESTRATION", "fill": "#f7ecda", "stroke": "#d0b893", "flat": true },
{ "id": "runtime", "kind": "double_rect", "x": 430, "y": 298, "width": 244, "height": 76, "label": "Model Runtime", "type_label": "INFERENCE", "fill": "#c8e4db", "stroke": "#8c6f5a" },
{ "id": "guard", "kind": "rect", "x": 782, "y": 306, "width": 200, "height": 60, "label": "Policy Guardrails", "type_label": "SAFETY", "fill": "#efe8de", "stroke": "#d0c3b3", "flat": true },
{ "id": "memory", "kind": "cylinder", "x": 96, "y": 494, "width": 154, "height": 92, "label": "Memory Store", "sublabel": "context + recall", "fill": "#e5e8df", "stroke": "#7b8b5c" },
{ "id": "tools", "kind": "rect", "x": 382, "y": 510, "width": 184, "height": 60, "label": "Tool Runtime", "type_label": "ACTION", "fill": "#f7ecda", "stroke": "#d0b893", "flat": true },
{ "id": "obs", "kind": "rect", "x": 688, "y": 510, "width": 184, "height": 60, "label": "Observability", "type_label": "OPS", "fill": "#efe8de", "stroke": "#d0c3b3", "flat": true },
{ "id": "registry", "kind": "rect", "x": 906, "y": 510, "width": 138, "height": 60, "label": "Registry", "type_label": "ROLL OUT", "fill": "#efe8de", "stroke": "#d0c3b3", "flat": true }
],
"arrows": [
{ "source": "entry", "target": "gateway", "source_port": "right", "target_port": "left", "flow": "read" },
{ "source": "gateway", "target": "planner", "source_port": "bottom", "target_port": "top", "flow": "control", "label": "decompose", "route_points": [[370,224], [370,336], [332,336]] },
{ "source": "gateway", "target": "runtime", "source_port": "bottom", "target_port": "top", "flow": "read", "route_points": [[438,224], [552,224], [552,298]] },
{ "source": "runtime", "target": "guard", "source_port": "right", "target_port": "left", "flow": "data" },
{ "source": "runtime", "target": "memory", "source_port": "bottom", "target_port": "top", "flow": "write", "dashed": true, "route_points": [[606,432], [218,432], [218,494]] },
{ "source": "runtime", "target": "tools", "source_port": "bottom", "target_port": "top", "flow": "read" },
{ "source": "runtime", "target": "obs", "source_port": "bottom", "target_port": "top", "flow": "feedback", "dashed": true, "route_points": [[730,432], [780,432], [780,510]] },
{ "source": "obs", "target": "registry", "source_port": "right", "target_port": "left", "flow": "control" }
],
"legend": [
{ "flow": "read", "label": "Primary request path" },
{ "flow": "control", "label": "Planning / rollout control" },
{ "flow": "write", "label": "Memory writeback" },
{ "flow": "feedback", "label": "Operational telemetry" }
],
"legend_position": "bottom-right",
"legend_box": true,
"legend_box_fill": "#fffaf3",
"legend_y": 596,
"footer": ""
}
{
"template_type": "agent",
"style": 2,
"width": 1200,
"height": 700,
"window_controls": true,
"meta_center": "AGENT TOOL CALL EXECUTION FLOW · v1.0",
"meta_right": "style-2-dark-terminal",
"meta_fill": "#64748b",
"title": "Tool Call Flow",
"subtitle": "Dark terminal style with semantic action, retrieval, and execution paths",
"containers": [
{
"x": 36,
"y": 96,
"width": 1128,
"height": 142,
"label": "REQUEST PATH",
"subtitle": "",
"stroke": "#334155",
"fill": "rgba(15,23,42,0.18)"
},
{
"x": 36,
"y": 280,
"width": 1128,
"height": 202,
"label": "TOOLING FABRIC",
"subtitle": "",
"stroke": "#334155",
"fill": "rgba(15,23,42,0.18)"
},
{
"x": 36,
"y": 522,
"width": 1128,
"height": 126,
"label": "KNOWLEDGE + RESPONSE",
"subtitle": "",
"stroke": "#334155",
"fill": "rgba(15,23,42,0.18)"
}
],
"nodes": [
{
"id": "query",
"kind": "speech",
"x": 64,
"y": 126,
"width": 132,
"height": 62,
"label": "User query",
"fill": "#0f172a",
"stroke": "#38bdf8",
"flat": true
},
{
"id": "planner",
"kind": "double_rect",
"x": 292,
"y": 122,
"width": 188,
"height": 66,
"label": "Retrieve chunks",
"fill": "#111827",
"stroke": "#a855f7",
"glow": "purple"
},
{
"id": "answer",
"kind": "rect",
"x": 570,
"y": 122,
"width": 208,
"height": 66,
"label": "Generate answer",
"fill": "#111827",
"stroke": "#f97316"
},
{
"id": "kb",
"kind": "cylinder",
"x": 948,
"y": 104,
"width": 158,
"height": 122,
"label": "Knowledge base",
"sublabel": "embeddings",
"fill": "#0f172a",
"stroke": "#38bdf8",
"glow": "blue"
},
{
"id": "agent",
"kind": "bot",
"x": 380,
"y": 316,
"width": 138,
"height": 118,
"label": "Agent",
"sublabel": "planner + tool policy",
"accent_fill": "#34d399"
},
{
"id": "terminal",
"kind": "terminal",
"x": 676,
"y": 334,
"width": 178,
"height": 108,
"label": "Terminal",
"fill": "#111111",
"stroke": "#475569",
"header_fill": "#222222"
},
{
"id": "docs",
"kind": "folder",
"x": 962,
"y": 350,
"width": 168,
"height": 96,
"label": "Source documents",
"fill": "#3f2a00",
"stroke": "#f59e0b",
"line_stroke": "#fcd34d"
},
{
"id": "reply",
"kind": "speech",
"x": 250,
"y": 560,
"width": 172,
"height": 64,
"label": "Grounded answer",
"fill": "#0f172a",
"stroke": "#34d399",
"flat": true,
"glow": "green"
}
],
"arrows": [
{ "source": "query", "target": "planner", "source_port": "right", "target_port": "left", "flow": "read" },
{ "source": "planner", "target": "answer", "source_port": "right", "target_port": "left", "flow": "data" },
{ "source": "planner", "target": "kb", "source_port": "right", "target_port": "left", "flow": "control", "route_points": [[520, 96], [918, 96], [918, 165]] },
{ "source": "kb", "target": "answer", "source_port": "left", "target_port": "right", "flow": "control" },
{ "source": "query", "target": "agent", "source_port": "bottom", "target_port": "top", "flow": "read" },
{ "source": "agent", "target": "terminal", "source_port": "right", "target_port": "left", "flow": "read" },
{ "source": "terminal", "target": "docs", "source_port": "right", "target_port": "left", "flow": "read", "label": "pdfgrep / rga", "label_dx": -8 },
{
"source": "docs",
"target": "kb",
"source_port": "top",
"target_port": "bottom",
"flow": "feedback",
"label": "embed",
"corridor_x": [1090],
"label_dx": 18,
"label_dy": -12
},
{ "source": "agent", "target": "reply", "source_port": "bottom", "target_port": "top", "flow": "read", "route_points": [[320, 544], [320, 560]] },
{
"source": "terminal",
"target": "agent",
"source_port": "bottom",
"target_port": "bottom",
"flow": "control",
"route_points": [[760, 464], [760, 488], [456, 488], [456, 434]]
}
],
"legend": [
{ "flow": "read", "label": "Agent / tool path" },
{ "flow": "control", "label": "Planner / retrieval path" },
{ "flow": "data", "label": "Answer synthesis" },
{ "flow": "feedback", "label": "Embedding update" }
],
"legend_position": "bottom-right",
"legend_box": true,
"legend_box_fill": "rgba(15,23,42,0.72)",
"legend_y": 604,
"footer": "Agent loop iterates until grounded context is ready"
}
MIT License
Copyright (c) 2025 fireworks-tech-graph contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
"name": "@yizhiyanhua-ai/fireworks-tech-graph",
"version": "1.0.4",
"description": "Generate production-quality SVG technical diagrams (architecture, flowchart, UML, ER, sequence, etc.) with 7 built-in styles. Export as SVG+PNG via cairosvg (recommended), with rsvg-convert and puppeteer as alternatives.",
"main": "SKILL.md",
"keywords": [
"claude-code",
"skill",
"diagram",
"svg",
"architecture",
"flowchart",
"uml",
"sequence-diagram",
"er-diagram",
"visualization"
],
"author": "yizhiyanhua-ai",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/yizhiyanhua-ai/fireworks-tech-graph.git"
},
"bugs": {
"url": "https://github.com/yizhiyanhua-ai/fireworks-tech-graph/issues"
},
"homepage": "https://github.com/yizhiyanhua-ai/fireworks-tech-graph#readme",
"files": [
"SKILL.md",
"README.md",
"README.zh.md",
"LICENSE",
"references/",
"scripts/",
"fixtures/",
"templates/",
"assets/"
],
"engines": {
"node": ">=14.0.0"
}
}
English | 中文
fireworks-tech-graph
Stop drawing diagrams by hand. Describe your system in English or Chinese — get publication-ready SVG + PNG technical diagrams in seconds.
  ![8 Visual Styles]() ![14 Diagram Types]() ![UML Support]()
---
Overview
fireworks-tech-graph turns natural language descriptions into polished SVG diagrams, then exports them as high-resolution PNG via cairosvg (recommended), with rsvg-convert and puppeteer available as alternatives. It ships with 7 template styles and 1 AI-authored style (Dark Luxury) and deep knowledge of AI/Agent domain patterns (RAG, Agentic Search, Mem0, Multi-Agent, Tool Call flows), plus full support for all 14 UML diagram types.
User: "Generate a Mem0 memory architecture diagram, dark style"
→ Skill classifies: Memory Architecture Diagram, Style 2
→ Generates SVG with swim lanes, cylinders, semantic arrows
→ Exports 1920px PNG
→ Reports: mem0-architecture.svg / mem0-architecture.png---
Work With the Builder
This project is also a proof surface for a broader capability: turning vague AI/devtool workflows into constrained, reusable systems with validation, documentation, export paths, and product-facing polish.
If you are building agent infrastructure, AI IDEs, internal copilots, developer tools, technical documentation systems, or applied AI workflow products, I am open to scoped paid sprints, design-partner work, and founding engineer conversations.
- Founder-facing profile: https://bradzhang.dev/en
- Commercial case study: https://bradzhang.dev/en/case-studies/fireworks-tech-graph
- Work with me: https://bradzhang.dev/en/work-with-me
---
Showcase
All samples exported at 1920px width (2× retina) via cairosvg. PNG is lossless and the right choice for technical diagrams — sharp edges, no JPEG compression artifacts on text/lines.Style 1 — Flat Icon (default)
Mem0 Memory Architecture — white background, semantic arrows, layered memory system !Style 1 — Flat Icon
Style 2 — Dark Terminal
Tool Call Flow — dark background, neon accents, monospace font !Style 2 — Dark Terminal
Style 3 — Blueprint
Microservices Architecture — deep blue background, grid lines, cyan strokes !Style 3 — Blueprint
Style 4 — Notion Clean
Agent Memory Types — minimal white, single accent color !Style 4 — Notion Clean
Style 5 — Glassmorphism
Multi-Agent Collaboration — dark gradient background, frosted glass cards !Style 5 — Glassmorphism
Style 6 — Claude Official
System Architecture — warm cream background (#f8f6f3), Anthropic brand colors, clean professional aesthetic !Style 6 — Claude Official
Style 7 — OpenAI Official
API Integration Flow — pure white background, OpenAI brand palette, modern minimalist design !Style 7 — OpenAI Official
Style 8 — Dark Luxury (AI-authored)
Sopify Adaptive Workflow Engine — deep black background, champagne gold accents, serif titles, six-bucket color wheel !Style 8 — Dark Luxury
---
Stable Prompt Recipes
Use prompts like these when you want the model to stay close to the repo's strongest regression-tested outputs:
Style 1 — Flat Icon
Draw a Mem0 memory architecture diagram in style 1 (Flat Icon).
Use four horizontal sections: Input Layer, Memory Manager, Storage Layer, Output / Retrieval.
Include User, AI App / Agent, LLM, mem0 Client, Memory Manager, Vector Store, Graph DB, Key-Value Store, History Store, Context Builder, Ranked Results, Personalized Response.
Use semantic arrows for read, write, control, and data flow. Keep the layout clean and product-doc friendly.Style 2 — Dark Terminal
Draw a tool call flow diagram in style 2 (Dark Terminal).
Show User query, Retrieve chunks, Generate answer, Knowledge base, Agent, Terminal, Source documents, and Grounded answer.
Use terminal chrome, neon accents, monospace typography, and semantic arrows for retrieval, synthesis, and embedding update.Style 3 — Blueprint
Draw a microservices architecture diagram in style 3 (Blueprint).
Create numbered engineering sections like 01 // EDGE, 02 // APPLICATION SERVICES, 03 // DATA + EVENT INFRA, 04 // OBSERVABILITY.
Include Client Apps, API Gateway, Auth / Policy, three services, Event Router, Postgres, Redis Cache, Warehouse, and Metrics / Traces.
Use blueprint grid, cyan strokes, and a bottom-right title block.Style 4 — Notion Clean
Draw an agent memory types diagram in style 4 (Notion Clean).
Compare Sensory Memory, Working Memory, Episodic Memory, Semantic Memory, and Procedural Memory around a central Agent core.
Use a minimal white layout, neutral borders, one accent color for arrows, and short storage tags for each memory type.Style 5 — Glassmorphism
Draw a multi-agent collaboration diagram in style 5 (Glassmorphism).
Use three sections: Mission Control, Specialist Agents, and Synthesis.
Include User brief, Coordinator Agent, Research Agent, Coding Agent, Review Agent, Shared Memory, Synthesis Engine, and Final response.
Use frosted cards, soft glow, and semantic arrows for delegation, shared memory writes, and synthesis output.Style 6 — Claude Official
Draw a system architecture diagram in style 6 (Claude Official).
Use left-side layer labels: Interface Layer, Core Layer, Foundation Layer.
Include Client Surface, Gateway, Task Planner, Model Runtime, Policy Guardrails, Memory Store, Tool Runtime, Observability, and Registry.
Use warm cream background, restrained brand-like palette, generous whitespace, and a bottom-right legend.Style 7 — OpenAI Official
Draw an API integration flow diagram in style 7 (OpenAI Official).
Use three sections: Entry, Model + Tools, and Delivery.
Include Application, OpenAI SDK Layer, Prompt Builder, Model Runtime, Tool Calls, Response Formatter, Observability, and Release Control.
Keep the look minimal, white, precise, and modern with clean green-accented arrows.Style 8 — Dark Luxury (AI-authored)
Style 8 is not a template-driven style. The AI reads references/style-8-dark-luxury.md and hand-crafts the SVG directly.Draw a system architecture diagram in style 8 (Dark Luxury).
Use a deep black background (#0a0a0a), champagne gold (#d4a574) for titles and cluster labels,
and spread node colors across the full color wheel: emerald, violet, sky blue, rose, amber, cool-gray.
Apply Georgia serif only for the main title and section labels (≥11px); use sans-serif for all node text and arrow labels.---
Features
- 8 visual styles — 7 template-driven (Flat Icon to OpenAI Official) + 1 AI-authored (Dark Luxury)
- Executable style system — style guides are encoded into the generator, not only documented in markdown
- 14 diagram types — Full UML support (Class, Component, Deployment, Package, Composite Structure, Object, Use Case, Activity, State Machine, Sequence, Communication, Timing, Interaction Overview, ER Diagram) plus AI/Agent domain diagrams
- AI/Agent domain patterns — RAG, Agentic Search, Mem0, Multi-Agent, Tool Call, and more built-in
- Semantic shape vocabulary — LLM = double-border rect, Agent = hexagon, Vector Store = ringed cylinder
- Semantic arrow system — color + dash pattern encode meaning (write vs read vs async vs loop)
- Product icons — 40+ products with brand colors: OpenAI, Anthropic, Pinecone, Weaviate, Kafka, PostgreSQL…
- Swim lane grouping — automatic layer labeling for complex architectures
- SVG + PNG output — SVG for editing, 1920px PNG for embedding
- Renderer-friendly — pure inline SVG, no external font fetching; renders cleanly in cairosvg, rsvg-convert, and headless Chrome
---
Installation
npx skills add yizhiyanhua-ai/fireworks-tech-graphThis skill is installed from the GitHub repository. The npm package page is the public package/distribution page:
https://www.npmjs.com/package/@yizhiyanhua-ai/fireworks-tech-graphDo not use the npm package name with skills add, because the CLI resolves install sources as GitHub/local paths.
Update
npx skills add yizhiyanhua-ai/fireworks-tech-graph --force -g -yRe-run add --force to pull the latest version of this skill.
Or clone directly:
git clone https://github.com/yizhiyanhua-ai/fireworks-tech-graph.git ~/.claude/skills/fireworks-tech-graph---
Requirements
Pick one PNG renderer (cairosvg recommended):
# Recommended: cairosvg (best CSS support)
pip install cairosvg
# Fallback: rsvg-convert (system package; may drop CSS / <foreignObject>)
brew install librsvg # macOS
sudo apt install librsvg2-bin # Ubuntu/Debian
# Highest fidelity: puppeteer (real Chromium; heavy)
npm install puppeteer
# Verify (any one is enough)
python3 -c "import cairosvg; print(cairosvg.__version__)"
rsvg-convert --version| Renderer | Quality | Install Cost | Use When |
|---|---|---|---|
| cairosvg | ✅ Good | Single pip install | Default — best balance |
| rsvg-convert | ⚠️ Fair | System package | No Python available, simple flat diagrams |
| puppeteer | ✅✅ Best | Node + ~150MB Chromium | Browser-generated SVG (D3, Mermaid) or pixel-perfect required |
---
Why Not Mermaid or draw.io?
| Mermaid | draw.io | fireworks-tech-graph | |
|---|---|---|---|
| Natural language input | ✗ | ✗ | ✅ |
| AI/Agent domain patterns | ✗ | ✗ | ✅ |
| Multiple visual styles | ✗ | manual | ✅ 5 built-in |
| High-res PNG export | ✗ | manual | ✅ auto 1920px |
| Semantic arrow colors | ✗ | manual | ✅ auto |
| No online tool needed | ✅ | ✗ | ✅ |
Mermaid is great for quick inline diagrams in markdown. draw.io is great for manual polishing. fireworks-tech-graph is optimized for describing a system and getting a polished diagram immediately, without writing DSL syntax or clicking around a GUI.
---
Usage
Trigger phrases
The skill auto-triggers on:
generate diagram / draw diagram / create chart / visualize
architecture diagram / flowchart / sequence diagram / data flowBasic usage
Draw a RAG pipeline flowchartGenerate an Agentic Search architecture diagramSpecify style
Draw a microservices architecture diagram, style 2 (dark terminal)Draw a multi-agent collaboration diagram --style glassmorphismSpecify output path
Generate a Mem0 architecture diagram, output to ~/Desktop/Create a tool call flow diagram --output /tmp/diagrams/---
Example Prompts by Scenario
AI/Agent Systems
Compare Agentic RAG vs standard RAG in a feature matrix, Notion clean style→ Comparison matrix: RAG vs Agentic RAG, covering retrieval strategy, agent loop, tool use
Generate a Mem0 memory architecture diagram with vector store, graph DB, KV store, and memory manager→ Memory Architecture with swim lanes: Input → Memory Manager → Storage tiers → Retrieval
Draw a Multi-Agent diagram: Orchestrator dispatches 3 SubAgents (search / compute / code execution), results aggregated→ Agent Architecture with hexagons, tool layers, and result aggregation
Visualize the Tool Call execution flow: LLM → Tool Selector → Execution → Parser → back to LLM→ Flowchart with decision loop showing tool invocation cycle
Draw the 5 agent memory types: Sensory, Working, Episodic, Semantic, Procedural→ Mind map or layered architecture showing memory tiers from sensory to procedural
Infrastructure & Cloud
Draw a microservices architecture: Client → API Gateway → [User Service / Order Service / Payment Service] → PostgreSQL + Redis→ Architecture diagram with horizontal layers, swim lanes per service cluster
Generate a data pipeline diagram: Kafka → Spark processing → write to S3 → Athena query→ Data flow diagram with labeled arrows (stream / batch / query)
Draw a Kubernetes deployment: Ingress → Service → [Pod × 3] → ConfigMap + PersistentVolume→ Architecture with dashed containers per namespace, solid arrows for traffic flow
API & Sequence Flows
Draw an OAuth2 authorization code flow sequence diagram: User → Client → Auth Server → Resource Server→ Sequence diagram with vertical lifelines and activation boxes
Draw the ChatGPT Plugin call sequence diagram→ Sequence: User → ChatGPT → Plugin Manifest → API → Response chain
Decision & Process Flows
Draw a pre-launch QA flowchart for an AI app: Code Review → Security Scan → Performance Test → Manual Approval → Deploy→ Flowchart with diamond decision nodes and parallel branches
Generate a feature comparison matrix: RAG vs Fine-tuning vs Prompt Engineering→ Comparison matrix with checked/unchecked cells across cost, latency, accuracy, flexibility
Concept Maps
Visualize the LLM application tech stack: from foundation model to SDK to app framework to deployment→ Layered architecture or mind map from model layer to product layer
Draw an AI Agent capability map: Perception / Memory / Reasoning / Action / Learning→ Mind map with central "AI Agent" node and 5 radial branches
---
Styles
| # | Name | Background | Font | Best For |
|---|---|---|---|---|
| 1 | Flat Icon (default) | #ffffff | Helvetica | Blogs, slides, docs |
| 2 | Dark Terminal | #0f0f1a | SF Mono / Fira Code | GitHub README, dev articles |
| 3 | Blueprint | #0a1628 | Courier New | Architecture docs, engineering |
| 4 | Notion Clean | #ffffff | system-ui | Notion, Confluence, wikis |
| 5 | Glassmorphism | #0d1117 gradient | Inter | Product sites, keynotes |
| 6 | Claude Official | #f8f6f3 | system-ui | Anthropic-style diagrams, warm aesthetic |
| 7 | OpenAI Official | #ffffff | system-ui | OpenAI-style diagrams, clean modern look |
Each style has a dedicated reference file in references/ with exact color tokens, SVG patterns, and templates. The generator also consumes style-aware structure fields such as containers, semantic nodes[].kind, arrows[].flow, and explicit port anchors so sample-grade layouts can be reproduced more consistently.
Useful high-leverage fields for style-specific polish:
style_overridesto nudge title alignment or palette tokens without forking a full stylecontainers[].header_prefix/containers[].header_textfor blueprint-style numbered section headers such as01 // EDGEcontainers[].side_labelfor Claude-style left layer labelswindow_controls,meta_left,meta_center,meta_rightfor terminal / document chromeblueprint_title_blockfor engineering title boxes in style 3
Style Selection Guide
For UML Diagrams:
- Class/Component/Package: Style 1 (Flat Icon) or Style 4 (Notion Clean) — clear structure, easy to read
- Sequence/Timing: Style 2 (Dark Terminal) — monospace fonts help with alignment
- State Machine/Activity: Style 3 (Blueprint) — engineering aesthetic fits process flows
- Use Case/Interview: Style 1 (Flat Icon) — colorful, accessible
For AI/Agent Diagrams:
- RAG/Agentic Search: Style 2 (Dark Terminal) or Style 5 (Glassmorphism) — tech-forward aesthetic
- Memory Architecture: Style 3 (Blueprint) — emphasizes layered storage tiers
- Multi-Agent: Style 5 (Glassmorphism) — frosted cards distinguish agent boundaries
For Documentation:
- Internal docs: Style 4 (Notion Clean) — minimal, wiki-friendly
- Blog posts: Style 1 (Flat Icon) — colorful, engaging
- GitHub README: Style 2 (Dark Terminal) — matches dark theme
- Presentations: Style 5 (Glassmorphism) or Style 6 (Claude Official) — polished
Brand-Specific:
- Anthropic/Claude projects: Style 6 (Claude Official) — warm cream background, brand colors
- OpenAI projects: Style 7 (OpenAI Official) — clean white, OpenAI palette
---
Diagram Types
| Type | Description | Key Layout Rule |
|---|---|---|
| Architecture | Services, components, cloud infra | Horizontal layers top→bottom |
| Data Flow | What data moves where | Label every arrow with data type |
| Flowchart | Decisions, process steps | Diamond = decision, top→bottom |
| Agent Architecture | LLM + tools + memory | 5-layer model: Input/Agent/Memory/Tool/Output |
| Memory Architecture | Mem0, MemGPT-style | Separate read/write paths, memory tiers |
| Sequence | API call chains, time-ordered | Vertical lifelines, horizontal messages |
| Comparison | Feature matrix, side-by-side | Column = system, row = attribute |
| Mind Map | Concept maps, radial | Central node, bezier branches |
UML Diagram Support (14 Types)
| UML Type | Description | Best Style |
|---|---|---|
| Class Diagram | Classes, attributes, methods, relationships | Style 1, 4 |
| Component Diagram | Software components and dependencies | Style 1, 3 |
| Deployment Diagram | Hardware nodes and software deployment | Style 3 |
| Package Diagram | Package organization and dependencies | Style 1, 4 |
| Composite Structure | Internal structure of classes/components | Style 1, 3 |
| Object Diagram | Object instances and relationships | Style 1, 4 |
| Use Case Diagram | Actors, use cases, system boundaries | Style 1 |
| Activity Diagram | Workflows, parallel processes | Style 3 |
| State Machine | State transitions and events | Style 2, 3 |
| Sequence Diagram | Message exchanges over time | Style 2 |
| Communication Diagram | Object interactions and messages | Style 1, 2 |
| Timing Diagram | State changes over time | Style 2 |
| Interaction Overview | High-level interaction flow | Style 1, 2 |
| ER Diagram | Entity-relationship data models | Style 1, 3 |
---
AI/Agent Domain Patterns
Built-in pattern knowledge:
RAG Pipeline → Query → Embed → VectorSearch → Retrieve → LLM → Response
Agentic RAG → adds Agent loop + Tool use
Agentic Search → Query → Planner → [Search/Calc/Code] → Synthesizer
Mem0 Memory Layer → Input → Memory Manager → [VectorDB + GraphDB] → Context
Agent Memory Types → Sensory → Working → Episodic → Semantic → Procedural
Multi-Agent → Orchestrator → [SubAgent×N] → Aggregator → Output
Tool Call Flow → LLM → Tool Selector → Execution → Parser → LLM (loop)---
Shape Vocabulary
Shapes encode semantic meaning consistently across all styles:
| Concept | Shape |
|---|---|
| User / Human | Circle + body |
| LLM / Model | Rounded rect, double border, ⚡ |
| Agent / Orchestrator | Hexagon |
| Memory (short-term) | Dashed-border rounded rect |
| Memory (long-term) | Solid cylinder |
| Vector Store | Cylinder with inner rings |
| Graph DB | 3-circle cluster |
| Tool / Function | Rect with ⚙ |
| API / Gateway | Hexagon (single border) |
| Queue / Stream | Horizontal pipe/tube |
| Document / File | Folded-corner rect |
| Browser / UI | Rect with 3-dot titlebar |
| Decision | Diamond |
| External Service | Dashed-border rect |
---
Arrow Semantics
| Flow Type | Stroke | Dash | Meaning |
|---|---|---|---|
| Primary data flow | 2px solid | — | Main request/response |
| Control / trigger | 1.5px solid | — | System A triggers B |
| Memory read | 1.5px solid | — | Retrieve from store |
| Memory write | 1.5px | 5,3 | Write/store operation |
| Async / event | 1.5px | 4,2 | Non-blocking |
| Feedback / loop | 1.5px curved | — | Iterative reasoning |
---
File Structure
fireworks-tech-graph/
├── SKILL.md # Main skill — diagram types, layout rules, shape vocab
├── README.md # This file (English)
├── README.zh.md # Chinese version
├── references/
│ ├── style-1-flat-icon.md # White background, colored accents
│ ├── style-2-dark-terminal.md # Dark bg, neon accents, monospace
│ ├── style-3-blueprint.md # Blueprint grid, cyan lines
│ ├── style-4-notion-clean.md # Minimal, white, single arrow color
│ ├── style-5-glassmorphism.md # Dark gradient, frosted glass cards
│ ├── style-6-claude-official.md # Warm cream background, Anthropic brand
│ ├── style-7-openai.md # Clean white, OpenAI brand palette
│ └── icons.md # 40+ product icons + semantic shapes
├── agents/
│ └── openai.yaml # Agent metadata for compatible runtimes
├── fixtures/
│ ├── mem0-style1.json # Style 1 regression fixture
│ ├── tool-call-style2.json # Style 2 regression fixture
│ └── ... # Additional sample-grade fixtures per style
├── scripts/
│ ├── generate-diagram.sh # Validate SVG + export PNG
│ ├── generate-from-template.py # Create starter SVGs from templates
│ ├── validate-svg.sh # Validate SVG syntax
│ └── test-all-styles.sh # Batch test all styles
├── assets/
│ └── samples/ # Showcase diagram PNGs
├── templates/
│ ├── architecture.svg # Architecture starter template
│ ├── data-flow.svg # Data-flow starter template
│ └── ... # Additional diagram templates
└── agentloop-core.svg # Included sample SVG---
Product Icon Coverage
AI/ML: OpenAI, Anthropic/Claude, Google Gemini, Meta LLaMA, Mistral, Cohere, Groq, Hugging Face
AI Frameworks: Mem0, LangChain, LlamaIndex, LangGraph, CrewAI, AutoGen, DSPy, Haystack
Vector DBs: Pinecone, Weaviate, Qdrant, Chroma, Milvus, pgvector, Faiss
Databases: PostgreSQL, MySQL, MongoDB, Redis, Elasticsearch, Neo4j, Cassandra
Messaging: Kafka, RabbitMQ, NATS, Pulsar
Cloud: AWS, GCP, Azure, Cloudflare, Vercel, Docker, Kubernetes
Observability: Grafana, Prometheus, Datadog, LangSmith, Langfuse, Arize
---
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| PNG is blank or all-black | @import url() in SVG — neither cairosvg nor rsvg-convert can fetch external fonts | Remove @import, use system font stack |
| PNG not generated | No renderer installed | pip install cairosvg (recommended), or brew install librsvg / apt install librsvg2-bin |
| Borders or text missing in PNG | Using rsvg-convert on SVG with CSS / <foreignObject> | Switch to cairosvg (pip install cairosvg) — much better CSS support |
| Diagram cut off at bottom | ViewBox height too short | Increase height in viewBox="0 0 960 <height>" |
| Text overflowing boxes | Labels too long | Add text-anchor="middle" + <clipPath> or shorten label |
| Icons not rendering | External CDN URL | Use inline SVG paths from references/icons.md |
| Browser-generated SVG renders incorrectly | cairosvg / rsvg can't replay all CSS/JS-injected styles | Use the puppeteer script in SKILL.md for 100% fidelity |
---
License
MIT © 2025 fireworks-tech-graph contributors
English | 中文
fireworks-tech-graph
不用手画图了。用中文描述你的系统,几秒钟得到可直接发布的 SVG + PNG 技术图。
  ![8 种视觉风格]() ![14 种图类型]() ![UML 支持]()
概述
fireworks-tech-graph 将自然语言描述转化为精美的 SVG 技术图,并通过 cairosvg(推荐)导出高分辨率 PNG,同时支持 rsvg-convert 与 puppeteer 作为备选方案。内置 7 种模板风格 + 1 种 AI 手绘风格(Dark Luxury),深度覆盖 AI/Agent 领域常见图类型(RAG、Agentic Search、Mem0、Multi-Agent、Tool Call 流程等),并完整支持全部 14 种 UML 图类型。
用户: "画一张 Mem0 的架构图,暗黑风格"
→ Skill 识别:Memory Architecture Diagram,Style 2
→ 生成含泳道、圆柱体、语义箭头的 SVG
→ 导出 1920px PNG
→ 输出路径:mem0-architecture.svg / mem0-architecture.png---
效果展示
所有示例图均以 1920px 宽度(2× 视网膜分辨率)通过 cairosvg 导出为 PNG 格式。技术图应选 PNG(无损),JPG 有损压缩会在文字和线条边缘产生噪点。风格 1 — 扁平图标风(默认)
Mem0 记忆架构图 — 白底,语义箭头,分层记忆系统 !风格 1 — 扁平图标风
风格 2 — 暗黑极客风
Tool Call 执行流程 — 深色背景,Neon 配色,等宽字体 !风格 2 — 暗黑极客风
风格 3 — 工程蓝图风
微服务架构图 — 深蓝底,网格线,青色描边 !风格 3 — 工程蓝图风
风格 4 — Notion 极简风
Agent 记忆类型图 — 白底极简,单一强调色 !风格 4 — Notion 极简风
风格 5 — 玻璃态卡片风
Multi-Agent 协作图 — 深色渐变底,磨砂玻璃卡片 !风格 5 — 玻璃态卡片风
风格 6 — Claude 官方风格
系统架构图 — 温暖奶油色背景 (#f8f6f3),Anthropic 品牌色,简洁专业美学 !风格 6 — Claude 官方风格
风格 7 — OpenAI 官方风格
API 集成流程图 — 纯白背景,OpenAI 品牌配色,现代极简设计 !风格 7 — OpenAI 官方风格
风格 8 — 暗黑奢华风 (AI 手绘)
Sopify 自适应工作流引擎 — 深黑背景,香槟金点缀,衬线体标题,六色桶色轮 !风格 8 — 暗黑奢华风
---
稳定输出提示词样例
下面这 7 组提示词都更贴近当前仓库里回归测试最稳定的输出方式:
风格 1 — 扁平图标风
画一张 style 1(Flat Icon)的 Mem0 记忆架构图。
分成四个横向区域:Input Layer、Memory Manager、Storage Layer、Output / Retrieval。
包含 User、AI App / Agent、LLM、mem0 Client、Memory Manager、Vector Store、Graph DB、Key-Value Store、History Store、Context Builder、Ranked Results、Personalized Response。
使用 read、write、control、data 四类语义箭头,整体保持产品文档风格的清晰布局。风格 2 — 暗黑极客风
画一张 style 2(Dark Terminal)的 tool call flow 图。
包含 User query、Retrieve chunks、Generate answer、Knowledge base、Agent、Terminal、Source documents、Grounded answer。
使用终端窗口 chrome、Neon 强调色、等宽字体,以及 retrieval、answer synthesis、embedding update 三类语义箭头。风格 3 — 工程蓝图风
画一张 style 3(Blueprint)的微服务架构图。
使用带编号的工程分区标题,例如 01 // EDGE、02 // APPLICATION SERVICES、03 // DATA + EVENT INFRA、04 // OBSERVABILITY。
包含 Client Apps、API Gateway、Auth / Policy、三个业务服务、Event Router、Postgres、Redis Cache、Warehouse、Metrics / Traces。
使用蓝图网格、青色描边,并在右下角加入工程 title block。风格 4 — Notion 极简风
画一张 style 4(Notion Clean)的 agent memory types 图。
以中间的 Agent Core 为中心,对比 Sensory Memory、Working Memory、Episodic Memory、Semantic Memory、Procedural Memory。
使用极简白底、浅边框、单一强调色箭头,并给每种 memory 补充简短的存储标签。风格 5 — 玻璃态卡片风
画一张 style 5(Glassmorphism)的 multi-agent collaboration 图。
分成 Mission Control、Specialist Agents、Synthesis 三个区域。
包含 User brief、Coordinator Agent、Research Agent、Coding Agent、Review Agent、Shared Memory、Synthesis Engine、Final response。
使用 frosted glass 卡片、轻微 glow,以及 delegation、shared memory write、synthesis output 三类语义箭头。风格 6 — Claude 官方风格
画一张 style 6(Claude Official)的 system architecture 图。
使用左侧 layer label:Interface Layer、Core Layer、Foundation Layer。
包含 Client Surface、Gateway、Task Planner、Model Runtime、Policy Guardrails、Memory Store、Tool Runtime、Observability、Registry。
使用温暖奶油色背景、克制的品牌感配色、足够留白,并在右下角放 legend。风格 7 — OpenAI 官方风格
画一张 style 7(OpenAI Official)的 API integration flow 图。
分成 Entry、Model + Tools、Delivery 三个区域。
包含 Application、OpenAI SDK Layer、Prompt Builder、Model Runtime、Tool Calls、Response Formatter、Observability、Release Control。
整体保持纯白、精确、现代、极简,并使用干净的绿色语义箭头。风格 8 — 暗黑奢华风 (AI 手绘)
风格 8 不是模板驱动风格。AI 读取 references/style-8-dark-luxury.md 手工绘制 SVG。画一张 style 8(Dark Luxury)的系统架构图。
背景使用深黑色(#0a0a0a),标题和区块标签用香槟金(#d4a574),
节点颜色分布在完整色轮上:翠绿、深紫、天空蓝、玫瑰红、琥珀黄、冷灰。
标题和区块标签(≥11px)使用 Georgia 衬线体;节点文字和箭头标签全用无衬线体。---
功能特性
- 8 种视觉风格 — 7 种模板驱动(Flat Icon 到 OpenAI Official)+ 1 种 AI 手绘(Dark Luxury)
- 可执行风格系统 — 风格约束不仅写在文档里,也真正进入生成器逻辑
- 14 种图类型 — 完整支持全部 UML 图类型(类图、组件图、部署图、包图、复合结构图、对象图、用例图、活动图、状态机图、序列图、通信图、时序图、交互概览图、ER 图)以及 AI/Agent 领域图
- AI/Agent 领域内建知识 — RAG、Agentic Search、Mem0、Multi-Agent、Tool Call 等常见 Pattern 开箱即用
- 语义形状词汇表 — LLM = 双边框圆角矩形,Agent = 六边形,Vector Store = 带内环圆柱
- 语义箭头系统 — 颜色 + 虚线样式编码含义(写入/读取/异步/循环)
- 产品图标库 — 40+ 产品品牌色:OpenAI、Anthropic、Pinecone、Weaviate、Kafka、PostgreSQL……
- 泳道分组 — 自动为复杂架构添加层级标签
- SVG + PNG 双输出 — SVG 可编辑,1920px PNG 可直接嵌入文章
- 渲染器友好 — 纯内联 SVG,不依赖外部字体;在 cairosvg、rsvg-convert、headless Chrome 下都能稳定渲染
---
安装
npx skills add yizhiyanhua-ai/fireworks-tech-graph这个 Skill 的 skills add 安装源是 GitHub 仓库。npm 页面用于公开展示、版本分发和 README 浏览:
https://www.npmjs.com/package/@yizhiyanhua-ai/fireworks-tech-graph不要把 npm 包名直接写进 skills add,因为 CLI 会把安装源解析为 GitHub 路径或本地路径。
更新
npx skills add yizhiyanhua-ai/fireworks-tech-graph --force -g -y用户后续要升级时,直接重新执行一次 add --force 即可拉取最新版本。
或直接克隆:
git clone https://github.com/yizhiyanhua-ai/fireworks-tech-graph.git ~/.claude/skills/fireworks-tech-graph---
安装依赖
任选 一种 PNG 渲染器(推荐 cairosvg):
# 推荐:cairosvg(CSS 支持最好)
pip install cairosvg
# 备选:rsvg-convert(系统包,可能丢失 CSS / <foreignObject>)
brew install librsvg # macOS
sudo apt install librsvg2-bin # Ubuntu/Debian
# 最高保真:puppeteer(真实 Chromium,体积较大)
npm install puppeteer
# 验证安装(任一即可)
python3 -c "import cairosvg; print(cairosvg.__version__)"
rsvg-convert --version| 渲染器 | 渲染质量 | 安装成本 | 适用场景 |
|---|---|---|---|
| cairosvg | ✅ 好 | 一行 pip install | 默认推荐,平衡最佳 |
| rsvg-convert | ⚠️ 一般 | 系统包 | 没有 Python 环境,简单图形够用 |
| puppeteer | ✅✅ 最佳 | Node + 约 150MB Chromium | 浏览器生成的 SVG(D3、Mermaid)或像素级还原 |
详细的对比、批量脚本与 puppeteer 完整脚本见 SKILL.md → SVG → PNG Conversion。
---
使用方式
触发词
以下关键词会自动触发 Skill:
画图 / 帮我画 / 生成图 / 做个图 / 架构图 / 流程图 / 可视化一下 / 出图
generate diagram / draw diagram / create chart / visualize基本用法
画一张 RAG 流程图生成一张 Agentic Search 架构图指定风格
画一张微服务架构图,风格2(暗黑极客风)生成 Multi-Agent 协作图,玻璃态风格指定输出路径
生成 Mem0 架构图,输出到 ~/Desktop/画一张 Tool Call 流程图 --output /tmp/diagrams/---
场景示例集
AI/Agent 系统
画一张 Agentic RAG 和普通 RAG 的对比图,用 Notion 极简风→ 功能矩阵对比:检索策略、Agent 循环、工具调用、延迟、成本
生成一张 Mem0 记忆架构图,包含向量库、图数据库、KV 存储和记忆管理器→ 分泳道记忆架构:Input → Memory Manager → 存储层 → 检索输出
画一张 Multi-Agent 协作图:Orchestrator 调度 3 个 SubAgent(搜索/计算/代码执行),汇聚到 Aggregator→ Agent 架构,六边形节点 + 工具层 + 结果聚合
可视化一下 Tool Call 的执行流程:LLM → Tool Selector → Execution → Parser → 回到 LLM→ 含决策循环的流程图,展示工具调用的完整生命周期
画一张 Agent 的 5 种记忆类型图:感知记忆、工作记忆、情景记忆、语义记忆、程序记忆→ 思维导图或分层架构,从感官输入到程序技能的记忆层级
基础设施与云架构
帮我画一张微服务架构图:Client → API Gateway → [用户服务 / 订单服务 / 支付服务] → PostgreSQL + Redis→ 水平分层架构,每个服务集群一个泳道
生成一张数据管道图:Kafka 消费数据 → Spark 处理 → 写入 S3 → Athena 查询→ 数据流图,每条箭头标注数据类型(stream / batch / query)
画一张 Kubernetes 部署架构:Ingress → Service → [Pod × 3] → ConfigMap + PersistentVolume→ 架构图,Namespace 用虚线框,流量用实线箭头
API 与时序流程
画一张 OAuth2 授权码流程的序列图:用户 → 客户端 → 授权服务器 → 资源服务器→ 序列图,垂直生命线 + 激活框
帮我画一张 ChatGPT Plugin 的调用时序图→ 时序:User → ChatGPT → Plugin Manifest → API → 响应链
决策与流程图
画一张 AI 应用上线前的质检流程图:代码审查 → 安全扫描 → 性能测试 → 人工审核 → 发布→ 流程图,含菱形决策节点和并行分支
生成一张 RAG vs Fine-tuning vs Prompt Engineering 的功能对比图→ 功能矩阵,对比成本、延迟、准确率、灵活性
概念图与知识图谱
帮我可视化一下 LLM 应用的技术栈:从底层模型到 SDK 到应用框架到部署层→ 分层架构图或思维导图,从模型层到产品层
画一张 AI Agent 的核心能力地图:感知 / 记忆 / 推理 / 行动 / 学习→ 以"AI Agent"为中心的放射状思维导图,5 个核心能力分支
---
7 种风格
| # | 名称 | 背景色 | 字体 | 适用场景 |
|---|---|---|---|---|
| 1 | 扁平图标风 (默认) | #ffffff | Helvetica | 博客、幻灯片、技术文档 |
| 2 | 暗黑极客风 | #0f0f1a | SF Mono / Fira Code | GitHub README、开发者文章 |
| 3 | 工程蓝图风 | #0a1628 | Courier New | 架构设计文档、工程规范 |
| 4 | Notion 极简风 | #ffffff | system-ui | Notion、Confluence、内部 Wiki |
| 5 | 玻璃态卡片风 | #0d1117 渐变 | Inter | 产品官网、演讲 Keynote |
| 6 | Claude 官方风格 | #f8f6f3 | system-ui | Anthropic 风格图表,温暖专业美学 |
| 7 | OpenAI 官方风格 | #ffffff | system-ui | OpenAI 风格图表,简洁现代设计 |
每种风格在 references/ 目录下都有专属参考文件,包含精确的颜色 Token、SVG 模板和使用规范。 生成器现在还会直接消费风格相关结构字段,例如 containers、语义化 nodes[].kind、arrows[].flow 以及显式端口锚点,以便更稳定地逼近样图级布局质量。
几个很有用的增强字段:
style_overrides:在不复制整套 style 的前提下微调标题对齐或配色 tokencontainers[].header_prefix/containers[].header_text:用于 style 3 这种01 // EDGE的工程编号分区标题containers[].side_label:用于 style 6 这类左侧 Layer Labelwindow_controls、meta_left、meta_center、meta_right:用于终端 / 文档风格的顶部 chromeblueprint_title_block:用于 style 3 的蓝图标题信息框
风格选择指南
UML 图类型:
- 类图/组件图/包图:风格 1(扁平图标风)或风格 4(Notion 极简风)— 结构清晰,易于阅读
- 序列图/时序图:风格 2(暗黑极客风)— 等宽字体有助于对齐
- 状态机图/活动图:风格 3(工程蓝图风)— 工程美学适合流程图
- 用例图/交互图:风格 1(扁平图标风)— 彩色,易于理解
AI/Agent 图类型:
- RAG/Agentic Search:风格 2(暗黑极客风)或风格 5(玻璃态卡片风)— 科技感强
- 记忆架构:风格 3(工程蓝图风)— 强调分层存储结构
- Multi-Agent:风格 5(玻璃态卡片风)— 磨砂卡片区分 Agent 边界
文档类型:
- 内部文档:风格 4(Notion 极简风)— 极简,适合 Wiki
- 技术博客:风格 1(扁平图标风)— 彩色,吸引眼球
- GitHub README:风格 2(暗黑极客风)— 匹配暗色主题
- 演示文稿:风格 5(玻璃态卡片风)或风格 6(Claude 官方风格)— 精致专业
品牌特定:
- Anthropic/Claude 项目:风格 6(Claude 官方风格)— 温暖奶油色背景,品牌感强且克制
- OpenAI 项目:风格 7(OpenAI 官方风格)— 简洁白色,OpenAI 配色
---
支持的图类型
| 类型 | 描述 | 关键布局规则 |
|---|---|---|
| 架构图 | 服务、组件、云基础设施 | 水平分层,自上而下 |
| 数据流图 | 数据在系统中的流向 | 每条箭头标注数据类型 |
| 流程图 | 决策树、流程步骤 | 菱形 = 决策,自上而下 |
| Agent 架构图 | LLM + 工具 + 记忆 | 五层模型:输入/Agent/记忆/工具/输出 |
| 记忆架构图 | Mem0、MemGPT 风格 | 读/写路径分离,记忆层级分明 |
| 序列图 | API 调用链、时序交互 | 垂直生命线,水平消息箭头 |
| 对比图 | 功能矩阵、方案比较 | 列 = 系统,行 = 属性 |
| 思维导图 | 概念地图、发散思维 | 中心节点,贝塞尔曲线分支 |
UML 图类型支持(14 种)
| UML 类型 | 描述 | 推荐风格 |
|---|---|---|
| 类图 | 类、属性、方法、关系 | 风格 1, 4 |
| 组件图 | 软件组件和依赖关系 | 风格 1, 3 |
| 部署图 | 硬件节点和软件部署 | 风格 3 |
| 包图 | 包组织和依赖关系 | 风格 1, 4 |
| 复合结构图 | 类/组件的内部结构 | 风格 1, 3 |
| 对象图 | 对象实例和关系 | 风格 1, 4 |
| 用例图 | 参与者、用例、系统边界 | 风格 1 |
| 活动图 | 工作流、并行流程 | 风格 3 |
| 状态机图 | 状态转换和事件 | 风格 2, 3 |
| 序列图 | 时间顺序的消息交换 | 风格 2 |
| 通信图 | 对象交互和消息 | 风格 1, 2 |
| 时序图 | 状态随时间的变化 | 风格 2 |
| 交互概览图 | 高层交互流程 | 风格 1, 2 |
| ER 图 | 实体关系数据模型 | 风格 1, 3 |
---
AI/Agent 领域内建 Pattern
Skill 内置以下领域知识,可直接描述场景生成:
RAG Pipeline → Query → Embed → VectorSearch → Retrieve → LLM → Response
Agentic RAG → 在 RAG 基础上加入 Agent 循环 + 工具调用
Agentic Search → Query → Planner → [Search/Calc/Code] → Synthesizer
Mem0 记忆层 → Input → Memory Manager → [VectorDB + GraphDB] → Context
Agent 记忆类型 → 感知记忆 → 工作记忆 → 情景记忆 → 语义记忆 → 程序记忆
Multi-Agent → Orchestrator → [SubAgent×N] → Aggregator → Output
Tool Call 流程 → LLM → Tool Selector → Execution → Parser → LLM (循环)---
形状词汇表
形状在所有风格中保持一致的语义:
| 概念 | 形状 |
|---|---|
| 用户 / 人类 | 圆形 + 身体路径 |
| LLM / 模型 | 圆角矩形,双边框,⚡ |
| Agent / 编排器 | 六边形 |
| 短期记忆 | 虚线边框圆角矩形 |
| 长期记忆 | 实线圆柱体 |
| Vector Store | 带内环圆柱 |
| Graph DB | 三圆簇 |
| 工具 / 函数 | 带 ⚙ 的矩形 |
| API / 网关 | 六边形(单边框) |
| 消息队列 / 流 | 横向管道 |
| 文档 / 文件 | 折角矩形 |
| 浏览器 / UI | 带三点标题栏的矩形 |
| 决策节点 | 菱形 |
| 外部服务 | 虚线边框矩形 |
---
箭头语义
| 流类型 | 线宽 | 虚线 | 含义 |
|---|---|---|---|
| 主数据流 | 2px 实线 | — | 主要请求/响应路径 |
| 控制 / 触发 | 1.5px 实线 | — | 系统 A 触发 B |
| 记忆读取 | 1.5px 实线 | — | 从存储检索 |
| 记忆写入 | 1.5px | 5,3 | 写入/存储操作 |
| 异步 / 事件 | 1.5px | 4,2 | 非阻塞 |
| 反馈 / 循环 | 1.5px 曲线 | — | 迭代推理 |
---
文件结构
fireworks-tech-graph/
├── SKILL.md # 主 Skill 文件 — 图类型、布局规则、形状词汇
├── README.md # 英文文档
├── README.zh.md # 本文件(中文)
├── references/
│ ├── style-1-flat-icon.md # 白底风格 — 彩色强调色
│ ├── style-2-dark-terminal.md # 暗黑风格 — Neon 配色,等宽字体
│ ├── style-3-blueprint.md # 蓝图风格 — 网格底纹,青色线条
│ ├── style-4-notion-clean.md # 极简风格 — 白底,单色箭头
│ ├── style-5-glassmorphism.md # 玻璃态风格 — 深色渐变,磨砂卡片
│ ├── style-6-claude-official.md # Claude 官方风格 — 温暖奶油色,Anthropic 品牌
│ ├── style-7-openai.md # OpenAI 官方风格 — 简洁白色,OpenAI 品牌配色
│ └── icons.md # 40+ 产品图标 + 语义形状模板
├── agents/
│ └── openai.yaml # 兼容运行时使用的 Agent 元数据
├── fixtures/
│ ├── mem0-style1.json # Style 1 回归样例
│ ├── tool-call-style2.json # Style 2 回归样例
│ └── ... # 各风格样图级 fixture
├── scripts/
│ ├── generate-diagram.sh # SVG 校验与 PNG 导出
│ ├── generate-from-template.py # 基于模板生成 SVG 起始文件
│ ├── validate-svg.sh # SVG 语法校验
│ └── test-all-styles.sh # 批量测试所有风格
├── assets/
│ └── samples/ # 示例图 PNG
├── templates/
│ ├── architecture.svg # 架构图模板
│ ├── data-flow.svg # 数据流模板
│ └── ... # 其他图类型模板
└── agentloop-core.svg # 仓库自带示例 SVG---
产品图标覆盖范围
AI/ML 模型: OpenAI、Anthropic/Claude、Google Gemini、Meta LLaMA、Mistral、Cohere、Groq、Hugging Face
AI 框架: Mem0、LangChain、LlamaIndex、LangGraph、CrewAI、AutoGen、DSPy、Haystack
向量数据库: Pinecone、Weaviate、Qdrant、Chroma、Milvus、pgvector、Faiss
关系型/NoSQL 数据库: PostgreSQL、MySQL、MongoDB、Redis、Elasticsearch、Neo4j、Cassandra
消息队列: Kafka、RabbitMQ、NATS、Pulsar
云服务 & 基础设施: AWS、GCP、Azure、Cloudflare、Vercel、Docker、Kubernetes
可观测性: Grafana、Prometheus、Datadog、LangSmith、Langfuse、Arize
---
License
MIT © 2025 fireworks-tech-graph contributors
Icon Reference
Rules for Renderer Compatibility (cairosvg / rsvg-convert)
Never use @import url() for icon fonts — neither cairosvg nor rsvg-convert fetches external resources. Always use inline SVG <path>, <circle>, <rect>, <text> combinations. Font fallback: embed font-family in <style> using system fonts only.
---
Generic Semantic Shapes (No product — use these first)
Database / Vector Store (cylinder)
<!-- cx=center-x, top=top-y, w=width, h=height -->
<!-- Typical: w=80, h=70 -->
<ellipse cx="cx" cy="top" rx="w/2" ry="w/6" fill="fill" stroke="stroke" stroke-width="1.5"/>
<rect x="cx-w/2" y="top" width="w" height="h" fill="fill" stroke="none"/>
<line x1="cx-w/2" y1="top" x2="cx-w/2" y2="top+h" stroke="stroke" stroke-width="1.5"/>
<line x1="cx+w/2" y1="top" x2="cx+w/2" y2="top+h" stroke="stroke" stroke-width="1.5"/>
<!-- Optional inner rings for Vector Store -->
<ellipse cx="cx" cy="top+h*0.33" rx="w/2" ry="w/6" fill="none" stroke="stroke" stroke-width="0.7" opacity="0.5"/>
<ellipse cx="cx" cy="top+h*0.66" rx="w/2" ry="w/6" fill="none" stroke="stroke" stroke-width="0.7" opacity="0.5"/>
<ellipse cx="cx" cy="top+h" rx="w/2" ry="w/6" fill="fill-dark" stroke="stroke" stroke-width="1.5"/>LLM / Model Node (rounded rect with spark)
<!-- Rounded rect with double border = "intelligent" signal -->
<rect x="x" y="y" width="w" height="h" rx="10" fill="fill" stroke="stroke-outer" stroke-width="2.5"/>
<rect x="x+3" y="y+3" width="w-6" height="h-6" rx="8" fill="none" stroke="stroke-inner" stroke-width="0.8" opacity="0.5"/>
<!-- Spark icon (⚡) as text or small lightning path -->
<text x="cx" y="cy-6" text-anchor="middle" font-size="14">⚡</text>
<text x="cx" y="cy+10" text-anchor="middle" fill="text-color" font-size="13" font-weight="600">GPT-4o</text>Agent / Orchestrator (hexagon)
<!-- r = circumradius, cx/cy = center -->
<!-- For r=36: points at 36,0 18,31.2 -18,31.2 -36,0 -18,-31.2 18,-31.2 -->
<polygon points="cx,cy-r cx+r*0.866,cy-r*0.5 cx+r*0.866,cy+r*0.5 cx,cy+r cx-r*0.866,cy+r*0.5 cx-r*0.866,cy-r*0.5"
fill="fill" stroke="stroke" stroke-width="1.5"/>
<text x="cx" y="cy+5" text-anchor="middle" fill="text" font-size="12" font-weight="600">Agent</text>Memory Node (short-term, dashed border)
<rect x="x" y="y" width="w" height="h" rx="8"
fill="fill" stroke="stroke" stroke-width="1.5" stroke-dasharray="6,3"/>
<text x="cx" y="cy-6" text-anchor="middle" fill="text" font-size="10" opacity="0.7">MEMORY</text>
<text x="cx" y="cy+8" text-anchor="middle" fill="text" font-size="13">Short-term</text>Tool / Function Call (rect with gear symbol)
<rect x="x" y="y" width="w" height="h" rx="6" fill="fill" stroke="stroke" stroke-width="1.5"/>
<!-- Gear: simplified as ⚙ unicode or small circle with lines -->
<text x="cx" y="cy-4" text-anchor="middle" font-size="16">⚙</text>
<text x="cx" y="cy+12" text-anchor="middle" fill="text" font-size="12">Tool Name</text>Queue / Stream (horizontal pipe)
<!-- Pipe tube: left cap ellipse + body + right cap ellipse -->
<ellipse cx="x1" cy="cy" rx="ry*0.6" ry="ry" fill="fill-dark" stroke="stroke" stroke-width="1.5"/>
<rect x="x1" y="cy-ry" width="x2-x1" height="ry*2" fill="fill" stroke="none"/>
<line x1="x1" y1="cy-ry" x2="x2" y2="cy-ry" stroke="stroke" stroke-width="1.5"/>
<line x1="x1" y1="cy+ry" x2="x2" y2="cy+ry" stroke="stroke" stroke-width="1.5"/>
<ellipse cx="x2" cy="cy" rx="ry*0.6" ry="ry" fill="fill-light" stroke="stroke" stroke-width="1.5"/>User / Human Actor
<!-- Head -->
<circle cx="cx" cy="cy-18" r="10" fill="fill" stroke="stroke" stroke-width="1.2"/>
<!-- Body / shoulders -->
<path d="M cx-14,cy+16 Q cx-14,cy-4 cx,cy-4 Q cx+14,cy-4 cx+14,cy+16"
fill="fill" stroke="stroke" stroke-width="1.2"/>
<text x="cx" y="cy+30" text-anchor="middle" fill="text" font-size="12">User</text>API Gateway (hexagon, single border, smaller)
<polygon points="cx,cy-28 cx+24,cy-14 cx+24,cy+14 cx,cy+28 cx-24,cy+14 cx-24,cy-14"
fill="fill" stroke="stroke" stroke-width="1.5"/>
<text x="cx" y="cy+5" text-anchor="middle" fill="text" font-size="11">API</text>Browser / Web Client
<rect x="x" y="y" width="w" height="h" rx="6" fill="fill" stroke="stroke" stroke-width="1.5"/>
<!-- Title bar -->
<rect x="x" y="y" width="w" height="20" rx="6" fill="fill-dark" stroke="none"/>
<rect x="x" y="y+14" width="w" height="6" fill="fill-dark"/>
<!-- Traffic light dots -->
<circle cx="x+12" cy="y+10" r="4" fill="#ef4444" opacity="0.8"/>
<circle cx="x+24" cy="y+10" r="4" fill="#f59e0b" opacity="0.8"/>
<circle cx="x+36" cy="y+10" r="4" fill="#10b981" opacity="0.8"/>Document / File
<!-- Folded corner rectangle -->
<path d="M x,y L x+w-12,y L x+w,y+12 L x+w,y+h L x,y+h Z"
fill="fill" stroke="stroke" stroke-width="1.5"/>
<!-- Fold -->
<path d="M x+w-12,y L x+w-12,y+12 L x+w,y+12" fill="fill-dark" stroke="stroke" stroke-width="1"/>
<!-- Lines inside -->
<line x1="x+8" y1="y+h*0.45" x2="x+w-8" y2="y+h*0.45" stroke="stroke" stroke-width="1" opacity="0.5"/>
<line x1="x+8" y1="y+h*0.6" x2="x+w-8" y2="y+h*0.6" stroke="stroke" stroke-width="1" opacity="0.5"/>
<line x1="x+8" y1="y+h*0.75" x2="x+w-16" y2="y+h*0.75" stroke="stroke" stroke-width="1" opacity="0.5"/>Decision Diamond (flowcharts)
<!-- cx/cy = center, hw = half-width, hh = half-height -->
<polygon points="cx,cy-hh cx+hw,cy cx,cy+hh cx-hw,cy"
fill="fill" stroke="stroke" stroke-width="1.5"/>
<text x="cx" y="cy+5" text-anchor="middle" fill="text" font-size="12">Condition?</text>Swim Lane Container
<!-- Background band for a layer/group -->
<rect x="x" y="y" width="w" height="h" rx="6"
fill="fill" fill-opacity="0.04" stroke="stroke" stroke-width="1" stroke-dasharray="6,4"/>
<!-- Layer label top-left -->
<text x="x+12" y="y+16" fill="label-color" font-size="10" font-weight="600" letter-spacing="0.06em">LAYER NAME</text>---
Product Icons (Brand Colors + Inline SVG)
All use circle badge + text abbreviation pattern. Replace cx, cy with actual coordinates.
AI / ML Products
| Product | Color | Badge Text |
|---|---|---|
| OpenAI / ChatGPT | #10A37F | OAI |
| Anthropic / Claude | #D97757 | Claude |
| Google Gemini | #4285F4 | Gemini |
| Meta LLaMA | #0467DF | LLaMA |
| Mistral | #FF7000 | Mistral |
| Cohere | #39594D | Cohere |
| Groq | #F55036 | Groq |
| Together AI | #6366F1 | Together |
| Replicate | #191919 | Rep |
| Hugging Face | #FFD21E (text dark) | HF |
Template:
<circle cx="cx" cy="cy" r="22" fill="BRAND_COLOR"/>
<text x="cx" y="cy+5" text-anchor="middle" fill="white"
font-size="10" font-weight="700" font-family="Helvetica">BADGE_TEXT</text>
<!-- Optional: outer ring for "AI" products -->
<circle cx="cx" cy="cy" r="24" fill="none" stroke="BRAND_COLOR" stroke-width="1" opacity="0.4"/>AI Memory & RAG Products
| Product | Color | Badge |
|---|---|---|
| Mem0 | #6366F1 | mem0 |
| LangChain | #1C3C3C | 🦜 or LC |
| LlamaIndex | #8B5CF6 | LI |
| LangGraph | #1C3C3C | LG |
| CrewAI | #EF4444 | Crew |
| AutoGen | #0078D4 | AG |
| Haystack | #FF6D00 | 🌾 or HS |
| DSPy | #7C3AED | DSPy |
Vector Databases
| Product | Color | Badge |
|---|---|---|
| Pinecone | #1C1C2E + green | Pine |
| Weaviate | #FA0050 | Wea |
| Qdrant | #DC244C | Qdrant |
| Chroma | #FF6B35 | Chr |
| Milvus | #00A1EA | Milvus |
| pgvector | #336791 | pgv |
| Faiss | #0467DF | FAISS |
Vector DB template (cylinder + badge):
<!-- Cylinder shape -->
<ellipse cx="cx" cy="top" rx="40" ry="12" fill="FILL" stroke="STROKE" stroke-width="1.5"/>
<rect x="cx-40" y="top" width="80" height="50" fill="FILL" stroke="none"/>
<line x1="cx-40" y1="top" x2="cx-40" y2="top+50" stroke="STROKE" stroke-width="1.5"/>
<line x1="cx+40" y1="top" x2="cx+40" y2="top+50" stroke="STROKE" stroke-width="1.5"/>
<ellipse cx="cx" cy="top+50" rx="40" ry="12" fill="FILL_DARK" stroke="STROKE" stroke-width="1.5"/>
<!-- Product name -->
<text x="cx" y="top+30" text-anchor="middle" fill="white"
font-size="11" font-weight="700">Pinecone</text>Classic Databases & Storage
| Product | Color |
|---|---|
| PostgreSQL | #336791 |
| MySQL | #4479A1 |
| MongoDB | #47A248 |
| Redis | #DC382D |
| Elasticsearch | #005571 |
| Cassandra | #1287B1 |
| Neo4j | #008CC1 |
| SQLite | #003B57 |
Message Queues & Streaming
| Product | Color |
|---|---|
| Apache Kafka | #231F20 |
| RabbitMQ | #FF6600 |
| AWS SQS | #FF9900 |
| NATS | #27AAE1 |
| Pulsar | #188FFF |
Cloud & Infra
| Product | Color |
|---|---|
| AWS | #FF9900 |
| GCP | #4285F4 |
| Azure | #0089D6 |
| Cloudflare | #F48120 |
| Vercel | #000000 |
| Docker | #2496ED |
| Kubernetes | #326CE5 |
| Terraform | #7B42BC |
| Nginx | #009639 |
| FastAPI | #009688 |
Observability
| Product | Color |
|---|---|
| Grafana | #F46800 |
| Prometheus | #E6522C |
| Datadog | #632CA6 |
| LangSmith | #1C3C3C |
| Langfuse | #6366F1 |
| Arize | #6B48FF |
---
Azure Service Icons
Azure brand colour: #0089D6 (top tile / outer ring). Service-specific accents come from Microsoft's Azure icon set; use them as the inner badge fill so a glance still tells you "this is Azure".
Template (Azure tile):
<!-- Azure tile: outer rounded square in Azure blue, inner badge for the service. -->
<rect x="cx-22" y="cy-22" width="44" height="44" rx="6"
fill="#0089D6" stroke="none"/>
<rect x="cx-19" y="cy-19" width="38" height="38" rx="4"
fill="SERVICE_COLOR" stroke="none"/>
<text x="cx" y="cy+5" text-anchor="middle" fill="white"
font-size="9" font-weight="700" font-family="Helvetica">BADGE</text>Azure Compute
| Product | Service Color | Badge |
|---|---|---|
| Azure Functions | #0062AD | Func |
| Azure App Service | #0072C6 | App |
| Azure Container Apps | #3F8624 | ACA |
| Azure Container Instances | #0078D4 | ACI |
| Azure Kubernetes Service (AKS) | #326CE5 | AKS |
| Azure Virtual Machines | #0078D4 | VM |
| Azure Batch | #0072C6 | Batch |
| Azure Spring Apps | #6DB33F | Spring |
Azure Data & Analytics
| Product | Service Color | Badge |
|---|---|---|
| Azure SQL Database | #0066A1 | SQL |
| Azure Cosmos DB | #3D7AB3 | Cosmos |
| Azure Database for PostgreSQL | #336791 | pg |
| Azure Database for MySQL | #4479A1 | MySQL |
| Azure Synapse Analytics | #0078D4 | Syn |
| Azure Data Factory | #0078D4 | ADF |
| Azure Databricks | #FF3621 | Bricks |
| Azure Stream Analytics | #0072C6 | Stream |
| Azure Data Explorer (Kusto) | #1E5180 | Kusto |
| Azure Cache for Redis | #DC382D | Redis |
Azure Storage
| Product | Service Color | Badge |
|---|---|---|
| Azure Blob Storage | #0078D4 | Blob |
| Azure Queue Storage | #0078D4 | Queue |
| Azure Table Storage | #0078D4 | Table |
| Azure Files | #0078D4 | Files |
| Azure Data Lake Storage Gen2 | #0078D4 | Lake |
Azure AI
| Product | Service Color | Badge |
|---|---|---|
| Azure OpenAI Service | #10A37F | AOAI |
| Azure AI Search (Cognitive Search) | #0078D4 | AISrch |
| Azure AI Foundry | #742774 | Foundry |
| Azure Machine Learning | #0078D4 | AML |
| Azure AI Content Safety | #107C10 | Safety |
| Azure Speech / Translator | #0078D4 | Speech |
Azure Messaging & Eventing
| Product | Service Color | Badge |
|---|---|---|
| Azure Service Bus | #0078D4 | SB |
| Azure Event Grid | #0078D4 | Grid |
| Azure Event Hubs | #0078D4 | Hubs |
| Azure Notification Hubs | #0078D4 | Notif |
| Azure SignalR Service | #0078D4 | SignalR |
Azure Networking & Edge
| Product | Service Color | Badge |
|---|---|---|
| Azure Front Door | #0078D4 | AFD |
| Azure Application Gateway | #0078D4 | AppGW |
| Azure Load Balancer | #0078D4 | LB |
| Azure API Management | #1FBA9F | APIM |
| Azure Virtual Network | #0078D4 | VNet |
| Azure Private Link | #0078D4 | PL |
| Azure CDN | #0078D4 | CDN |
| Azure DNS | #0078D4 | DNS |
Azure Identity & Security
| Product | Service Color | Badge |
|---|---|---|
| Microsoft Entra ID (Azure AD) | #0072C6 | Entra |
| Azure Key Vault | #FFB900 | KV |
| Azure Sentinel | #0072C6 | Sentinel |
| Microsoft Defender for Cloud | #0078D4 | Defender |
Azure DevOps & Operations
| Product | Service Color | Badge |
|---|---|---|
| Azure DevOps Pipelines | #0078D4 | Pipelines |
| GitHub Actions (Azure target) | #181717 | GHA |
| Azure Monitor | #0078D4 | Monitor |
| Application Insights | #0072C6 | AppI |
| Azure Log Analytics | #0078D4 | Logs |
Azure-specific shapes
For diagrams that need a recognisable "Azure" visual without a service badge — e.g. a region container or a subscription boundary — use a dashed Azure-blue outline:
<!-- Azure region/subscription container -->
<rect x="x" y="y" width="w" height="h" rx="8"
fill="#0089D6" fill-opacity="0.04"
stroke="#0089D6" stroke-width="1.2" stroke-dasharray="6,4"/>
<text x="x+12" y="y+16" fill="#0089D6" font-size="10"
font-weight="700" letter-spacing="0.06em">AZURE • REGION NAME</text>---
Icon Sizing Guide
| Context | Recommended Size | Padding |
|---|---|---|
| Node badge (inside box) | 28×28px circle | 10px |
| Standalone icon node | 40×40px | 16px |
| Hero / central node | 56×56px | 20px |
| Small inline indicator | 16×16px | 6px |
Arrow Marker Templates
<defs>
<!-- Standard filled arrow -->
<marker id="arrow-COLORNAME" markerWidth="10" markerHeight="7"
refX="9" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="COLOR"/>
</marker>
<!-- Open arrow (outline only) -->
<marker id="arrow-open" markerWidth="10" markerHeight="8"
refX="9" refY="4" orient="auto">
<path d="M 0 0 L 10 4 L 0 8" fill="none" stroke="COLOR" stroke-width="1.5"/>
</marker>
<!-- Circle dot (for association lines) -->
<marker id="dot" markerWidth="8" markerHeight="8"
refX="4" refY="4" orient="auto">
<circle cx="4" cy="4" r="3" fill="COLOR"/>
</marker>
</defs>Related skills
How it compares
Pick fireworks-tech-graph over Mermaid-only skills when the deliverable must be polished SVG and PNG files suitable for design docs and presentations.
FAQ
What are the recommended SVG-to-PNG conversion tools?
cairosvg is recommended (pip install cairosvg), with rsvg-convert as system alternative and puppeteer for pixel-perfect browser-rendered output.
How many diagram types are supported?
Fireworks Tech Graph supports 14+ diagram types including Architecture, Data Flow, Flowchart, Sequence, UML (Class, State Machine, Use Case), ER, and Network Topology.
Is Fireworks Tech Graph safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.