Create branded visual diagrams in various formats with customizable styles.
Automate repetitive workflows and reduce manual effort
Example: Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example: Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example: Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
Time estimate: 15-45 minutes depending on use case complexity
Prerequisites
Submit your Claude Code skill and start earning
epx add cathrynlavery/diagram-design --skill diagram-designCompatible with
Supported agents
| name | diagram-design |
| description | Create branded architecture, IT current-state, flowchart, sequence, state machine, ER/data model, timeline, swimlane, quadrant, radar/spider, loop/flywheel, nested, tree, org chart, layer stack, Venn, pyramid/funnel, bar, line, Gantt and scatter charts, high-level, process, medallion, data flow, DP integration, or DP security matrix diagrams as standalone HTML/SVG/PNG. Redraw .drawio/.drawio.png/.drawio.svg or Mermaid .mmd sources at a chosen size/detail; onboard brand tokens from a website; add semantic patterns, callouts, accessible motion, or sketchy/hand-drawn styling. |
| license | MIT |
| metadata | version: "2.3" |
Create visual diagrams as self-contained HTML files with inline SVG and CSS, following an opinionated editorial design system.
Twenty-seven visual types. Semantic patterns describe behavior independently; type references describe layout. Details load from references/ only when selected.
Before generating your first diagram in a new project, verify the style guide has been customized.
Don't silently ship default-skinned diagrams into a branded project.
Open references/style-guide.md and check the default tokens. If they're still the shipped defaults (paper #f5f5f5, ink #2d3142, accent #eb6c36 atomic-tangerine), pause and ask the user:
"This is your first Schematic in this project. The style guide is still at the default (neutral white-smoke + atomic-tangerine). Do you want to customize it to match your brand first? Options: (a) pull from your website URL, (b) extract from an installed skill, (c) extract from a local folder / design-system directory, (d) paste tokens manually, (e) proceed with the default for now."
Then branch:
references/onboarding.md § URL to fetch the site, extract palette + fonts, propose a diff, and write style-guide.md.references/onboarding.md § Skill — ask which skill, read its SKILL.md / CSS / token files, map to semantic roles, propose diff.references/onboarding.md § Folder — ask for the path, glob for CSS/JSON/MD token files, map to semantic roles, propose diff.style-guide.md under a new "Custom tokens" section.Once the style guide has been customized (or the user explicitly opted for default), skip this gate on subsequent runs. A simple way to detect customization: if the accent value in style-guide.md differs from #eb6c36, assume custom.
The highest-quality move is usually deletion.
Applied to schematics:
Target density: 4/10. Enough to be technically complete. Not so dense it needs a guide. Above 9 nodes, it's probably two diagrams.
Use for any of the 27 visual types (§3) when a reader will learn more from a visual than from prose, a table, or a bulleted list.
Don't use for:
Before drawing, ask: Would the reader learn more from this than from a well-written paragraph? If no, don't draw.
When behavior, state, enforcement, or risk carries the meaning, first load references/semantic-patterns.md and choose one primary pattern. Then choose the nearest visual type for layout. If no pattern matches, choose the type directly.
| Behavioral trigger | Semantic pattern → nearest type |
|---|---|
| Fan-in, queue depth, finite capacity, bottleneck | Fan-in queue / bottleneck → Data flow |
| Repeated Question / Input / Governance / Output slots across stages | Stage framework with semantic slots → Process |
| Conversation or loose input becomes a structured durable artifact | Unstructured input → structured artifact → Data flow |
| Two rule traces need pass/fail/skipped/not-reached and first divergence | Paired policy-evaluation traces → Flowchart |
| Trust boundaries plus permitted/forbidden ingress or deploy paths | Secure paved road → Architecture |
| Controls grouped by where they are enforced | Governance / control catalog → Layer stack |
| Defenses compensate for prior gaps and residual risk propagates | Compensating security layers → Layer stack |
The pattern owns semantic primitives and its tighter budget; the type owns layout grammar. Use references/animation.md only when motion is requested or materially clarifies ordered change; static remains the default.
| If you're showing… | Use | Reference |
|---|---|---|
| Components + connections in a system | Architecture | type-architecture.md |
| Legacy IT landscape grouped by phase/department; documents the before state in modernization proposals | IT current-state | type-it-state.md |
| Decision logic with branches | Flowchart | type-flowchart.md |
| Time-ordered messages between actors | Sequence | type-sequence.md |
| States + transitions + guards | State machine | type-state.md |
| Entities + fields + relationships | ER / data model | type-er.md |
| Events positioned in time | Timeline | type-timeline.md |
| Cross-functional process with handoffs | Swimlane | type-swimlane.md |
| Two-axis positioning / prioritization | Quadrant | type-quadrant.md |
| Multiple entities scored across 3–5 quantitative criteria | Radar / Spider | type-radar.md |
| Reinforcing cycle / flywheel where the last step feeds the first and a shared hub accumulates state | Loop | type-loop.md |
| Hierarchy through containment / scope | Nested | type-nested.md |
| Parent → children relationships | Tree | type-tree.md |
| Human/agent/team ownership, reporting, routing, escalation | Org chart | type-org-chart.md |
| Stacked abstraction levels | Layer stack | type-layers.md |
| Overlap between sets | Venn | type-venn.md |
| Ranked hierarchy or conversion drop-off | Pyramid / funnel | type-pyramid.md |
| Quantitative comparison across categories | Bar chart | type-bar.md |
| Continuous trends over time | Line chart | type-line.md |
| Tasks and phases on a timeline | Gantt | type-gantt.md |
| Distribution and correlation between two variables | Scatter plot | type-scatter.md |
| End-to-end data stack on a container cluster | High-Level | type-high-level.md |
| Multi-actor sequential process with data handoffs | Process | type-process.md |
| Multi-tier data storage with quality levels and access policies | Medallion | type-medallion.md |
| Role-scoped data flow: who does what at each pipeline step | Data flow | type-data-flow.md |
| Integration topology of a data platform — sources → core → consumers | DP integration | type-dp-integration.md |
| Per-role / per-component access permissions matrix | DP security matrix | type-dp-security-matrix.md |
Rules of thumb:
Always load the chosen references/type-*.md before drawing. When routed above, also load semantic-patterns.md; when animation is chosen, load animation.md.
Before rendering, state the plan in one short message: the chosen visual type (and semantic pattern, if routed), the size preset, and anything the complexity budget (§7) will force out. If the user is reachable, let them redirect before you draw; if not, proceed and note the assumptions beside the deliverable. Skip the pause only when the request already pins type, size, and content exactly.
These mark "AI slop" schematics of any type:
| Anti-pattern | Why it fails |
|---|---|
| Dark mode + cyan/purple glow | Looks "technical" without design decisions |
| JetBrains Mono as blanket "dev" font | Mono is for technical content — ports, commands, URLs. Names go in Geist sans. |
| Identical boxes for every node | Erases hierarchy |
| Legend floating inside the diagram area | Collides with nodes |
| Arrow labels with no masking rect | Bleeds through the line |
Vertical writing-mode text on arrows | Unreadable |
| 3 equal-width summary cards as default | Generic grid — vary widths |
| Shadow on any element | Shadows are out. Borders are in. |
rounded-2xl on boxes | Max radius 6–10px or none |
| Coral on every "important" node | Coral is 1–2 editorial accents, not a signaling system |
| Reproducing Mermaid's renderer layout | Imports automatic spacing and routing instead of making an editorial layout |
| Diagonal / slanted connectors between off-axis nodes | Rounded right-angle (orthogonal) elbows are mandatory — see §6 Mandatory connector rules |
| Arrow label sitting on or touching its connector | Label must have a 6–10px gap above the line so the connector stays visible |
| Arrow label mask overlapping a node box | Nodes paint after labels — the fill clips the text into a fragment on the border. See §6 rule 6 |
| Two connectors overlapping or running on the same path | Each connection must be independently traceable — bridge crossings, offset parallels |
| Two connectors sharing a single attach point on a box | Fan attach points along the edge (≥12px apart) so every arrow is clearly distinct — see §6 rule 4 |
| Connector routed behind a non-endpoint box without need | Reroute around intervening boxes; the dashed-transit exception (§6 rule 5) only applies when an unavoidable intervening box sits on the direct path |
Type-specific anti-patterns live in each references/type-*.md.
The design system is skinnable. All colors, typography, and tokens live in a single source of truth — references/style-guide.md. This file describes semantic roles (paper, ink, muted, accent, link, …). The default skin is a cool editorial palette (white-smoke paper, jet-black ink, atomic-tangerine accent, blue-slate muted, silver hairlines); to apply your own brand, either edit style-guide.md directly or run the URL-based flow described in references/onboarding.md.
When specs below or in type references mention "ink", "accent", "muted", etc., look up the current hex value in
style-guide.md.
| Role | Purpose |
|---|---|
paper, paper-2 | Page bg and container bg |
ink | Primary text / stroke |
muted, soft | Secondary text, default arrows, sublabels |
rule, rule-solid | Hairline borders |
accent, accent-tint | 1–2 focal elements per diagram |
link | HTTP/API calls, external arrows |
Focal rule: accent goes on 1–2 elements max. Everything else is ink / muted / soft. If you're tempted to accent 4 things, you haven't decided what's focal yet.
| Type | Fill | Stroke |
|---|---|---|
| Focal (1–2 max) | accent-tint | accent |
| Backend / API / Step | white | ink |
| Store / State | ink @ 0.05 | muted |
| External / Cloud | ink @ 0.03 | ink @ 0.30 |
| Input / User | muted @ 0.10 | soft |
| Optional / Async | ink @ 0.02 | ink @ 0.20 dashed 4,3 |
| Security / Boundary | accent @ 0.05 | accent @ 0.50 dashed 4,4 |
Mono is for technical content. Names are Geist sans. Page title is Instrument Serif. Italic Instrument Serif is reserved for annotation callouts. Never JetBrains Mono as a blanket "dev" font.
<link href="https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet">
Universal building blocks. Type-specialized primitives (lifeline, activation bar, region) live in the relevant references/type-*.md. Optional primitives:
assets/icons.html.Default: clean paper, no dot pattern. Single <rect> filled with paper. Don't wrap the diagram in a secondary container background — the diagram sits directly on the page.
<rect width="100%" height="100%" fill="#f5f5f5"/>
Optional: dotted paper variant. When a long-form editorial diagram benefits from textured ground (essays, hero diagrams on a dedicated page), opt in by adding the dots pattern and a second rect:
<defs>
<pattern id="dots" width="22" height="22" patternUnits="userSpaceOnUse">
<circle cx="1" cy="1" r="0.9" fill="rgba(45,49,66,0.10)"/>
</pattern>
</defs>
<rect width="100%" height="100%" fill="#f5f5f5"/>
<rect width="100%" height="100%" fill="url(#dots)" opacity="0.6"/>
Don't use the dot pattern when the diagram sits inside a product page, slide, or card — the texture compounds with surrounding chrome and reads as noise.
<marker id="arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
<polygon points="0 0, 8 3, 0 6" fill="#4f5d75"/>
</marker>
<marker id="arrow-accent" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
<polygon points="0 0, 8 3, 0 6" fill="#eb6c36"/>
</marker>
<marker id="arrow-link" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto">
<polygon points="0 0, 8 3, 0 6" fill="#2e5aa8"/>
</marker>
| Arrow | Stroke | When |
|---|---|---|
| Default | muted #4f5d75 | Internal, generic |
| Accent | coral #eb6c36 | Primary / highlighted / headline |
| Link-blue | #2e5aa8 | HTTP/API calls, external systems |
| Dashed | stroke-dasharray="5,4" + any color | Optional, passive, return, async |
Draw arrows before boxes so z-order puts lines behind nodes.
These six rules are non-negotiable. Run the pre-output checklist (§9) to verify before producing any diagram.
Rounded right-angle (orthogonal) connectors are mandatory. Never use diagonal <line> or straight slanted paths between nodes that don't share an x or y axis. Every bend must be a quarter-arc with r=8 (or r=6 minimum for tight layouts). See references/type-architecture.md for the elbow-path formula. Reserve plain straight <line> only for connections whose endpoints share the same x or y coordinate. Diagonal connectors are an automatic fail.
Label-to-connector margin: 6–10px gap, always. A label must never sit on its arrow — the connector must remain visible. Place the label centered above (or beside, for vertical segments) the line with a minimum 6px gap between the bottom of the label's mask rect and the connector stroke. The opaque mask rect prevents the arrow from bleeding through, but the visible gap between mask edge and line preserves the reader's ability to trace the connection. If the label is large enough that 6px feels cramped, push it to 8–10px. Never let the mask rect touch or overlap the stroke.
No overlapping connectors. Two connectors must never share the same stroke path, run parallel on top of each other, or be drawn on top of each other for any segment. When two orthogonal arrows must cross at a single point, apply the bridge / hop primitive (see references/type-architecture.md § Crossing arrows). When two arrows naturally want to overlap, offset their routing by ≥12px so each line is independently traceable. If you find yourself stacking connectors, redesign the layout — it means two nodes are too close, or the diagram is over budget (split into overview + detail).
Shared edge → fan the attach points. When two or more connectors enter or exit the same edge of a box, each must have its own distinct attach point along that edge — no two connectors may share a single point on a box. Spread the attach points evenly along the edge with ≥12px between adjacent points (8px minimum for very small boxes). Routing rules:
k (1..N) sits at offset L * k / (N + 1) from the edge's leading corner.No connector may hide another. If you can't tell two arrows apart at a glance, the layout has failed.
A connector must not pass behind a box that isn't its source or destination — except when the box is geometrically unavoidable on a direct orthogonal path. Reroute around intervening boxes by default. The only legitimate exception is when a cross-cutting node (e.g., a footer service, a horizontal layer bar) physically sits between the connector's source and destination on the only straight path between them — for example, a METRICS arrow exiting an Observability footer bar and rising into a zone above must cross the Active Directory footer bar that sits between them. In that exception:
stroke-dasharray="4,3") to signal "transit, not interaction" — it tells the reader the intervening box is not an endpoint.When in doubt, reroute. The exception exists for the narrow case where rerouting is geometrically impossible, not as a shortcut to avoid layout work.
A label mask must not overlap a node drawn after it. Rule 2 keeps the label off its own connector; this one keeps it off the boxes. Because nodes are painted after labels, a mask that lands partly inside a node is covered by the node fill and the text renders as a fragment sitting on the node border. Place the label on a segment of the connector that runs through open canvas — for a connector leaving a node's right edge, that means clearing the node's x + width before the mask starts. A mask fully inside a node is a badge chip and is fine; a mask overlapping a zone container is fine too, since zones are painted first. Verify with python3 scripts/verify-geometry.py <file>.
<!-- 1. Opaque paper mask — prevents arrows bleeding through transparent fills -->
<rect x="X" y="Y" width="W" height="H" rx="6" fill="#f5f5f5"/>
<!-- 2. Styled box -->
<rect x="X" y="Y" width="W" height="H" rx="6" fill="FILL" stroke="STROKE" stroke-width="1"/>
<!-- 3. Rectangular type tag (rx=2, NOT a pill) -->
<rect x="X+8" y="Y+6" width="28" height="12" rx="2" fill="transparent" stroke="STROKE@0.40" stroke-width="0.8"/>
<text x="X+22" y="Y+15" fill="STROKE@0.8" font-size="7" font-family="'Geist Mono', monospace"
text-anchor="middle" letter-spacing="0.08em">API</text>
<!-- 4. Node name (Geist sans — human-readable) -->
<text x="CX" y="CY+2" fill="#2d3142" font-size="12" font-weight="600"
font-family="'Geist', sans-serif" text-anchor="middle">Node Name</text>
<!-- 5. Technical sublabel (Geist Mono) -->
<text x="CX" y="CY+18" fill="#4f5d75" font-size="9"
font-family="'Geist Mono', monospace" text-anchor="middle">tech:port</text>
Every arrow label needs an opaque rect behind it. Without one it bleeds through the line. And the label must sit with a visible gap above the connector — never on top of it.
<!-- Mask sits 14px above the arrow (8px text height + 6px gap). Stroke is at ARROW_Y. -->
<rect x="MID_X-18" y="ARROW_Y-20" width="36" height="12" rx="2" fill="#f5f5f5"/>
<text x="MID_X" y="ARROW_Y-11" fill="#7a8399" font-size="8"
font-family="'Geist Mono', monospace" text-anchor="middle" letter-spacing="0.06em">WRITE</text>
Rules:
writing-mode vertical.Never put the legend inside the diagram area. Place as a horizontal strip after all nodes, with a hairline separator:
<line x1="30" y1="LEGEND_Y-8" x2="VIEWBOX_W-30" y2="LEGEND_Y-8"
stroke="rgba(45,49,66,0.10)" stroke-width="0.8"/>
<text x="30" y="LEGEND_Y+8" fill="#4f5d75" font-size="8" font-family="'Geist Mono', monospace"
letter-spacing="0.14em">LEGEND</text>
<!-- Items — horizontal row, ~160px apart -->
Expand SVG viewBox height by ~60px.
All values — font sizes, padding, node dimensions, gaps, x/y coords — divisible by 4. Non-negotiable.
| Category | Allowed values |
|---|---|
| Font sizes | 8, 12, 16, 20, 24, 28, 32, 40 |
| Node width / height | 80, 96, 112, 120, 128, 140, 144, 160, 180, 200, 240, 320 |
| x / y coordinates | multiples of 4 |
| Gap between nodes | 20, 24, 32, 40, 48 |
| Padding inside boxes | 8, 12, 16 |
| Border radius | 4, 6, 8 |
Exempt: str
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versiondiagram-designExecute the skills CLI command in your project's root directory to begin installation:
epx add cathrynlavery/diagram-design --skill diagram-designFetches diagram-design from cathrynlavery/diagram-design and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
.cursor/skills/diagram-design
Restart Cursor to activate diagram-design. Access via /diagram-designin your agent's command palette.
Learn more:View source on GitHubSkills CLI docsAbout CursorWhat are agent skills?
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid when
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
software-architecture-design
vasilyu1983/ai-agents-public · Frontend · 2 shared tags
UI Designer
msitarzewski/agency-agents · design · tag: design
design-an-interface
explainx/design-an-interface · design · tag: design
high-end-visual-design
leonxlnx/taste-skill · Frontend · tag: design
tui-design
hyperb1iss/hyperskills · Frontend · tag: design
emil-design-eng
emilkowalski/skill · Frontend · tag: design
Solid pick for teams standardizing on skills: diagram-design is focused, and the summary matches what you get after install.
Registry listing for diagram-design matched our evaluation — installs cleanly and behaves as described in the markdown.
diagram-design has been reliable in day-to-day use. Documentation quality is above average for community skills.
Useful defaults in diagram-design — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
We added diagram-design from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
Keeps context tight: diagram-design is the kind of skill you can hand to a new teammate without a long onboarding doc.
I recommend diagram-design for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Useful defaults in diagram-design — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
diagram-design has been reliable in day-to-day use. Documentation quality is above average for community skills.
Solid pick for teams standardizing on skills: diagram-design is focused, and the summary matches what you get after install.
showing 1-10 of 58