Memory
automateyournetwork/netclaw
NetClaw's native persistent memory (spec 033) — structured facts with temporal validity, semantic search across past sessions, decision logging, and entity relationships, backed by SQLite + ChromaDB…
A skill your agent uses when the user wants to create any technical diagram - architecture, data flow, flowchart, sequence, agent/memory, or concept map - and export as SVG+PNG.
$ npx skills add ninehills/skills --skill fireworks-tech-graph -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ninehills/skills fireworks-tech-graph --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ninehills/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/fireworks-tech-graph .claude/skills/fireworks-tech-graph && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fireworks-tech-graph" agent skill from https://github.com/ninehills/skills/tree/main/fireworks-tech-graph into .claude/skills/fireworks-tech-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fireworks-tech-graph", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ninehills/skills/tree/main/fireworks-tech-graphType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ninehills/skills --skill fireworks-tech-graph -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ninehills/skills fireworks-tech-graph --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ninehills/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/fireworks-tech-graph .agents/skills/fireworks-tech-graph && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fireworks-tech-graph" agent skill from https://github.com/ninehills/skills/tree/main/fireworks-tech-graph into .agents/skills/fireworks-tech-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fireworks-tech-graph", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ninehills/skills --skill fireworks-tech-graph -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ninehills/skills fireworks-tech-graph --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ninehills/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/fireworks-tech-graph .cursor/skills/fireworks-tech-graph && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fireworks-tech-graph" agent skill from https://github.com/ninehills/skills/tree/main/fireworks-tech-graph into .cursor/skills/fireworks-tech-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fireworks-tech-graph", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ninehills/skills.git --path fireworks-tech-graph--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ninehills/skills --skill fireworks-tech-graph -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ninehills/skills fireworks-tech-graph --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ninehills/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/fireworks-tech-graph .gemini/skills/fireworks-tech-graph && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fireworks-tech-graph" agent skill from https://github.com/ninehills/skills/tree/main/fireworks-tech-graph into .gemini/skills/fireworks-tech-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fireworks-tech-graph", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ninehills/skills fireworks-tech-graphInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ninehills/skills --skill fireworks-tech-graph -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ninehills/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/fireworks-tech-graph .github/skills/fireworks-tech-graph && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fireworks-tech-graph" agent skill from https://github.com/ninehills/skills/tree/main/fireworks-tech-graph into .github/skills/fireworks-tech-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fireworks-tech-graph", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ninehills/skills --skill fireworks-tech-graph -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ninehills/skills fireworks-tech-graph --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ninehills/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/fireworks-tech-graph .opencode/skills/fireworks-tech-graph && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fireworks-tech-graph" agent skill from https://github.com/ninehills/skills/tree/main/fireworks-tech-graph into .opencode/skills/fireworks-tech-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fireworks-tech-graph", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fireworks-tech-graphA skill your agent uses when the user wants to create any technical diagram - architecture, data flow, flowchart, sequence, agent/memory, or concept map - and export as SVG+PNG.
Fireworks Tech Graph is an agent skill from ninehills/skills. Use when the user wants to create any technical diagram - architecture, data flow, flowchart, sequence, agent/memory, or concept map - and export as SVG+PNG. Trigger on: "画图" "帮我画" "生成图" "做个图" "架构图" "流程图" "可视化一下" "出图" "generate diagram" "draw diagram" "visualize" or any system/flow description the user wants illustrated.
Its SKILL.md is about 8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 46 other files, including scripts and reference files (for example `README.md`, `README.zh.md` and `agents/openai.yaml`).
It sits in Development, covering Diagrams, Knowledge graphs and Agent memory. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f3e82a7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
python3npxnpmnodepipFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
npmjs.comw3.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fireworks Tech Graph loads about 8k tokens when it runs, and up to ~24k if it reads all its reference files. Until then it costs about 86 tokens; SKILL.md has 3,564 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from ninehills/skills at commit f3e82a7, republished under its MIT licence (© ninehills). 3,564 words, ~8,046 tokens.
.claude/skills/fireworks-tech-graph/SKILL.md (or your agent's skills folder). This skill also uses 43 other files; get the full folder from GitHub.Generate production-quality SVG technical diagrams exported as PNG via cairosvg (recommended), rsvg-convert, or puppeteer.
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 -yFour helper scripts in scripts/ directory provide stable SVG generation and validation:
generate-diagram.sh - Validate SVG + export PNG./scripts/generate-diagram.sh -t architecture -s 1 -o ./output/arch.svg./scripts/generate-diagram.sh -t architecture -s 1 -o ./output/arch.svggenerate-from-template.py - Create starter SVG from templatepython3 ./scripts/generate-from-template.py architecture ./output/arch.svg '{"title":"My Diagram","nodes":[],"arrows":[]}'validate-svg.sh - Validate SVG syntax./scripts/validate-svg.sh <svg-file>test-all-styles.sh - Batch test all styles./scripts/test-all-styles.shWhen to use scripts:
When to generate SVG directly:
references/style-1-flat-icon.md unless user specifies another; load the matching references/style-N.md for exact color tokens and SVG patternsreferences/icons.md for known productspython3 -c "import xml.etree.ElementTree as ET; ET.parse('file.svg')" to check XML syntaxcairosvg (recommended). See SVG → PNG Conversion section below for full method comparisonNodes = services/components. Group into horizontal layers (top→bottom or left→right).
<rect> dashed containers to group related services in the same layer0 0 960 600 standard, 0 0 960 800 for tall stacksEmphasizes what data moves where. Focus on data transformation.
stroke-width: 2.5) for primary data pathsSequential decision/process steps.
Shows how an AI agent reasons, uses tools, and manages memory. Key conceptual layers to always consider:
Specialized agent diagram focused on memory operations.
store(), retrieve(), forget(), consolidate()Time-ordered message exchanges between participants.
<rect> loop/alt frames with label in top-left cornerSide-by-side comparison of approaches, systems, or components.
#dcfce7) + ✓ checkmark; unsupported: #f9fafb fill#f9fafb / #ffffff) for readabilityHorizontal time axis showing durations, phases, and milestones.
0 0 960 400 typical; wider for many time periods: 0 0 1200 400Radial layout from central concept.
cx=480, cy=280<path> with cubic bezier for branches, not straight linesStatic structure showing classes, attributes, methods, and relationships.
+ public, - private, # protected)<<interface>> stereotype above name, or circle/lollipop notation<<enumeration>> stereotype, values in bottom0 0 960 600 standard; 0 0 960 800 for deep hierarchiesSystem functionality from user perspective.
<<include>> from base to included use case<<extend>> from extension to base use case0 0 960 600 standardLifecycle states and transitions of an entity.
entry/ action, exit/ action, do/ activity[condition]event [guard] / action/0 0 960 600 standardDatabase schema and data relationships.
1, N, 0..1, 0..*, 1..*0 0 960 600 standard; wider 0 0 1200 600 for many entitiesPhysical or logical network infrastructure.
0 0 960 600 standardFull 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 |
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 |
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.
Spacing:
Arrow Labels (CRITICAL):
<rect fill="canvas_bg" opacity="0.95"/> only when the offset label still crosses another visual element (another arrow, a node edge, etc.)Arrow Routing:
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:
source / target pairsource_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 pathgenerate-from-template.py with the updated JSON and validate with validate-svg.shExample — 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:
Validation Checklist (run before finalizing):
text.length × 7px ≤ shape_width - 16px)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)validate-svg.sh automated checks)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 badge0 0 960 600 default; 0 0 960 800 tall; 0 0 1200 600 wide<style>font-family: ...</style> — no external @import (cairosvg / rsvg-convert cannot fetch external URLs)<defs>: arrow markers, gradients, filters, clip paths<marker> with markerEnd, sized markerWidth="10" markerHeight="7"<feDropShadow> in <filter>, apply sparingly (key nodes only)M x1,y1 C cx1,cy1 cx2,cy2 x2,y2 cubic bezier for loops/feedback arrows<clipPath> if text might overflow a node boxMANDATORY: 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):
If ANY answer is NO: STOP. Do NOT call the tool. Prepare the content first.
Error Recovery Protocol:
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:
source / target node ids in arrow JSON so the generator can snap to node edgesx1,y1,x2,y2 as hints or fallback coordinates, not the main routing primitiveCommon 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</svg> at endfilter near 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 least max(20% of element size, shadow blur radius × 3) away from viewBox edges, or omit the filter../[derived-name].svg and ./[derived-name].png in current directory--output /path/ or 输出到 /path/| 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) |
# 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=2produces 2x resolution PNG, ideal for high-DPI screens and embedded docs.
# 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"; donenpm 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>
rsvg-convert renders SVGs containing <foreignObject>, CSS filter, 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 casescairosvg may 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--window-size=W,H is not the drawable area — even in --headless=new mode, 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 past x ≈ 0.84 × W or y ≈ 0.84 × H is 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,800 then 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.cairosvg (pip install once, one-line conversion, good fidelity)rsvg-convert (acceptable for simple flat-color diagrams)puppeteer| # | 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.
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)
© ninehills, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 43 other files (scripts, references) in fireworks-tech-graph of ninehills/skills.
Open the folder on GitHubat commit f3e82a7
We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in ninehills/skills, which our catalogue first saw on October 7, 2026.
Fireworks Tech Graph next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fireworks Tech Graph this skillninehills/skills | 280 | 2 repos | ~8k | Automated safety check: Pass | MIT | |
| Memoryautomateyournetwork/netclaw | 676 | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Fireworks Tech GraphCitrus-bit/Anaxa | 120 | — | ~5.4k | Automated safety check: Pass | MIT | |
| CodeScope Codebase Graph AnalysisQwenLM/qwen-code | 28k | 1 repos | ~9.3k | Automated safety check: Pass | Apache-2.0 | |
| Scholar Conceptualjoshzyj/open-scholar-skill | 168 | — | ~5.3k | Automated safety check: Pass | Custom licence | |
| Git Notes Memorysundial-org/awesome-openclaw-skills | 663 | — | ~2.7k | Automated safety check: Pass | None |
automateyournetwork/netclaw
NetClaw's native persistent memory (spec 033) — structured facts with temporal validity, semantic search across past sessions, decision logging, and entity relationships, backed by SQLite + ChromaDB…
Citrus-bit/Anaxa
A skill your agent uses when the user wants to create any technical diagram - architecture, data flow, flowchart, sequence, agent/memory, or concept map - and export as SVG+PNG.
QwenLM/qwen-code
Answers questions about code structure, history, bugs and PR risk using a CodeScope knowledge graph and semantic index built from the repository.
joshzyj/open-scholar-skill
Build original theoretical frameworks and produce publication-quality conceptual diagrams for social science research.
sundial-org/awesome-openclaw-skills
Git-Notes-Based knowledge graph memory system. An agent skill from sundial-org/awesome-openclaw-skills.
brycewang-stanford/Awesome-Journal-Skills
A skill your agent uses when building the figures and typologies of a Sociological Theory (ST) manuscript — mechanism diagrams, process models, 2x2 typologies, and concept maps that carry…
ninehills/skills
Market prediction skill using Kronos. An agent skill from ninehills/skills.
ninehills/skills
Track finance investment signal evolution and update logic based on new finance market information.
ninehills/skills
Analyze finance text sentiment using FinBERT or LLM. An agent skill from ninehills/skills.
ninehills/skills
把图片、截图、海报、PPT 页面截图、HTML 或 SVG 设计稿转换成可编辑 PPTX 的 Codex skill. An agent skill from ninehills/skills.
ninehills/skills
把一张或多张图片整理成 PSD 图层文件的创作与转换 skill。当用户需要 image2psd、图片转 PSD、 多张图片拼成 PSD、海报/设计稿拆成多个图层、白底转透明、颜色聚类拆层、把 Codex/AI 生图结果拆成元素图再合成 PSD、 或希望输出 layered PSD、可在 Photoshop/Photopea 中编辑的分层栅格文件时,应该使用此 skill。
ninehills/skills
Reads URLs and PDFs by fetching source content, defaulting to concise summaries for plain read requests and clean Markdown when asked to convert, save, quote, cite, or feed downstream work.
Categories
A skill your agent uses when the user wants to create any technical diagram - architecture, data flow, flowchart, sequence, agent/memory, or concept map - and export as SVG+PNG. Fireworks Tech Graph is an agent skill from ninehills/skills. Use when the user wants to create any technical diagram - architecture, data flow, flowchart, sequence, agent/memory, or concept map - and export as SVG+PNG.
Fireworks Tech Graph fits situations like: the user wants to create any technical diagram - architecture; concept map - and export as SVG+PNG; : 画图 帮我画 生成图 做个图 架构图 流程图 可视化一下 出图 generate diagram draw diagram visualize; any system/flow description the user wants illustrated.
Run `npx skills add ninehills/skills --skill fireworks-tech-graph -a claude-code`. Or copy the skill folder (fireworks-tech-graph in ninehills/skills) into .claude/skills/fireworks-tech-graph in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ninehills/skills --skill fireworks-tech-graph -a codex`. Or copy the skill folder (fireworks-tech-graph in ninehills/skills) into .agents/skills/fireworks-tech-graph in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ninehills/skills --skill fireworks-tech-graph -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fireworks-tech-graph, .gemini/skills/fireworks-tech-graph, .github/skills/fireworks-tech-graph and .opencode/skills/fireworks-tech-graph in your project.
Going by SKILL.md and its folder, Fireworks Tech Graph needs the command-line tools its instructions call (python3, npx, npm, node and pip). Our summary lists: Python 3; Node.js.
SKILL.md names 2 domains. In commands or code: npmjs.com and w3.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Fireworks Tech Graph is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 8k tokens (SKILL.md is roughly 32k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 16k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Fireworks Tech Graph: Memory (automateyournetwork/netclaw, 676 stars), Fireworks Tech Graph (Citrus-bit/Anaxa, 120 stars), CodeScope Codebase Graph Analysis (QwenLM/qwen-code, 28k stars) and Scholar Conceptual (joshzyj/open-scholar-skill, 168 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ninehills (a GitHub user) maintains it in ninehills/skills, which has 280 GitHub stars. The repository holds 38 skills in this directory. The repository was last updated on June 22, 2026.
Source: ninehills/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.