{
  "data": {
    "a": {
      "slug": "d2",
      "name": "D2",
      "vendor": "D2 project (The Hack Foundation)",
      "vendorUrl": "https://d2lang.com",
      "kind": "sdk",
      "category": "diagramming",
      "summary": "D2 is an open-source diagram scripting language that turns text into SVG, PNG, PDF, PPTX, GIF or ASCII diagrams. Agents run it as a local CLI, a Go library or the `@d2lang/d2` WebAssembly package.",
      "url": "https://www.anchorterminal.com/tools/d2",
      "markdownUrl": "https://www.anchorterminal.com/tools/d2.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/d2.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/d2.json",
      "repo": "https://github.com/d2lang/d2",
      "license": "MPL-2.0",
      "transports": [],
      "packages": [
        {
          "registry": "npm",
          "name": "@d2lang/d2"
        },
        {
          "registry": "go",
          "name": "github.com/d2lang/d2"
        },
        {
          "registry": "oci",
          "name": "d2lang/d2"
        }
      ],
      "auth": "none",
      "authNotes": "No account, key or login. The CLI, the Go library and the WebAssembly package run on the owner's machine with the owner's file and network rights. `d2 --watch` serves a preview on localhost.",
      "pricing": "free",
      "pricingNotes": "Free under MPL-2.0 with nothing to buy. The TALA layout engine, once a paid plugin with a licence key, has been bundled and open source since 0.9.0. The project takes donations through a public Hack Club fund (https://d2lang.com/sponsor/).",
      "priceSummary": "Free · OSS",
      "where": "local",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs or the source. The maintainer's 5 September 2026 post rules out any server-side service (checked 2026-10-08).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 25581,
        "npmWeekly": 21627,
        "pypiWeekly": null,
        "asOf": "2026-10-08"
      },
      "docsUrl": "https://d2lang.com/tour/intro/",
      "capabilities": [
        "diagram.as-code",
        "diagram.create",
        "diagram.export",
        "diagram.edit",
        "diagram.architecture"
      ],
      "tags": [
        "open-source",
        "local",
        "cli",
        "go",
        "wasm",
        "diagram-as-code",
        "no-auth",
        "free",
        "non-profit",
        "docker"
      ],
      "lastRelease": "2026-09-07",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 65.3,
        "grade": "B",
        "agentReady": false,
        "rank": 295,
        "ranked": true,
        "rankOf": 842,
        "categoryRank": 2,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 78,
          "maintenance": 74,
          "payments": 60,
          "reliability": 68,
          "schema": 65,
          "security": 48,
          "transparency": 69
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-08"
        },
        "negative": 0,
        "verdict": "A single local command turns text into a diagram in six formats with no account, key or network call, and CI passes on the default branch. The language is at 0.9.0 with no stable release, its company sponsor has shut down, and one maintainer with limited time wrote every commit since July.",
        "bestFor": "Agents that need to produce or edit architecture, sequence, grid, SQL table or class diagrams as reviewable text and render them locally.",
        "strengths": [
          "One command reads D2 from stdin and writes SVG, PNG, PDF, PPTX, GIF or ASCII to stdout, with no account or key",
          "MPL-2.0 throughout, and the TALA layout engine has been open source and bundled since 0.9.0 on 7 September 2026",
          "`d2 validate` and `d2 fmt --check` let an agent test a diagram before rendering it",
          "The `d2oracle` Go package creates, sets, moves, renames and deletes shapes without mutating the input graph",
          "Release archives carry SHA-256 sums, signed provenance and SBOM attestations since 0.8.2"
        ],
        "weaknesses": [
          "No 1.0 release. The maintainer lists a stable 1.0 with a formal grammar as a goal, and 0.8.2 changed Dagre and ELK layout output",
          "Terrastruct, the company that built D2, is shutting down. The project is now donation-funded under The Hack Foundation",
          "All 317 commits since 8 July 2026 are by one maintainer, who says his time on D2 is limited",
          "A security hardening pass merged on 11 and 12 September 2026 is not in a release yet, and the repository has no security policy",
          "No llms.txt, no machine-readable grammar and no MCP server. The maintainer rules out an MCP server and a hosted API"
        ],
        "agentNotes": [
          "Check the exit status of `d2`, never the output file. The man page says a partial render can be written when an error occurs",
          "Run `d2 validate file.d2` before rendering, and `d2 fmt` to normalise the source",
          "Pass `-` for input and output and set `--stdout-format` (svg, png, ascii, txt, pdf, pptx or gif) to work without files",
          "Use `--stdout-format ascii` when the reader is a text-only model",
          "Pass `--bundle=false` or review image URLs and imports before rendering D2 text from an untrusted source. Release 0.9.0 fetches remote images when bundling"
        ],
        "metrics": {
          "kind": "local",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 65.3
          }
        ],
        "editorialScores": {
          "ergonomics": 78,
          "maintenance": 74,
          "payments": 60,
          "reliability": 68,
          "schema": 65,
          "security": 48,
          "transparency": 74
        },
        "provenanceScore": 63
      },
      "connect": {
        "install": "curl -fsSL https://d2lang.com/install.sh | sh -s --   # or: brew install d2, go install github.com/d2lang/d2@latest, npm install @d2lang/d2"
      },
      "letme": {
        "capability": "https://letme.dev/diagram.as-code",
        "tool": "https://letme.dev/d2"
      },
      "area": "design-diagrams",
      "provenance": {
        "legalEntity": "The Hack Foundation (Hack Club), fiscal sponsor of the D2 project",
        "domain": "d2lang.com",
        "domainRegistered": "2022-10-24",
        "endpointOnVendorDomain": null,
        "terms": "",
        "privacy": "",
        "statusPage": "",
        "changelog": "https://d2lang.com/releases/intro/",
        "securityTxt": "none",
        "checked": "2026-10-08",
        "notes": [
          "The sponsor page says D2 is fiscally sponsored by The Hack Foundation, the 501(c)(3) nonprofit behind Hack Club, after the lead maintainer donated the project in August 2026 (https://d2lang.com/sponsor/)",
          "LICENSE.txt still reads Copyright 2022 Terrastruct Inc. The 5 September 2026 post says that company is shutting down, and terrastruct.com now redirects to d2lang.com",
          "No terms or privacy document governs the software. The MPL-2.0 licence stands in",
          "https://d2lang.com/.well-known/security.txt answered 404 on 8 October 2026, and the repository has no SECURITY.md",
          "The repository moved from github.com/terrastruct/d2, which redirects, to github.com/d2lang/d2"
        ],
        "score": 63
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/d2.json"
    },
    "answer": "PlantUML scores 66.9 (B) on agent readiness against D2's 65.3 (B), and leads in 3 of 7 scored categories.",
    "b": {
      "slug": "plantuml",
      "name": "PlantUML",
      "vendor": "PlantUML project (Arnaud Roques)",
      "vendorUrl": "https://plantuml.com",
      "kind": "sdk",
      "category": "diagramming",
      "summary": "PlantUML is open-source software that turns text descriptions into UML, architecture, Gantt, mind map and other diagrams. Agents run it as a Java command-line tool, a Java library, a local HTTP server or the `@plantuml/mcp-js` MCP server.",
      "url": "https://www.anchorterminal.com/tools/plantuml",
      "markdownUrl": "https://www.anchorterminal.com/tools/plantuml.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/plantuml.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/plantuml.json",
      "repo": "https://github.com/plantuml/plantuml",
      "license": "GPL-3.0-or-later",
      "transports": [],
      "packages": [
        {
          "registry": "maven",
          "name": "net.sourceforge.plantuml:plantuml"
        },
        {
          "registry": "npm",
          "name": "@plantuml/mcp-js"
        },
        {
          "registry": "oci",
          "name": "plantuml/plantuml"
        }
      ],
      "auth": "none",
      "authNotes": "No account, key or login. The jar, the Java library and the MCP server run on the owner's machine with the owner's file and network rights. The built-in `-picoweb` HTTP server has no authentication and listens on all interfaces unless a bind address is given.",
      "pricing": "free",
      "pricingNotes": "Free under GPL-3.0-or-later, with the same source also under GPL-2.0, LGPL, Apache-2.0, BSD-3-Clause, EPL and MIT. Nothing to buy. The project takes donations through GitHub Sponsors and Patreon.",
      "priceSummary": "Free · OSS",
      "where": "local",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs or the source (checked 2026-10-08).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 13356,
        "npmWeekly": 207,
        "pypiWeekly": null,
        "asOf": "2026-10-08"
      },
      "docsUrl": "https://plantuml.com/command-line",
      "capabilities": [
        "diagram.as-code",
        "diagram.create",
        "diagram.export",
        "diagram.architecture"
      ],
      "tags": [
        "open-source",
        "local",
        "cli",
        "java",
        "mcp",
        "diagram-as-code",
        "uml",
        "no-auth",
        "free",
        "docker"
      ],
      "lastRelease": "2026-09-05",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 66.9,
        "grade": "B",
        "agentReady": false,
        "rank": 251,
        "ranked": true,
        "rankOf": 842,
        "categoryRank": 1,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 78,
          "maintenance": 73,
          "payments": 60,
          "reliability": 83,
          "schema": 65,
          "security": 50,
          "transparency": 73
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-08"
        },
        "negative": -2,
        "negativeNotes": [
          "27 February 2026. Release 1.2026.2 switched off chronology diagrams, and its change log calls the removal temporary. On 8 October 2026 the factory is still commented out in `PSystemBuilder.java`, while the README lists the chronology diagram as supported and https://plantuml.com/chronology-diagram documents it. Two points, because the removal is in the change log (https://github.com/plantuml/plantuml/blob/master/CHANGES.md)."
        ],
        "verdict": "One Java command reads diagram text from stdin and writes PNG, SVG, PDF or ASCII with no account, and CI passed on the last eight pushes. The default security profile lets diagram text read any local file and fetch any URL, and the documentation still lists chronology diagrams that release 1.2026.2 switched off.",
        "bestFor": "Agents that write sequence, class, state, component, deployment, Gantt or C4 diagrams as text and render them locally or in CI.",
        "strengths": [
          "`java -jar plantuml.jar -pipe` reads a diagram from stdin and writes PNG, SVG, PDF, EPS, LaTeX or ASCII to stdout, with no account or key",
          "`--check-syntax` and `-stdrpt` report errors as `file:line:error` lines, and exit codes 0, 50, 100 and 200 are documented",
          "The official `@plantuml/mcp-js` server has four tools, needs only Node.js, and returns the same SVG bytes for the same source on any machine",
          "Version 1.2026.8 of 5 September 2026 is on GitHub, Maven Central, Homebrew and Docker Hub, and the `ci` workflow passed on the last eight pushes",
          "The same source is available under GPL-3.0-or-later, GPL-2.0, LGPL, Apache-2.0, BSD-3-Clause, EPL and MIT, and generated images carry no licence obligation"
        ],
        "weaknesses": [
          "The default security profile is LEGACY, which gives diagram text full access to local files and URLs through `!include`. The docs say it will be removed, with no date",
          "`-picoweb` listens on all network interfaces by default and has no authentication",
          "Chronology diagrams were switched off in 1.2026.2 on 27 February 2026 and are still listed in the README and documented on plantuml.com",
          "The command-line page gives the HTTP server's default port as 4242 in one help listing and 8080 in another. The source uses 8080",
          "No llms.txt, no security.txt and no published advisories. The security policy is one email address, and 575 issues are open"
        ],
        "agentNotes": [
          "Set `PLANTUML_SECURITY_PROFILE` to `SANDBOX` or `ALLOWLIST` before rendering text from an untrusted source. The default profile lets `!include` read local files and fetch URLs",
          "Run `java -jar plantuml.jar --check-syntax` with `-stdrpt` first and read the exit status. Without `--no-error-image` a syntax error still writes an image of the error text",
          "Pass `-pipe` with `--svg`, `--txt` or `--utxt` to work without files. `--txt` output suits a text-only model",
          "Start the local server as `-picoweb:8080:127.0.0.1`. Without the bind address it listens on every interface",
          "Use `npx -y @plantuml/mcp-js` when no Java runtime is present. It renders SVG only, so use the jar for PNG or PDF"
        ],
        "metrics": {
          "kind": "local",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 66.9
          }
        ],
        "editorialScores": {
          "ergonomics": 78,
          "maintenance": 73,
          "payments": 60,
          "reliability": 83,
          "schema": 65,
          "security": 50,
          "transparency": 73
        },
        "provenanceScore": 73
      },
      "connect": {
        "install": "brew install plantuml   # or download plantuml.jar from https://github.com/plantuml/plantuml/releases, or docker run ghcr.io/plantuml/plantuml",
        "config": {
          "mcpServers": {
            "plantuml-js": {
              "args": [
                "-y",
                "@plantuml/mcp-js"
              ],
              "command": "npx"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/diagram.as-code",
        "tool": "https://letme.dev/plantuml"
      },
      "area": "design-diagrams",
      "provenance": {
        "legalEntity": "No legal entity found. Copyright Arnaud Roques",
        "domain": "plantuml.com",
        "domainRegistered": "2010-11-28",
        "endpointOnVendorDomain": null,
        "terms": "",
        "privacy": "",
        "statusPage": "",
        "changelog": "https://github.com/plantuml/plantuml/blob/master/CHANGES.md",
        "securityTxt": "none",
        "checked": "2026-10-08",
        "notes": [
          "`LICENSES.md` reads Copyright (C) 2009-2026, Arnaud Roques. No company or foundation is named in the repository or on the pages read",
          "No terms or privacy document governs the software. The GPL-3.0-or-later licence, or one of the six alternatives, stands in",
          "https://plantuml.com/.well-known/security.txt answered 404 on 8 October 2026. `docs/SECURITY.md` asks for reports by email to a Gmail address",
          "The lead named PlantUML as vendor. It is a community project led by one author, with no company behind it that we found"
        ],
        "score": 73
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/plantuml.json"
    },
    "facts": [
      {
        "a": "SDK + MCP",
        "b": "SDK + MCP",
        "name": "Kind"
      },
      {
        "a": "D2 project (The Hack Foundation)",
        "b": "PlantUML project (Arnaud Roques)",
        "name": "Vendor"
      },
      {
        "a": "no (local only)",
        "b": "no (local only)",
        "name": "Hosted endpoint"
      },
      {
        "a": "",
        "b": "",
        "name": "Transports"
      },
      {
        "a": "None",
        "b": "None",
        "name": "Auth"
      },
      {
        "a": "Free",
        "b": "Free",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "MPL-2.0",
        "b": "GPL-3.0-or-later",
        "name": "Licence"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "no",
        "b": "no",
        "name": "llms.txt"
      },
      {
        "a": "2026-09-07",
        "b": "2026-09-05",
        "name": "Last release"
      },
      {
        "a": "no document linked",
        "b": "no document linked",
        "name": "Terms last updated"
      },
      {
        "a": "no document linked",
        "b": "no document linked",
        "name": "Privacy policy last updated"
      },
      {
        "a": "",
        "b": "",
        "name": "Customer content may train models"
      },
      {
        "a": "",
        "b": "",
        "name": "Terms restrict automated access"
      },
      {
        "a": "",
        "b": "",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "",
        "b": "",
        "name": "Terms or service can change without notice"
      },
      {
        "a": "",
        "b": "",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "26k stars, 22k npm/wk",
        "b": "13k stars, 207 npm/wk",
        "name": "Popularity"
      }
    ],
    "faq": [
      {
        "answer": "PlantUML scores 66.9 (B) on agent readiness against D2's 65.3 (B), and leads in 3 of 7 scored categories.",
        "question": "Which is better for AI agents, D2 or PlantUML?"
      },
      {
        "answer": "Yes. D2 is open source (MPL-2.0). PlantUML is open source (GPL-3.0-or-later).",
        "question": "Are D2 and PlantUML open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": null,
        "also": null,
        "goodFor": "Agents that need to produce or edit architecture, sequence, grid, SQL table or class diagrams as reviewable text and render them locally.",
        "slug": "d2",
        "watchFor": "No 1.0 release. The maintainer lists a stable 1.0 with a formal grammar as a goal, and 0.8.2 changed Dagre and ELK layout output"
      },
      {
        "aheadOn": [
          "Reliability, 83 against 68"
        ],
        "also": null,
        "goodFor": "Agents that write sequence, class, state, component, deployment, Gantt or C4 diagrams as text and render them locally or in CI.",
        "slug": "plantuml",
        "watchFor": "The default security profile is LEGACY, which gives diagram text full access to local files and URLs through `!include`. The docs say it will be removed, with no date"
      }
    ],
    "job": {
      "capability": "diagram.as-code",
      "name": "Diagram as code"
    },
    "others": [
      {
        "json": "https://www.anchorterminal.com/compare/cloudviz-vs-d2.json",
        "title": "Cloudviz API vs D2",
        "url": "https://www.anchorterminal.com/compare/cloudviz-vs-d2"
      },
      {
        "json": "https://www.anchorterminal.com/compare/cloudviz-vs-plantuml.json",
        "title": "Cloudviz API vs PlantUML",
        "url": "https://www.anchorterminal.com/compare/cloudviz-vs-plantuml"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-diagrams-so.json",
        "title": "D2 vs Diagrams.so API + MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-diagrams-so"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-mural-mcp.json",
        "title": "D2 vs Mural MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-mural-mcp"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-whimsical.json",
        "title": "D2 vs Whimsical MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-whimsical"
      },
      {
        "json": "https://www.anchorterminal.com/compare/diagrams-so-vs-plantuml.json",
        "title": "Diagrams.so API + MCP vs PlantUML",
        "url": "https://www.anchorterminal.com/compare/diagrams-so-vs-plantuml"
      },
      {
        "json": "https://www.anchorterminal.com/compare/drawio-vs-plantuml.json",
        "title": "draw.io + MCP vs PlantUML",
        "url": "https://www.anchorterminal.com/compare/drawio-vs-plantuml"
      },
      {
        "json": "https://www.anchorterminal.com/compare/eraser-vs-plantuml.json",
        "title": "Eraser API + MCP vs PlantUML",
        "url": "https://www.anchorterminal.com/compare/eraser-vs-plantuml"
      },
      {
        "json": "https://www.anchorterminal.com/compare/lucid-vs-plantuml.json",
        "title": "Lucid API + MCP vs PlantUML",
        "url": "https://www.anchorterminal.com/compare/lucid-vs-plantuml"
      },
      {
        "json": "https://www.anchorterminal.com/compare/mermaid-chart-vs-plantuml.json",
        "title": "Mermaid Chart MCP vs PlantUML",
        "url": "https://www.anchorterminal.com/compare/mermaid-chart-vs-plantuml"
      },
      {
        "json": "https://www.anchorterminal.com/compare/mural-mcp-vs-plantuml.json",
        "title": "Mural MCP vs PlantUML",
        "url": "https://www.anchorterminal.com/compare/mural-mcp-vs-plantuml"
      },
      {
        "json": "https://www.anchorterminal.com/compare/plantuml-vs-whimsical.json",
        "title": "PlantUML vs Whimsical MCP",
        "url": "https://www.anchorterminal.com/compare/plantuml-vs-whimsical"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-drawio.json",
        "title": "D2 vs draw.io + MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-drawio"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-eraser.json",
        "title": "D2 vs Eraser API + MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-eraser"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-lucid.json",
        "title": "D2 vs Lucid API + MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-lucid"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-mermaid-chart.json",
        "title": "D2 vs Mermaid Chart MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-mermaid-chart"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-structurizr.json",
        "title": "D2 vs Structurizr + MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-structurizr"
      },
      {
        "json": "https://www.anchorterminal.com/compare/d2-vs-tldraw.json",
        "title": "D2 vs tldraw SDK + MCP",
        "url": "https://www.anchorterminal.com/compare/d2-vs-tldraw"
      },
      {
        "json": "https://www.anchorterminal.com/compare/plantuml-vs-structurizr.json",
        "title": "PlantUML vs Structurizr + MCP",
        "url": "https://www.anchorterminal.com/compare/plantuml-vs-structurizr"
      },
      {
        "json": "https://www.anchorterminal.com/compare/plantuml-vs-tldraw.json",
        "title": "PlantUML vs tldraw SDK + MCP",
        "url": "https://www.anchorterminal.com/compare/plantuml-vs-tldraw"
      }
    ],
    "scores": [
      {
        "by": 15,
        "d2": 68,
        "edge": "plantuml",
        "key": "reliability",
        "name": "Reliability",
        "plantuml": 83,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 0,
        "d2": 65,
        "edge": "",
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "plantuml": 65,
        "weight": 13
      },
      {
        "by": 0,
        "d2": 78,
        "edge": "",
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "plantuml": 78,
        "weight": 13
      },
      {
        "by": 2,
        "d2": 48,
        "edge": "plantuml",
        "key": "security",
        "name": "Security \u0026 auth",
        "plantuml": 50,
        "weight": 14
      },
      {
        "by": 0,
        "d2": 60,
        "edge": "",
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "plantuml": 60,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 1,
        "d2": 74,
        "edge": "d2",
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "plantuml": 73,
        "weight": 7
      },
      {
        "by": 4,
        "d2": 69,
        "edge": "plantuml",
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "plantuml": 73,
        "weight": 7
      }
    ],
    "summary": "PlantUML scores 66.9 (B) on agent readiness against D2's 65.3 (B), and leads in 3 of 7 scored categories. Both do diagram as code.",
    "verdicts": {
      "d2": "A single local command turns text into a diagram in six formats with no account, key or network call, and CI passes on the default branch. The language is at 0.9.0 with no stable release, its company sponsor has shut down, and one maintainer with limited time wrote every commit since July.",
      "plantuml": "One Java command reads diagram text from stdin and writes PNG, SVG, PDF or ASCII with no account, and CI passed on the last eight pushes. The default security profile lets diagram text read any local file and fetch any URL, and the documentation still lists chronology diagrams that release 1.2026.2 switched off."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/d2-vs-plantuml",
    "json": "https://www.anchorterminal.com/compare/d2-vs-plantuml.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/d2-vs-plantuml.md",
    "slim": "https://www.anchorterminal.com/compare/d2-vs-plantuml.min.md"
  },
  "markdown": "PlantUML scores 66.9 (B) on agent readiness against D2's 65.3 (B), and leads in 3 of 7 scored categories. Both do diagram as code.\n\n- D2: grade B, 65.3/100, rank #295 of 842. Markdown https://www.anchorterminal.com/tools/d2.md · JSON https://www.anchorterminal.com/api/v1/tools/d2.json\n- PlantUML: grade B, 66.9/100, rank #251 of 842. Markdown https://www.anchorterminal.com/tools/plantuml.md · JSON https://www.anchorterminal.com/api/v1/tools/plantuml.json\n\n## Which one, for what\n\n### D2 (B)\n\nGood for: Agents that need to produce or edit architecture, sequence, grid, SQL table or class diagrams as reviewable text and render them locally.\n\nWatch for: No 1.0 release. The maintainer lists a stable 1.0 with a formal grammar as a goal, and 0.8.2 changed Dagre and ELK layout output\n\n### PlantUML (B)\n\nGood for: Agents that write sequence, class, state, component, deployment, Gantt or C4 diagrams as text and render them locally or in CI.\n\nAhead on:\n- Reliability, 83 against 68\n\nWatch for: The default security profile is LEGACY, which gives diagram text full access to local files and URLs through `!include`. The docs say it will be removed, with no date\n\n\n## Score by category\n\n| Category | Weight | D2 | PlantUML | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 68 | 83 | PlantUML +15 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 65 | 65 | even |\n| Agent ergonomics | 13% (16.2 this run) | 78 | 78 | even |\n| Security \u0026 auth | 14% (17.5 this run) | 48 | 50 | PlantUML +2 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 60 | 60 | even |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 74 | 73 | D2 +1 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 69 | 73 | PlantUML +4 |\n| Negative events | ≤15 | 0 | -2 | |\n| **Total** | | **65.3 · B** | **66.9 · B** | |\n\n## Facts side by side\n\n| Fact | D2 | PlantUML |\n| --- | --- | --- |\n| Kind | SDK + MCP | SDK + MCP |\n| Vendor | D2 project (The Hack Foundation) | PlantUML project (Arnaud Roques) |\n| Hosted endpoint | no (local only) | no (local only) |\n| Transports |  |  |\n| Auth | None | None |\n| Pricing | Free | Free |\n| x402 | no | no |\n| Licence | MPL-2.0 | GPL-3.0-or-later |\n| Read-only variant documented | no | no |\n| llms.txt | no | no |\n| Last release | 2026-09-07 | 2026-09-05 |\n| Terms last updated | no document linked | no document linked |\n| Privacy policy last updated | no document linked | no document linked |\n| Customer content may train models |  |  |\n| Terms restrict automated access |  |  |\n| Terms restrict benchmarking |  |  |\n| Terms or service can change without notice |  |  |\n| Arbitration or class-action waiver |  |  |\n| Popularity | 26k stars, 22k npm/wk | 13k stars, 207 npm/wk |\n\n## Verdicts\n\n**D2.** A single local command turns text into a diagram in six formats with no account, key or network call, and CI passes on the default branch. The language is at 0.9.0 with no stable release, its company sponsor has shut down, and one maintainer with limited time wrote every commit since July.\n\n**PlantUML.** One Java command reads diagram text from stdin and writes PNG, SVG, PDF or ASCII with no account, and CI passed on the last eight pushes. The default security profile lets diagram text read any local file and fetch any URL, and the documentation still lists chronology diagrams that release 1.2026.2 switched off.\n\n## Before you call either\n\n### D2\n\n1. Check the exit status of `d2`, never the output file. The man page says a partial render can be written when an error occurs\n2. Run `d2 validate file.d2` before rendering, and `d2 fmt` to normalise the source\n3. Pass `-` for input and output and set `--stdout-format` (svg, png, ascii, txt, pdf, pptx or gif) to work without files\n4. Use `--stdout-format ascii` when the reader is a text-only model\n5. Pass `--bundle=false` or review image URLs and imports before rendering D2 text from an untrusted source. Release 0.9.0 fetches remote images when bundling\n\n### PlantUML\n\n1. Set `PLANTUML_SECURITY_PROFILE` to `SANDBOX` or `ALLOWLIST` before rendering text from an untrusted source. The default profile lets `!include` read local files and fetch URLs\n2. Run `java -jar plantuml.jar --check-syntax` with `-stdrpt` first and read the exit status. Without `--no-error-image` a syntax error still writes an image of the error text\n3. Pass `-pipe` with `--svg`, `--txt` or `--utxt` to work without files. `--txt` output suits a text-only model\n4. Start the local server as `-picoweb:8080:127.0.0.1`. Without the bind address it listens on every interface\n5. Use `npx -y @plantuml/mcp-js` when no Java runtime is present. It renders SVG only, so use the jar for PNG or PDF\n\n## Questions\n\n### Which is better for AI agents, D2 or PlantUML?\n\nPlantUML scores 66.9 (B) on agent readiness against D2's 65.3 (B), and leads in 3 of 7 scored categories.\n\n### Are D2 and PlantUML open source?\n\nYes. D2 is open source (MPL-2.0). PlantUML is open source (GPL-3.0-or-later).\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/d2-vs-plantuml.json, and with the fewest tokens: https://www.anchorterminal.com/compare/d2-vs-plantuml.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"d2\", \"b\": \"plantuml\"}`. From a terminal: `anchor compare d2 plantuml`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/d2.json and https://www.anchorterminal.com/api/v1/tools/plantuml.json\n\n## Other comparisons with D2 or PlantUML\n\n- [Cloudviz API vs D2](https://www.anchorterminal.com/compare/cloudviz-vs-d2.md)\n- [Cloudviz API vs PlantUML](https://www.anchorterminal.com/compare/cloudviz-vs-plantuml.md)\n- [D2 vs Diagrams.so API + MCP](https://www.anchorterminal.com/compare/d2-vs-diagrams-so.md)\n- [D2 vs Mural MCP](https://www.anchorterminal.com/compare/d2-vs-mural-mcp.md)\n- [D2 vs Whimsical MCP](https://www.anchorterminal.com/compare/d2-vs-whimsical.md)\n- [Diagrams.so API + MCP vs PlantUML](https://www.anchorterminal.com/compare/diagrams-so-vs-plantuml.md)\n- [draw.io + MCP vs PlantUML](https://www.anchorterminal.com/compare/drawio-vs-plantuml.md)\n- [Eraser API + MCP vs PlantUML](https://www.anchorterminal.com/compare/eraser-vs-plantuml.md)\n- [Lucid API + MCP vs PlantUML](https://www.anchorterminal.com/compare/lucid-vs-plantuml.md)\n- [Mermaid Chart MCP vs PlantUML](https://www.anchorterminal.com/compare/mermaid-chart-vs-plantuml.md)\n- [Mural MCP vs PlantUML](https://www.anchorterminal.com/compare/mural-mcp-vs-plantuml.md)\n- [PlantUML vs Whimsical MCP](https://www.anchorterminal.com/compare/plantuml-vs-whimsical.md)\n- [D2 vs draw.io + MCP](https://www.anchorterminal.com/compare/d2-vs-drawio.md)\n- [D2 vs Eraser API + MCP](https://www.anchorterminal.com/compare/d2-vs-eraser.md)\n- [D2 vs Lucid API + MCP](https://www.anchorterminal.com/compare/d2-vs-lucid.md)\n- [D2 vs Mermaid Chart MCP](https://www.anchorterminal.com/compare/d2-vs-mermaid-chart.md)\n- [D2 vs Structurizr + MCP](https://www.anchorterminal.com/compare/d2-vs-structurizr.md)\n- [D2 vs tldraw SDK + MCP](https://www.anchorterminal.com/compare/d2-vs-tldraw.md)\n- [PlantUML vs Structurizr + MCP](https://www.anchorterminal.com/compare/plantuml-vs-structurizr.md)\n- [PlantUML vs tldraw SDK + MCP](https://www.anchorterminal.com/compare/plantuml-vs-tldraw.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-09",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Compare",
        "url": "https://www.anchorterminal.com/compare/"
      },
      {
        "name": "D2 vs PlantUML",
        "url": ""
      }
    ],
    "description": "PlantUML scores 66.9 (B) on agent readiness against D2's 65.3 (B), and leads in 3 of 7 scored categories. Both do diagram as code. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "D2 B 65.3",
      "PlantUML B 66.9",
      "scores"
    ],
    "h1": "D2 vs PlantUML",
    "image": "https://www.anchorterminal.com/assets/og/compare-d2-vs-plantuml.png",
    "path": "/compare/d2-vs-plantuml",
    "published": "2026-10-01",
    "section": "tools",
    "title": "D2 vs PlantUML for AI agents, B 65.3 vs B 66.9 | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/d2-vs-plantuml"
  },
  "tokens": {
    "markdown": 2050,
    "slim": 430
  },
  "version": 1
}
