Use when designing, reviewing, or refactoring a CLI that must serve AI agents alongside humans, or when converting an API or SDK into an agent-usable CLI interface.
The English summary is being prepared. Showing the original description.
Use when user requests diagrams, flowcharts, sequence diagrams, class diagrams, component diagrams, ER diagrams, architecture charts, or visualizations — including generating a diagram from existing source code, or rendering/extracting PlantUML embedded in a Markdown file to images (e.g. preparing docs for Confluence/Notion). Also use proactively when explaining systems with 3+ components, APIs, data flows, or class hierarchies. Generates .puml files and exports to PNG/SVG via Kroki API (no local install required).
The English summary is being prepared. Showing the original description.
Run score Not tested
See how to installReview the instructions the agent will receive before you install.
Generate .puml PlantUML diagram files and export to PNG/SVG using Kroki — a cloud rendering API that requires no local installation beyond curl.
Format: .puml (PlantUML text)
Renderer: Kroki API (https://kroki.io) — just curl, no Java needed
Output: PNG, SVG
Diagram types: sequence, component, class, ER, activity, use case, state, C4, and more
Explicit triggers:
Proactive triggers:
When NOT to use it — route elsewhere:
Once triggered, route by what the user actually wants — then run the shared render loop (Steps 4–8):
| Mode | The user wants… | Entry point |
|---|---|---|
| Generate (default) | a diagram from a text description | Steps 1–8 below |
| From code | a diagram of existing source code | references/from-source-code.md → Steps 4–8 |
| Embed | the PlantUML inside a Markdown doc rendered to images | references/markdown-embed.md |
| Refine | to change an existing diagram | load its .puml, apply the minimal edit (Step 7), re-render (Steps 4–6) |
| Review | to know whether an existing diagram is readable / correct | run the Step 6 vision self-check on the image |
Option A: Kroki API (recommended — no install)
# Just needs curl (pre-installed on macOS/Linux/Windows Git Bash)
curl --version
Option B: Local Kroki via Docker (for offline use)
docker run -d -p 8000:8000 yuzutech/kroki
# Then replace https://kroki.io with http://localhost:8000 in commands
Option C: Local PlantUML jar (traditional)
# Requires Java + Graphviz
brew install graphviz # macOS
sudo apt install graphviz # Ubuntu
# Download plantuml.jar from https://plantuml.com/download
java -jar plantuml.jar diagram.puml
curl --version
curl is available on all modern systems. If missing, install via package manager.
Choose the most appropriate PlantUML diagram type (see reference below).
Write the PlantUML source file with @startuml / @enduml markers.
Pick the backend first. The default below (public Kroki) uploads the .puml source to kroki.io — for sensitive diagrams use a local backend instead, and never silently fall back. See references/rendering-backends.md. For local Kroki, swap https://kroki.io → http://localhost:8000.
# PNG (recommended) — keep the status code so Step 5 can verify it
http=$(curl -s -w "%{http_code}" -o diagram.png \
-X POST https://kroki.io/plantuml/png \
-H "Content-Type: text/plain" \
--data-binary "@diagram.puml")
echo "HTTP $http"
# SVG
http=$(curl -s -w "%{http_code}" -o diagram.svg \
-X POST https://kroki.io/plantuml/svg \
-H "Content-Type: text/plain" \
--data-binary "@diagram.puml")
echo "HTTP $http"
Never report success on a blind curl. Verify the output first; treat the export as failed if any of these hold:
$http is not 200. Kroki returns 400 on a syntax error and writes the error text into the output file, so a .png can exist yet be broken.[ -s diagram.png ] fails.file diagram.png should report PNG image data; for SVG the file should start with <svg or <?xml.if [ "$http" != "200" ] || [ ! -s diagram.png ]; then
echo "Render failed — Kroki said:"
cat diagram.png # the 400 body holds the offending line + reason
fi
On failure: cat the output file to read Kroki's error, fix the flagged .puml line (see Common Mistakes), then re-run Step 4. Repeat up to 3 times. If a targeted line fix doesn't clear it, degrade in this order, re-rendering after each step — stop as soon as it renders:
rectangle/component/nodeskinparam / !theme (render plain first)note lines"…"For a per-diagram-type error catalog and the Kroki safe subset, read references/kroki-troubleshooting.md. If it still fails after 3 tries, stop and show the user the raw Kroki error — do not claim the diagram was produced.
The Step 5 loop only proves Kroki returned a valid image — not that the diagram is readable. After it renders, use the agent's vision capability to read the PNG and catch what auto-layout (Graphviz) can't prevent. PlantUML positions everything itself, so the failures here are about readability, not your coordinates:
| Check | What to look for | Fix |
|---|---|---|
| Label truncation / overrun | Text clipped or spilling past a box | Shorten the label, wrap in "…", or break with \n |
| Component overlap / cramped | Boxes touching or crowded; unreadable | Add together { }, layout hints, or split the diagram |
| Wrong orientation / aspect | Diagram far too wide or too tall to read | Switch left to right direction ↔ top to bottom direction |
| Edge spaghetti | Many relations crossing, hard to follow | Reorder declarations, group with package/together, or add hidden edges for layout |
| Wrong diagram type | Type doesn't suit the content | Switch type (sequence, state, C4, …) |
| Low contrast | Text blends into the fill / theme | Adjust skinparam / !theme so text contrasts the fill |
After self-check, show the exported image and collect feedback. Apply the minimal .puml edit for each request, then re-render and re-validate:
| User request | Edit action |
|---|---|
| Change a label | Edit the element / message text in the .puml |
| Add / remove an element or relation | Add or delete the matching line |
| Change a color | skinparam, !theme, or an inline #color on the element |
| Change layout direction | Swap left to right direction ↔ top to bottom direction |
| Restructure / group | Wrap related elements in a package / together { }, or regenerate |
diagram.puml / output file each round — don't create v1, v2, ….puml directly or at plantuml.com.Only after Steps 5–7 pass. Tell the user:
.puml source fileTwo non-default modes — load the linked playbook when triggered, then run the same Step 4–8 loop:
references/from-source-code.md```plantuml / ```puml blocks (and linked .puml), render each to an image, and rewrite the Markdown with image links (e.g. to publish to Confluence / Notion, which don't render fenced PlantUML). → references/markdown-embed.md| Type | Keyword | Use for |
|---|---|---|
| Sequence | @startuml + sequence syntax | API calls, protocol flows, message passing |
| Component | @startuml + components | service architecture, module dependencies |
| Class | @startuml + class syntax | OOP models, data structures |
| ER / Entity | @startuml + entity syntax | database schemas |
| Activity | @startuml + activity syntax | workflows, business processes |
| Use Case | @startuml + actor/usecase | system requirements, user stories |
| State | @startuml + state syntax | state machines, lifecycle |
| C4 Context | @startuml + C4 includes | high-level system context maps |
| Mind Map | @startmindmap | topic breakdowns, concept maps |
| Gantt | @startgantt | project timelines, schedules |
@startuml
!theme plain
title Microservices Architecture
actor "Client" as client
rectangle "API Gateway" as gateway #LightBlue
rectangle "Services" {
component "User Service" as user
component "Order Service" as order
}
database "User DB" as userdb
database "Order DB" as orderdb
queue "Kafka" as kafka
client --> gateway
gateway --> user
gateway --> order
user --> userdb
order --> orderdb
order --> kafka : events
@enduml
Shape types:
actor "Name" as id — stick figure (user, external actor)component "Name" as id — component box with [brackets]rectangle "Name" as id — plain rectangle (for groups/layers)database "Name" as id — cylinder (database)queue "Name" as id — queue symbolcloud "Name" as id — cloud shape (external services)node "Name" as id — server/node boxframe "Name" as id — frame groupingpackage "Name" { } — package groupingArrows:
A --> B — solid arrowA -> B — thin arrowA ..> B — dashed arrowA --> B : label — labeled arrowA <--> B — bidirectionalColors:
#LightBlue, #LightGreen, #LightYellow, #Pink, #Violet#AED6F1 (blue), #A9DFBF (green), #FAD7A0 (orange), #F1948A (red)#D7BDE2 (purple), #F9E79F (yellow), #D3D3D3 (grey)@startuml
!theme plain
title Login Flow
participant "Client" as C
participant "API Gateway" as G
participant "Auth Service" as A
database "User DB" as D
C -> G : POST /login
G -> A : validateCredentials(user, pass)
A -> D : SELECT * FROM users WHERE email = ?
D --> A : user record
A --> G : 200 OK + JWT token
G --> C : { token: "..." }
@enduml
Arrow types:
A -> B — synchronous callA --> B — return / dashedA ->> B — async messageA -[#red]-> B — colored arrowactivate A / deactivate A — show activation box@startuml
!theme plain
class User {
+int id
+String name
+String email
+login() : bool
+logout()
}
class Order {
+int id
+Date createdAt
+float total
+place()
+cancel()
}
class Product {
+int id
+String name
+float price
}
User "1" --> "*" Order : places
Order "*" --> "*" Product : contains
@enduml
Relationships:
A --> B — associationA --|> B — inheritanceA ..|> B — implements interfaceA *-- B — compositionA o-- B — aggregationA "1" --> "*" B : label — with multiplicities@startuml
!theme plain
entity "USER" as user {
* id : int <<PK>>
--
name : varchar
email : varchar
created_at : datetime
}
entity "ORDER" as ord {
* id : int <<PK>>
--
* user_id : int <<FK>>
total : decimal
status : varchar
}
entity "PRODUCT" as prod {
* id : int <<PK>>
--
name : varchar
price : decimal
}
user ||--o{ ord : places
ord }o--|{ prod : contains
@enduml
@startuml
!theme plain
start
:Receive Order;
if (Payment valid?) then (yes)
:Process Payment;
:Send Confirmation Email;
:Update Inventory;
:Ship Order;
:Mark as Delivered;
else (no)
:Send Payment Failed Email;
:Cancel Order;
endif
stop
@enduml
@startuml
!theme plain
[*] --> Pending
Pending --> Processing : payment_received
Processing --> Shipped : packed
Shipped --> Delivered : confirmed
Processing --> Cancelled : cancel
Pending --> Cancelled : cancel
Delivered --> [*]
Cancelled --> [*]
@enduml
C4 uses the bundled C4-PlantUML standard library via !include <C4/...>, which Kroki and recent local jars resolve with no network fetch. Export with the standard plantuml endpoint (the c4plantuml Kroki type also works).
@startuml
!include <C4/C4_Context>
title System Context — Internet Banking
Person(customer, "Banking Customer", "A customer of the bank")
System(banking, "Internet Banking System", "Lets customers view their accounts")
System_Ext(mail, "E-mail System", "The internal Microsoft Exchange system")
Rel(customer, banking, "Uses", "HTTPS")
Rel(banking, mail, "Sends e-mail via", "SMTP")
@enduml
Other levels: <C4/C4_Container> (Container, ContainerDb), <C4/C4_Component> (Component). Common macros: Person, System, System_Ext, Container, Rel, Boundary. Do not use a remote !includeurl https://… — Kroki cannot fetch external URLs; always use the bundled <C4/…> form.
Quick reference for the renderer variants. The Kroki ones drop the status capture for brevity — when actually exporting, use the Step 4 form and run the Step 5 validation loop.
# PNG via Kroki API (recommended)
curl -s -X POST https://kroki.io/plantuml/png \
-H "Content-Type: text/plain" \
--data-binary "@diagram.puml" \
-o diagram.png
# SVG via Kroki API
curl -s -X POST https://kroki.io/plantuml/svg \
-H "Content-Type: text/plain" \
--data-binary "@diagram.puml" \
-o diagram.svg
# Via local Kroki Docker (offline)
curl -s -X POST http://localhost:8000/plantuml/png \
-H "Content-Type: text/plain" \
--data-binary "@diagram.puml" \
-o diagram.png
# Via local PlantUML jar (if installed)
java -jar plantuml.jar diagram.puml
# Output: diagram.png in same directory
!theme plain ← clean, minimal (recommended)
!theme cerulean ← blue-tinted
!theme blueprint ← dark blue background
!theme aws-orange ← AWS style
!theme vibrant ← vivid colors
Or use skinparam for custom styling:
skinparam backgroundColor #FAFAFA
skinparam componentBorderColor #555555
skinparam ArrowColor #333333
skinparam FontName Arial
Quick table below; for a per-diagram-type error catalog, the Kroki safe subset, and the failure-degradation ladder, see references/kroki-troubleshooting.md.
| Mistake | Fix |
|---|---|
curl POST returns HTML error page | Check network; try curl -v to see error details |
| Kroki returns 400 Bad Request | cat the output file — Kroki wrote the offending line + reason there; fix it and re-render via the Step 5 loop. Validate syntax at https://www.plantuml.com/plantuml/uml/ |
| Arrow direction unexpected | Use --> for downward/right; explicitly use -up->, -down->, -left->, -right-> |
| Diagram too large/crowded | Split into multiple diagrams or use package/rectangle grouping |
Missing @startuml / @enduml | Always wrap diagram in these markers |
| Special chars in labels | Wrap in quotes: "Label: value" |
| C4 includes not found | Use the bundled !include <C4/C4_Context> (resolved on the standard plantuml endpoint and c4plantuml); never a remote !includeurl https://… — Kroki cannot fetch external URLs |
| Component overlap | Use together { } or explicit layout hints (top to bottom direction) |
| Sequence participants out of order | Declare participant explicitly at top in desired left-to-right order |
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Use when designing, reviewing, or refactoring a CLI that must serve AI agents alongside humans, or when converting an API or SDK into an agent-usable CLI interface.
The English summary is being prepared. Showing the original description.
Search free commercial-use creative assets across multiple online sources — photos, illustrations, icons, video footage, music, sound effects, and fonts. Use when the user needs to find assets for videos, PPTs, articles, or any content creation. Trigger on phrases like "find me a photo of", "search for icons", "I need background music", "find video footage", "search fonts", "找一张图片", "搜素材", "帮我找图标/视频/音乐/字体". Covers Pexels, Unsplash, Pixabay, Iconify, Freesound, Google Fonts and more — with API-backed search where available.
The English summary is being prepared. Showing the original description.
Query the Semantic Scholar academic corpus through AI2's Asta MCP server: keyword or title search with venue and date filters, who-cited-a-paper traversal, author profiles and publications, DOI/arXiv/PMID lookup, and ~500-word full-text snippets for evidence, with citation counts and h-index. Use when the user asks for papers on a topic, who cited a paper, an author's work, recent literature since a date, or a venue-scoped paper list. Requires the Asta MCP server.
The English summary is being prepared. Showing the original description.
Extract and organize frames from a Bilibili video (bangumi episode, UP upload, or a local file) into scenery shots and per-character image groups, using anime-specific person detection + CCIP character-identity embeddings. Two modes — cluster everyone, or pull out one (or several) named characters via reference folders. Use when the user wants to collect, extract, or organize anime frames/screenshots by character or by scenery from a Bilibili video. Read-only download for personal viewing/analysis; uploads nothing.
The English summary is being prepared. Showing the original description.
Fetch Bilibili (哔哩哔哩) video comments for UP主 self-analysis. Use when the user asks to collect, download, export, or analyze comments on a Bilibili video (BV号 / URL / UID). Produces JSONL + summary.json suitable for further Claude Code analysis (sentiment, keywords, audience trends). Read-only; does not post/edit/delete.
The English summary is being prepared. Showing the original description.
Use when user requests diagrams, flowcharts, architecture charts, or visualizations. Also use proactively when explaining systems with 3+ components, complex data flows, or relationships that benefit from visual representation. Generates .excalidraw files and exports to PNG/SVG via Kroki API or locally using excalidraw-brute-export-cli.
The English summary is being prepared. Showing the original description.