# Shape vocabulary & search Read this when a diagram needs a **specific shape** — a cloud-provider icon (AWS/Azure/GCP), a network/Cisco/Kubernetes symbol, a UML/BPMN/ER element, an electrical or P&ID part — or any time you'd otherwise *guess* a `style=` string. There are two ways to get a style: 1. **Search the official shape index** (`scripts/shapesearch.py`) — 10,446 real draw.io palette shapes with their exact `style`, `w`, `h`. Use this for branded/vendor icons and anything non-trivial. **Always prefer a searched style over a hand-written `shape=mxgraph.*` guess** — guessed stencil names silently render as a blank box if the name is wrong. 2. **The cheatsheet below** — the common built-in shapes whose style strings are short and stable enough to write by hand (rectangles, flowchart symbols, UML primitives, containers, edges). ## Searching shapes ```bash python3 /scripts/shapesearch.py "aws lambda" --limit 5 python3 /scripts/shapesearch.py "uml actor" --json ``` - Query is space-separated keywords; matching is tag-based with Soundex fuzziness and `camelCase`/`digit` splitting (`"pid2valve"` → `pid valve`). - Prints each match as `Title (WxH)` followed by its full `style=` string. With `--json`, emits `[{style,w,h,title}]` for programmatic use. - Copy the `style` verbatim into an `mxCell`, and use the reported `w`/`h` as the `mxGeometry` width/height (vendor icons are drawn at a fixed aspect ratio). - Results are ranked by tag relevance, with shapes whose **title** contains the query terms bubbled to the top of each score tier. Ranking is still a heuristic, though, and many shapes share a title (three `Lambda` variants: `aws3`/`aws4`/`aws3d`) — so run with `--limit 5` and pick the row whose title and size match what you actually want rather than blindly taking #1. ```xml ``` Covered libraries: AWS (`aws3`/`aws4`), Azure, GCP, Cisco, Kubernetes, UML, BPMN, ER, electrical, P&ID, mockup/wireframe, flowchart, network, and the general/basic sets. The bundled index (`data/shape-index.json.gz`) is the upstream draw.io shape data — see `data/SHAPE-INDEX-NOTICE.md` for attribution. ## AI / LLM brand logos draw.io's bundled libraries have **no** modern AI/LLM brand logos, so an "LLM app architecture" otherwise renders as generic boxes. `scripts/aiicons.py` resolves a brand name (OpenAI, Claude, Gemini, Mistral, Llama, HuggingFace, Ollama, LangChain, …321 brands) to a draw.io `image` style backed by the [lobe-icons](https://github.com/lobehub/lobe-icons) set (MIT). ```bash python3 /scripts/aiicons.py "claude" --json # CDN reference python3 /scripts/aiicons.py "openai" --embed # self-contained python3 /scripts/aiicons.py --list # all brands ``` - Picks the `-color` variant when it exists, else the mono logo (e.g. OpenAI is mono-only). Returns a square `image` style; use the reported `--size` (default 48) for both width and height. - **Default references the icon by CDN URL** — the SVG lives on unpkg, not in this repo, so **draw.io needs network access when the diagram is rendered or opened**; an offline export draws a blank box. Pass `--embed` to fetch the SVG once and inline it as a data URI (portable, renders offline, larger XML). - Logos are trademarks of their respective owners, referenced for identification only — the same basis on which draw.io ships AWS/Azure icons. - **Data stores** common in RAG/LLM apps that lobe lacks (Qdrant, Redis, Postgres, Mongo, Elasticsearch, Milvus, Supabase, Neo4j, ClickHouse, Kafka, Snowflake, Databricks, …) resolve via the [simple-icons](https://simpleicons.org) CDN (CC0) as an automatic fallback — same command, same output shape. A brand in neither set has no logo; use a cylinder (`shape=cylinder3;`, see below) or `scripts/shapesearch.py " database"`. ## Cheatsheet — hand-writable styles These are stable enough to write without searching. Combine with `whiteSpace=wrap;html=1;`. ### Common shapes (`shape=` keyword) | Need | style | |---|---| | Rectangle / rounded box | `rounded=0;` / `rounded=1;` | | Circle / ellipse | `ellipse;` (`aspect=fixed;` for a true circle) | | Diamond (decision) | `rhombus;` | | Cylinder (database) | `shape=cylinder3;` | | Cloud | `cloud;` | | Cube (3D) | `shape=cube;` | | Sticky note | `shape=note;` | | Document (curled bottom) | `shape=document;` | | Folder | `shape=folder;` | | Card (cut corner) | `shape=card;` | | Process (double border) | `shape=process;` | | Step / chevron | `shape=step;` | | Parallelogram (I/O) | `shape=parallelogram;perimeter=parallelogramPerimeter;` | | Trapezoid | `shape=trapezoid;perimeter=trapezoidPerimeter;` | | Hexagon | `shape=hexagon;perimeter=hexagonPerimeter2;` | | Manual input | `shape=manualInput;` | | Data storage | `shape=dataStorage;` | | Off-page connector | `shape=offPageConnector;` | | Delay | `shape=delay;` | | OR / XOR gate | `shape=or;` / `shape=xor;` | | Block arrow | `shape=singleArrow;` / `shape=doubleArrow;` | | Callout (speech bubble) | `shape=callout;` | ### UML primitives | Element | style | |---|---| | Actor (stick figure) | `shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;` | | Boundary | `shape=umlBoundary;` | | Control | `shape=umlControl;` | | Entity | `shape=umlEntity;` | | Lifeline | `shape=umlLifeline;perimeter=lifelinePerimeter;container=1;` | | Frame | `shape=umlFrame;` | | Provided interface (lollipop) | `shape=lollipop;direction=south;` | | Required interface | `shape=requires;direction=north;` | | Component | `shape=component;` | ### Containers (parent-child; children use relative coords) | Type | style | When | |---|---|---| | Invisible group | `group;pointerEvents=0;` | No border, no own connections | | Titled swimlane | `swimlane;startSize=30;` | Visible title bar / has connections | | Any shape as container | append `container=1;pointerEvents=0;` | Box without own connections | ### Edges | Need | add to style | |---|---| | Orthogonal routing | `edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;` | | Curved | `curved=1;` | | No arrowhead | `endArrow=none;` | | Open/thin arrow | `endArrow=open;` / `endArrow=classicThin;` | | Dashed | `dashed=1;` (pattern via `dashPattern=8 8;`) | | Flow animation | `flowAnimation=1;` | | Label background | `labelBackgroundColor=#ffffff;` | ### Useful property knobs - `fontStyle` is a bitmask: `1`=bold, `2`=italic, `4`=underline (add to combine: `3`=bold+italic). - `direction=north|south|east|west` rotates a shape in 90° steps; `rotation=` for free rotation. - `gradientColor=#RRGGBB;` + `gradientDirection=north;` for a gradient fill. - `sketch=1;` gives a hand-drawn look (set globally via a style preset instead when possible). For richer per-shape detail, the upstream source is jgraph/drawio-mcp's `shared/style-reference.md` (Apache-2.0).