PlantUML replaces visual tools like Lucidchart with diagrams as code, compiling version-controlled technical schematics inside developer pipelines.
PlantUML has compiled structured text files into diagrams since 2009, translating human-readable markup into vector images using Java and layout engines. It treats sequence flows, class models, and deployment topologies as plain code versioned inside software repositories. By turning visual architecture into parseable files, it lets engineering teams automate diagram generation across editors, documentation sites, and delivery pipelines.
Lucidchart centers on a browser-based drag-and-drop canvas designed for visual collaboration. Using it in a software workflow requires a separate SaaS subscription, manual exports, and third-party workspace plugins. When developers refactor an API or database schema, diagrams stored in external dashboards drift out of sync unless team members manually redraw them. Synchronization depends on proprietary connectors or static image embeds that sit outside regular development cycles.
PlantUML shifts diagramming into the codebase. Because diagram definitions live as text files in Git, architecture updates accompany code changes in standard pull requests. Command-line tools, Docker containers, and editor extensions compile diagrams into SVG or PNG format during CI builds, updating static documentation engines like MkDocs and Sphinx automatically. While Lucidchart remains superior for freeform whiteboarding with non-technical stakeholders, PlantUML integrates directly into developer toolchains without per-seat licensing or manual export overhead.
PlantUML vs Lucidchart — which diagramming tool is better for engineering teams? Lucidchart suits cross-functional teams that need drag-and-drop whiteboarding, while PlantUML is better for engineers who want version-controlled diagrams embedded into code repositories and CI pipelines.
Is PlantUML free for commercial use? Yes, PlantUML is completely free open-source software for commercial use, allowing organizations to compile and distribute diagrams internally without license fees.
Can PlantUML run entirely offline without an external server? Yes, PlantUML runs locally through command-line binaries, Docker containers, or browser-based JavaScript builds without transmitting data to remote servers.
PlantUML is the right tool when system architecture belongs under Git version control and inside automated documentation builds, though teams needing interactive whiteboards and drag-and-drop collaboration will prefer conventional GUI tools. With active maintenance continuing through September 2026 and an LGPL-3.0 license that permits internal enterprise deployment without recurring per-seat subscriptions, it remains the standard choice for text-based diagramming.
Commands from the official package registries. Each package is matched to PlantUML through the registry's own link to its source code or website.
brew install plantumlbrew install plantumlsudo apt install plantumlsudo pacman -S plantumlWe started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through PlantUML's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p plantuml && cd plantuml
curl -fsSL https://open-source.store/tools/plantuml/compose.yml -o compose.ymltouch .envdocker compose up -dservices:
plantuml-server:
image: plantuml/plantuml-server:jetty-v1.2026.9
ports:
- "8080:8080"
restart: always
healthcheck:
test: ["CMD-SHELL", "curl -f -L http://localhost:8080/ || exit 1"]
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that PlantUML is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 274 s: plantuml/plantuml-server:jetty-v1.2026.9.
Based on the upstream setup. Official compose. Image pinned to jetty-v1.2026.9, removed build context, added healthcheck, and omitted BASE_URL subpath so server runs at root.
plantuml-server-1 | 2026-11-01T07:58:29.938880168Z at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
plantuml-server-1 | 2026-11-01T07:58:29.938880710Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
plantuml-server-1 | 2026-11-01T07:58:29.938881335Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
plantuml-server-1 | 2026-11-01T07:58:29.938881918Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
plantuml-server-1 | 2026-11-01T07:58:29.938882543Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
plantuml-server-1 | 2026-11-01T07:58:29.938883127Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
plantuml-server-1 | 2026-11-01T07:58:29.938883668Z at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:317)
plantuml-server-1 | 2026-11-01T07:58:29.938885460Z at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
plantuml-server-1 | 2026-11-01T07:58:29.938886043Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
plantuml-server-1 | 2026-11-01T07:58:29.938886627Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
plantuml-server-1 | 2026-11-01T07:58:29.938887168Z at java.base/java.lang.Thread.run(Thread.java:1583)
plantuml-server-1 | 2026-11-01T07:58:29.938887710Z Caused by:
plantuml-server-1 | 2026-11-01T07:58:29.938888252Z java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "jakarta.servlet.http.HttpServletRequest.getAttribute(String)" is null
plantuml-server-1 | 2026-11-01T07:58:29.938889002Z at org.apache.jsp.index_jsp._jspService(index_jsp.java:146)
plantuml-server-1 | 2026-11-01T07:58:29.938889543Z at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:66)
plantuml-server-1 | 2026-11-01T07:58:29.938890127Z at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
plantuml-server-1 | 2026-11-01T07:58:29.938890627Z at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:436)
plantuml-server-1 | 2026-11-01T07:58:29.938891168Z at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
plantuml-server-1 | 2026-11-01T07:58:29.938891793Z at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:288)
plantuml-server-1 | 2026-11-01T07:58:29.938892377Z at org.eclipse.jetty.ee11.jsp.JettyJspServlet.service(JettyJspServlet.java:93)
plantuml-server-1 | 2026-11-01T07:58:29.938892918Z at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
plantuml-server-1 | 2026-11-01T07:58:29.938893418Z at org.eclipse.jetty.ee11.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1384)
plantuml-server-1 | 2026-11-01T07:58:29.938893960Z at org.eclipse.jetty.ee11.servlet.ServletHolder.handle(ServletHolder.java:750)
plantuml-server-1 | 2026-11-01T07:58:29.938894502Z at org.eclipse.jetty.ee11.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1668)
plantuml-server-1 | 2026-11-01T07:58:29.938895043Z at org.eclipse.jetty.ee11.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1602)
plantuml-server-1 | 2026-11-01T07:58:29.938895585Z at org.eclipse.jetty.ee11.servlet.ServletChannel.dispatch(ServletChannel.java:868)
plantuml-server-1 | 2026-11-01T07:58:29.938896085Z at org.eclipse.jetty.ee11.servlet.ServletChannel.handle(ServletChannel.java:449)
plantuml-server-1 | 2026-11-01T07:58:29.938896627Z at org.eclipse.jetty.ee11.servlet.ServletHandler.handle(ServletHandler.java:470)
plantuml-server-1 | 2026-11-01T07:58:29.938897168Z at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:546)
plantuml-server-1 | 2026-11-01T07:58:29.938897668Z at org.eclipse.jetty.ee11.servlet.SessionHandler.handle(SessionHandler.java:763)
plantuml-server-1 | 2026-11-01T07:58:29.938898210Z at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1224)
plantuml-server-1 | 2026-11-01T07:58:29.938898752Z at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:148)
plantuml-server-1 | 2026-11-01T07:58:29.938899293Z at org.eclipse.jetty.server.Server.handle(Server.java:197)
plantuml-server-1 | 2026-11-01T07:58:29.938900960Z at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:787)
plantuml-server-1 | 2026-11-01T07:58:29.938901543Z at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:410)
plantuml-server-1 | 2026-11-01T07:58:29.938902085Z at org.eclipse.jetty.server.internal.HttpConnection$FillableCallback.succeeded(HttpConnection.java:1805)
plantuml-server-1 | 2026-11-01T07:58:29.938902668Z at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
plantuml-server-1 | 2026-11-01T07:58:29.938903168Z at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
plantuml-server-1 | 2026-11-01T07:58:29.938903710Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
plantuml-server-1 | 2026-11-01T07:58:29.938904293Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
plantuml-server-1 | 2026-11-01T07:58:29.938904877Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
plantuml-server-1 | 2026-11-01T07:58:29.938905502Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
plantuml-server-1 | 2026-11-01T07:58:29.938906085Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
plantuml-server-1 | 2026-11-01T07:58:29.938906627Z at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:317)
plantuml-server-1 | 2026-11-01T07:58:29.938907210Z at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
plantuml-server-1 | 2026-11-01T07:58:29.938907752Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
plantuml-server-1 | 2026-11-01T07:58:29.938912127Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
plantuml-server-1 | 2026-11-01T07:58:29.938912668Z at java.base/java.lang.Thread.run(Thread.java:1583)
plantuml-server-1 | 2026-11-01T07:58:29.942539460Z 2026-11-01 07:58:29.942:WARN :oeje11s.ServletChannel:qtp917819120-106: /index.jsp
plantuml-server-1 | 2026-11-01T07:58:29.942547252Z org.apache.jasper.JasperException: An exception occurred processing [/index.jsp] at line [4]||1: <%@ page info="index" contentType="text/html; charset=utf-8" pageEncoding="utf-8" session="false" %>|2: <%|3: // diagram sources|4: String encoded = request.getAttribute("encoded").toString();|5: String decoded = request.getAttribute("decoded").toString();|6: String index = request.getAttribute("index").toString();|7: String diagramUrl = ((index.isEmpty()) ? "" : index + "/") + encoded;|||Stacktrace:
plantuml-server-1 | 2026-11-01T07:58:29.942548918Z at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:573)
plantuml-server-1 | 2026-11-01T07:58:29.942549668Z at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:464)
plantuml-server-1 | 2026-11-01T07:58:29.942550252Z at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
plantuml-server-1 | 2026-11-01T07:58:29.942550793Z at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:288)
plantuml-server-1 | 2026-11-01T07:58:29.942551335Z at org.eclipse.jetty.ee11.jsp.JettyJspServlet.service(JettyJspServlet.java:93)
plantuml-server-1 | 2026-11-01T07:58:29.942554835Z at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
plantuml-server-1 | 2026-11-01T07:58:29.942555460Z at org.eclipse.jetty.ee11.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1384)
plantuml-server-1 | 2026-11-01T07:58:29.942556043Z at org.eclipse.jetty.ee11.servlet.ServletHolder.handle(ServletHolder.java:750)
plantuml-server-1 | 2026-11-01T07:58:29.942556585Z at org.eclipse.jetty.ee11.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1668)
plantuml-server-1 | 2026-11-01T07:58:29.942557127Z at org.eclipse.jetty.ee11.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1602)
plantuml-server-1 | 2026-11-01T07:58:29.942557668Z at org.eclipse.jetty.ee11.servlet.ServletChannel.dispatch(ServletChannel.java:868)
plantuml-server-1 | 2026-11-01T07:58:29.942558210Z at org.eclipse.jetty.ee11.servlet.ServletChannel.handle(ServletChannel.java:449)
plantuml-server-1 | 2026-11-01T07:58:29.942558752Z at org.eclipse.jetty.ee11.servlet.ServletHandler.handle(ServletHandler.java:470)
plantuml-server-1 | 2026-11-01T07:58:29.942559293Z at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:546)
plantuml-server-1 | 2026-11-01T07:58:29.942559793Z at org.eclipse.jetty.ee11.servlet.SessionHandler.handle(SessionHandler.java:763)
plantuml-server-1 | 2026-11-01T07:58:29.942560293Z at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1224)
plantuml-server-1 | 2026-11-01T07:58:29.942560835Z at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:148)
plantuml-server-1 | 2026-11-01T07:58:29.942561960Z at org.eclipse.jetty.server.Server.handle(Server.java:197)
plantuml-server-1 | 2026-11-01T07:58:29.942562502Z at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:787)
plantuml-server-1 | 2026-11-01T07:58:29.942563043Z at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:410)
plantuml-server-1 | 2026-11-01T07:58:29.942563627Z at org.eclipse.jetty.server.internal.HttpConnection$FillableCallback.succeeded(HttpConnection.java:1805)
plantuml-server-1 | 2026-11-01T07:58:29.942564168Z at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
plantuml-server-1 | 2026-11-01T07:58:29.942564668Z at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
plantuml-server-1 | 2026-11-01T07:58:29.942565210Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
plantuml-server-1 | 2026-11-01T07:58:29.942565752Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
plantuml-server-1 | 2026-11-01T07:58:29.942566293Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
plantuml-server-1 | 2026-11-01T07:58:29.942566835Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
plantuml-server-1 | 2026-11-01T07:58:29.942567418Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
plantuml-server-1 | 2026-11-01T07:58:29.942568127Z at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:317)
plantuml-server-1 | 2026-11-01T07:58:29.942568668Z at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
plantuml-server-1 | 2026-11-01T07:58:29.942569627Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
plantuml-server-1 | 2026-11-01T07:58:29.942570168Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
plantuml-server-1 | 2026-11-01T07:58:29.942570710Z at java.base/java.lang.Thread.run(Thread.java:1583)
plantuml-server-1 | 2026-11-01T07:58:29.942571252Z Caused by:
plantuml-server-1 | 2026-11-01T07:58:29.942571752Z java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of "jakarta.servlet.http.HttpServletRequest.getAttribute(String)" is null
plantuml-server-1 | 2026-11-01T07:58:29.942572460Z at org.apache.jsp.index_jsp._jspService(index_jsp.java:146)
plantuml-server-1 | 2026-11-01T07:58:29.942573002Z at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:66)
plantuml-server-1 | 2026-11-01T07:58:29.942573543Z at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
plantuml-server-1 | 2026-11-01T07:58:29.942574043Z at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:436)
plantuml-server-1 | 2026-11-01T07:58:29.942574585Z at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
plantuml-server-1 | 2026-11-01T07:58:29.942575168Z at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:288)
plantuml-server-1 | 2026-11-01T07:58:29.942575710Z at org.eclipse.jetty.ee11.jsp.JettyJspServlet.service(JettyJspServlet.java:93)
plantuml-server-1 | 2026-11-01T07:58:29.942576252Z at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
plantuml-server-1 | 2026-11-01T07:58:29.942576752Z at org.eclipse.jetty.ee11.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1384)
plantuml-server-1 | 2026-11-01T07:58:29.942577252Z at org.eclipse.jetty.ee11.servlet.ServletHolder.handle(ServletHolder.java:750)
plantuml-server-1 | 2026-11-01T07:58:29.942577793Z at org.eclipse.jetty.ee11.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1668)
plantuml-server-1 | 2026-11-01T07:58:29.942578335Z at org.eclipse.jetty.ee11.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1602)
plantuml-server-1 | 2026-11-01T07:58:29.942578877Z at org.eclipse.jetty.ee11.servlet.ServletChannel.dispatch(ServletChannel.java:868)
plantuml-server-1 | 2026-11-01T07:58:29.942579377Z at org.eclipse.jetty.ee11.servlet.ServletChannel.handle(ServletChannel.java:449)
plantuml-server-1 | 2026-11-01T07:58:29.942579918Z at org.eclipse.jetty.ee11.servlet.ServletHandler.handle(ServletHandler.java:470)
plantuml-server-1 | 2026-11-01T07:58:29.942580418Z at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:546)
plantuml-server-1 | 2026-11-01T07:58:29.942580918Z at org.eclipse.jetty.ee11.servlet.SessionHandler.handle(SessionHandler.java:763)
plantuml-server-1 | 2026-11-01T07:58:29.942581460Z at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1224)
plantuml-server-1 | 2026-11-01T07:58:29.942581960Z at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:148)
plantuml-server-1 | 2026-11-01T07:58:29.942582543Z at org.eclipse.jetty.server.Server.handle(Server.java:197)
plantuml-server-1 | 2026-11-01T07:58:29.942583043Z at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:787)
plantuml-server-1 | 2026-11-01T07:58:29.942583960Z at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:410)
plantuml-server-1 | 2026-11-01T07:58:29.942584502Z at org.eclipse.jetty.server.internal.HttpConnection$FillableCallback.succeeded(HttpConnection.java:1805)
plantuml-server-1 | 2026-11-01T07:58:29.942585002Z at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
plantuml-server-1 | 2026-11-01T07:58:29.942585543Z at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
plantuml-server-1 | 2026-11-01T07:58:29.942589543Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
plantuml-server-1 | 2026-11-01T07:58:29.942590252Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
plantuml-server-1 | 2026-11-01T07:58:29.942590835Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
plantuml-server-1 | 2026-11-01T07:58:29.942591585Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
plantuml-server-1 | 2026-11-01T07:58:29.942592168Z at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
plantuml-server-1 | 2026-11-01T07:58:29.942592960Z at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:317)
plantuml-server-1 | 2026-11-01T07:58:29.942593668Z at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
plantuml-server-1 | 2026-11-01T07:58:29.942594335Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
plantuml-server-1 | 2026-11-01T07:58:29.942595043Z at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
plantuml-server-1 | 2026-11-01T07:58:29.942595627Z at java.base/java.lang.Thread.run(Thread.java:1583)