From prixmaviz
Use whenever the user wants any kind of diagram, chart, flowchart, sequence diagram, ER diagram, architecture diagram, state machine, packet layout, signal timing, network topology, or visual representation of structure. Triggers on engine names (Mermaid, PlantUML, D2, Vega-Lite, TikZ, Graphviz, etc.), diagram-type words (flowchart, sequence, ER, state, class, packet, waveform, scaffold), and topics that benefit from visual structure (architectures, data flows, schemas, protocols).
npx claudepluginhub michaeldancurtis/prixmaviz --plugin prixmavizThis skill uses the workspace's default tool permissions.
PrixmaViz is the user's visual partner. When the user asks for a diagram or describes content that visualizes well, render it via the PrixmaViz MCP tools instead of inline ASCII art. The diagram appears in a **browser tab** at the workspace URL — the hosted service (`https://prixmaviz.ailuxis.com`) or a self-hosted server, whichever the user has configured.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Processes PDFs: extracts text/tables/images, merges/splits/rotates pages, adds watermarks, creates/fills forms, encrypts/decrypts, OCRs scans. Activates on PDF mentions or output requests.
Share bugs, ideas, or general feedback.
PrixmaViz is the user's visual partner. When the user asks for a diagram or describes content that visualizes well, render it via the PrixmaViz MCP tools instead of inline ASCII art. The diagram appears in a browser tab at the workspace URL — the hosted service (https://prixmaviz.ailuxis.com) or a self-hosted server, whichever the user has configured.
You participate in a continuous back-and-forth conversation about the diagram. Always tell the user where to view what you rendered — the URL from get_view_url() is the reliable answer.
Always render when the user:
Offer once when ambiguous:
Don't ask permission for explicit requests. If the user clearly wants a diagram, just render it. The plugin is installed; permission is implicit.
Default to Mermaid is wrong for many domains. The user has 28+ engines available. Map content to the right one:
| Content | Engine | Why |
|---|---|---|
| Protocol handshake / multi-actor flow | PlantUML sequence | Rich activation/return semantics |
| Digital signal timing | WaveDrom | Purpose-built for waveforms |
| Protocol packet bytes | Bytefield | Field-level layout primitive |
| C4 architecture | C4-PlantUML or Structurizr | Native C4 support |
| Modern declarative architecture | D2 | Clean defaults, modern aesthetic |
| State machines / general flow | Mermaid | Safe default; great auto-layout |
| Data charts (bar/line/scatter/heatmap) | Vega-Lite | Declarative, expressive |
| Network topology | nwdiag | Subnet/host/port primitives |
| Rack diagrams | rackdiag | Rack-unit layout |
| Wiring diagrams | WireViz | Cable/connector primitives |
| Math / scientific notation | TikZ | LaTeX-grade typography |
| Casual sketch | Excalidraw | Hand-drawn aesthetic |
| ER (database schema) | Mermaid erDiagram or ERd | Domain-fit |
| UML class | PlantUML | Proper UML semantics |
| Process / business | BPMN | BPM-standard notation |
| Dependency / call graph | Graphviz / dot | Algorithmic layout |
Override rule: if the user explicitly names an engine, use that engine — even if the matrix would have picked differently. Respect explicit choice.
Tie-breaker: when uncertain between two reasonable choices, pick the one with cleaner output for that family.
A single conversation = a single tile that EVOLVES IN PLACE. Don't create new diagrams when continuing a topic.
Example flow:
User: "Show me the TCP handshake."
You: [call create_diagram engine=plantuml kind=passthrough name="tcp-handshake",
then apply_patch (or render_dsl) with the PlantUML source. Note the diagramId.]
"The handshake is rendered in your PrixmaViz workspace — three
exchanges between client and server."
User: "Show me TCP+TLS."
You: [call apply_patch on the SAME diagramId, adding TLS messages between
the existing TCP handshake messages. Don't create a new diagram.]
"Added the TLS messages between the SYN handshake and the
application data — see the dashed lines in the middle."
The tile is shared workspace. Use apply_patch against the existing diagramId, not create_diagram, when continuing a topic.
When the user uses pointing language without specifying what they mean:
get_focused_tile() — returns the tile the user is currently interacting with.get_annotations(diagramId) from that focused tile — returns the user's marks (regions, pins, tags) with targetNodes/bboxData.If get_focused_tile returns null or there are no annotations, ASK: "Which part are you referring to?"
You don't see the rendered SVG. The user does. Speak to what they can see:
You called the render. You generated the IR/DSL. But you don't see the SVG the user sees. Reason from:
get_annotations results (targetNodes, bboxData, nearestNode, text)get_focused_tile resultsIf the user says "this looks wrong" and you can't determine why from those structured signals, ASK them to elaborate or annotate the problem area. Never hallucinate visual properties you can't verify.
Call get_view_url() after you call create_diagram, apply_patch, or render_dsl. Include the URL in your response:
"Rendered your sequence diagram — view at . Open that URL in a browser tab to see it."
get_view_url() returns the URL based on the PRIXMAVIZ_PUBLIC_URL env var configured at server startup — the hosted service URL, or whatever the user configured for their self-hosted instance. The user keeps that tab open; subsequent renders update it live via WebSocket — no new tabs.
Example:
You: [render the diagram]
[call get_view_url() → returns { url: "https://prixmaviz.ailuxis.com/" }]
"TCP handshake rendered — view at https://prixmaviz.ailuxis.com/.
Open that URL in a browser tab to see it."
create_diagram(name, engine) — new diagramapply_patch(diagramId, ops[]) — atomic IR patches (graph engines only)render_dsl(engine, source, name?) — direct DSL rendering for passthrough enginessave_diagram(diagramId) — persist to .pviz on diskload_diagram(slug) — re-open a saved diagramlist_diagrams() — library listingget_annotations(diagramId, includeResolved?) — read user's marksget_focused_tile() — which tile is "the current one"get_view_url() — call after every render; returns the workspace URL where the diagram is viewableupdate_tile(tileId, patch) — move/resize/focusset_view({camera?, arrange?}) — viewport + auto-arrangeWhen the user explicitly invokes the /prixmaviz slash command, use it for direct workspace operations.