{
  "openapi": "3.1.1",
  "info": {
    "title": "Sketchboard API",
    "version": "1.0.0",
    "summary": "Deterministic tools for people and AI agents.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://sketchboard.usefulweb.app"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "sketchboard-drawio-to-svg",
                "sketchboard-mermaid-to-diagram",
                "sketchboard-auto-layout"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/sketchboard-drawio-to-svg/calculate": {
      "post": {
        "operationId": "calculateSketchboardDrawioToSvg",
        "summary": "Convert a draw.io (diagrams.net) or Excalidraw file into a clean SVG and an editable board.",
        "description": "Reads a .drawio / diagrams.net XML file (plain or compressed pages) or an Excalidraw .excalidraw file, maps shapes, connectors, arrowheads, labels and styles to Sketchboard, and returns a standalone SVG plus a Sketchboard board you can keep editing. It lists what was mapped and what was drawn as a plain shape.\n\nMethodology:\n- Compressed pages are decoded the way diagrams.net writes them: base64 → raw DEFLATE (RFC 1951, inflated by the platform’s own decoder with a 30 MB cap) → URI-decoding → XML. Plain pages are read directly. No DTDs or external entities are processed.\n- Every mxCell with vertex=\"1\" becomes a shape at its mxGeometry (children of groups and containers are offset by their parents). The style’s shape name or first keyword picks the Sketchboard shape (ellipse, rhombus → diamond, cylinder3 → cylinder, process → predefined process, mxgraph.flowchart.* → the matching flowchart shape, note, actor, cloud, document …); unknown shapes are drawn as rectangles and listed in the warnings.\n- Edges (edge=\"1\") become connectors glued to their source and target; exitX/exitY and entryX/entryY on a side become that port. edgeStyle=orthogonal/elbow → elbow route around shapes, curved=1 → curved, otherwise straight; waypoints are kept. Arrowheads map by name (classic/block → triangle, open → arrow, oval → circle, diamond, ER crow’s feet …; endFill=0 → the open variant).\n- Styles: fillColor, strokeColor, strokeWidth, dashed, opacity, rotation, fontColor, fontSize (× 1.15 for the larger default type), align. HTML labels keep their text with line breaks; markup is removed.\n- Excalidraw: rectangles, ellipses, diamonds, bound text (as the shape’s label), text, arrows and lines with bindings and arrowheads, freedraw strokes and frames are imported; roughness above 0 on most elements switches the board to the hand-drawn style. Images and embeds are skipped and counted.\n- The SVG is drawn by Sketchboard’s renderer, so line jitter in the hand-drawn style is seeded by the element ids and identical on every run.\n\ndraw.io and diagrams.net are trademarks of JGraph Ltd; Excalidraw is a trademark of its owners. Sketchboard reads files you provide and is not affiliated with either project. Shape libraries are not copied: unknown stencils become plain rectangles.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "sketchboard_drawio_to_svg",
        "x-owner-app": "sketchboard",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SketchboardDrawioToSvgInput"
              },
              "examples": {
                "example1": {
                  "summary": "Order handling flow (plain draw.io XML)",
                  "value": {
                    "diagram": "\u003cmxfile host=\"Sketchboard sample\"\u003e\u003cdiagram id=\"p1\" name=\"Order handling\"\u003e\u003cmxGraphModel dx=\"800\" dy=\"600\" grid=\"1\" gridSize=\"10\"\u003e\u003croot\u003e\u003cmxCell id=\"0\"/\u003e\u003cmxCell id=\"1\" parent=\"0\"/\u003e\u003cmxCell id=\"a\" value=\"Order received\" style=\"rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;\" vertex=\"1\" parent=\"1\"\u003e\u003cmxGeometry x=\"40\" y=\"40\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"b\" value=\"In stock?\" style=\"rhombus;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;\" vertex=\"1\" parent=\"1\"\u003e\u003cmxGeometry x=\"50\" y=\"150\" width=\"120\" height=\"80\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"c\" value=\"Pack and\u0026lt;br\u0026gt;ship\" style=\"shape=process;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\u003cmxGeometry x=\"40\" y=\"290\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"d\" value=\"Order from supplier\" style=\"shape=document;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\u003cmxGeometry x=\"260\" y=\"160\" width=\"140\" height=\"60\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"e\" value=\"Stock DB\" style=\"shape=cylinder3;whiteSpace=wrap;html=1;\" vertex=\"1\" parent=\"1\"\u003e\u003cmxGeometry x=\"280\" y=\"20\" width=\"80\" height=\"90\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"f\" value=\"Delivery note\" style=\"text;html=1;align=left;\" vertex=\"1\" parent=\"1\"\u003e\u003cmxGeometry x=\"200\" y=\"305\" width=\"120\" height=\"30\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"e1\" style=\"edgeStyle=orthogonalEdgeStyle;html=1;endArrow=classic;\" edge=\"1\" parent=\"1\" source=\"a\" target=\"b\"\u003e\u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"e2\" value=\"yes\" style=\"edgeStyle=orthogonalEdgeStyle;html=1;\" edge=\"1\" parent=\"1\" source=\"b\" target=\"c\"\u003e\u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"e3\" value=\"no\" style=\"html=1;endArrow=block;endFill=0;dashed=1;\" edge=\"1\" parent=\"1\" source=\"b\" target=\"d\"\u003e\u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003cmxCell id=\"e4\" style=\"curved=1;html=1;endArrow=oval;startArrow=diamondThin;startFill=0;\" edge=\"1\" parent=\"1\" source=\"b\" target=\"e\"\u003e\u003cmxGeometry relative=\"1\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003c/root\u003e\u003c/mxGraphModel\u003e\u003c/diagram\u003e\u003c/mxfile\u003e"
                  }
                },
                "example2": {
                  "summary": "The same diagram, compressed, in hand-drawn style",
                  "value": {
                    "diagram": "\u003cmxfile host=\"Sketchboard sample\" compressed=\"true\"\u003e\u003cdiagram id=\"p1\" name=\"Order handling\"\u003eUzV2zq1wL0osyPDNT0nNUTUySKlQNXZRNTKyMDAAkiCBSoiAGUwgvSgzBSJkiBAIzqxKhQqClRm7Ao0uys8vgbByK5xTc0DGw7RCzHLDIQs1uCCxKDUPaAJhDYkQDWWJOaVQZ/gXpaQWAYWKUpNTM8tSUyAKiksqc6AKivJL81KA4sYuhqrGTuUZmSWpwQWJySDZcmCAAMUySnJzoNJpmTk5zvk5+UVgvcYpiakWaclA8eKSovzsVCQZs2SL1KQ0oAzUQalFJanQEMXiKbAQ1Efuqfm5qSVFlUAlUA0m0ACHRgCMW56ZUpIB1Q8Ty0jNTM+AGmoGFUsshvDT4QYjAhDIgIYh9vBMwghPzzxw8OUnZ6sau2EGZkZ+blIp0EISAzItLc0oGWtAppglmZmaUScgTVED0hDGRw5JaAJDCUkLKoRkMkZIBiQCwxBoaB4wTZrlAK1ySgImVLN0EKs4I7MAI3CLMxILQMyCovzk1GIiApn6ac/Iko6JD5pXsWTmtKL8XFDYlBYU5GSCRHCEVEp+cmku2Kd0CCq4n2HJC8anR1ilYoRVMDiPGhm4QP2GJXiSK3MygWVfkTF9wgeWjWBpCTN4YCqQQweW4igJnTSM0HFJzQHWBmDn5eWXQEMPKYiA3gSlGqQQSMzJTM8DsnNS00Ay1AgQWE0KDRBjA1PiyiNjaiQYqHOR/Jyakp4aDOXmF5Vk5Kfn5yXmuCJEkYMjNS/FsagovxyUjHISi4szQaU3xEiQOfiDBGhtfmkROKkhKu2SxKL0VKgqcL2DGXBFqTmJJcB4QzGKolAAKkVLGZWpxZSFDHmBAK1pkQMBXGXQIxCMMQIhLx8jDLDHfVIOuCUAEnIDVulAEQMgLyWxOAPepKJaeIDrA3qEhwmG55NLi0BtR4iHsIdEPjD4wA2YxKISmFhKZmJufl5KSEYmsOSASCGFEtUCBlx8UT9ggFxEyx0sh9RDMHYFAA==\u003c/diagram\u003e\u003cdiagram id=\"p2\" name=\"Notes\"\u003e\u003cmxGraphModel\u003e\u003croot\u003e\u003cmxCell id=\"0\"/\u003e\u003cmxCell id=\"1\" parent=\"0\"/\u003e\u003cmxCell id=\"n\" value=\"Second page\" style=\"shape=note;\" vertex=\"1\" parent=\"1\"\u003e\u003cmxGeometry x=\"0\" y=\"0\" width=\"160\" height=\"80\" as=\"geometry\"/\u003e\u003c/mxCell\u003e\u003c/root\u003e\u003c/mxGraphModel\u003e\u003c/diagram\u003e\u003c/mxfile\u003e",
                    "style": "sketchy"
                  }
                },
                "example3": {
                  "summary": "An Excalidraw drawing",
                  "value": {
                    "diagram": "{\"type\":\"excalidraw\",\"version\":2,\"source\":\"sketchboard-sample\",\"elements\":[{\"id\":\"r1\",\"type\":\"rectangle\",\"x\":0,\"y\":0,\"width\":160,\"height\":70,\"angle\":0,\"strokeColor\":\"#1e1e1e\",\"backgroundColor\":\"#a5d8ff\",\"fillStyle\":\"hachure\",\"strokeWidth\":2,\"strokeStyle\":\"solid\",\"roughness\":1,\"opacity\":100,\"roundness\":{\"type\":3},\"groupIds\":[],\"isDeleted\":false},{\"id\":\"t1\",\"type\":\"text\",\"x\":20,\"y\":22,\"width\":120,\"height\":25,\"text\":\"Idea\",\"fontSize\":20,\"fontFamily\":1,\"textAlign\":\"center\",\"strokeColor\":\"#1e1e1e\",\"containerId\":\"r1\",\"isDeleted\":false},{\"id\":\"e1\",\"type\":\"ellipse\",\"x\":260,\"y\":-10,\"width\":140,\"height\":90,\"angle\":0,\"strokeColor\":\"#1e1e1e\",\"backgroundColor\":\"#b2f2bb\",\"strokeWidth\":2,\"strokeStyle\":\"dashed\",\"roughness\":1,\"opacity\":100,\"isDeleted\":false},{\"id\":\"a1\",\"type\":\"arrow\",\"x\":160,\"y\":35,\"width\":100,\"height\":0,\"points\":[[0,0],[100,0]],\"strokeColor\":\"#1e1e1e\",\"strokeWidth\":2,\"roughness\":1,\"opacity\":100,\"startArrowhead\":null,\"endArrowhead\":\"arrow\",\"startBinding\":{\"elementId\":\"r1\"},\"endBinding\":{\"elementId\":\"e1\"},\"isDeleted\":false},{\"id\":\"f1\",\"type\":\"freedraw\",\"x\":40,\"y\":120,\"width\":120,\"height\":20,\"points\":[[0,0],[30,12],[60,2],[90,16],[120,4]],\"strokeColor\":\"#e03131\",\"strokeWidth\":2,\"roughness\":1,\"opacity\":100,\"isDeleted\":false},{\"id\":\"x1\",\"type\":\"text\",\"x\":260,\"y\":110,\"width\":160,\"height\":25,\"text\":\"Prototype\",\"fontSize\":20,\"fontFamily\":1,\"textAlign\":\"left\",\"strokeColor\":\"#1e1e1e\",\"isDeleted\":false},{\"id\":\"gone\",\"type\":\"rectangle\",\"x\":0,\"y\":0,\"width\":10,\"height\":10,\"isDeleted\":true}],\"appState\":{\"viewBackgroundColor\":\"#ffffff\"}}",
                    "style": "file"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SketchboardDrawioToSvgResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/sketchboard-mermaid-to-diagram/calculate": {
      "post": {
        "operationId": "calculateSketchboardMermaidToDiagram",
        "summary": "Turn a Mermaid flowchart into a laid-out, editable diagram with an SVG export.",
        "description": "Parses the flowchart part of Mermaid (directions, node shapes, labelled and dotted links, chains, subgraphs), places the nodes with a layered layout so few lines cross, routes the connectors around the boxes and returns an SVG plus a Sketchboard board where every box and arrow can be moved and restyled.\n\nMethodology:\n- Supported: flowchart/graph with TB, TD, BT, LR or RL; node shapes [ ], ( ), ([ ]), [[ ]], [( )], (( )), { }, {{ }}, \u003e ], [/ /], [\\ \\], [/ \\], [\\ /]; links --\u003e, ---, -.-\u003e, ==\u003e, --o, --x, \u003c--\u003e, labels as --\u003e|text| or -- text --\u003e; chains (A --\u003e B --\u003e C), A \u0026 B --\u003e C, subgraph … end (drawn as a frame), %% comments. Styling lines (classDef, class, style, linkStyle, click) are ignored and counted.\n- Node size comes from its text (deterministic width estimate, wrapping at 260 units); decisions are drawn larger so their text fits the diamond.\n- Layout (Sugiyama et al. 1981): cycles are broken by reversing DFS back edges, each node gets the rank of its longest path from a source, long links get dummy nodes, 12 barycentre sweeps reduce crossings (the ordering with the fewest crossings wins), and median alignment passes straighten the links. Gaps: 50 units across, 70 along the direction.\n- Connectors are glued to the shapes and routed by Sketchboard’s router (orthogonal A* around the boxes with a bend penalty for the elbow style), so moving a box later keeps the arrows attached.\n\nOnly the flowchart subset of Mermaid is read; sequence, class and other Mermaid diagram types are not converted. Mermaid is an open-source project and not affiliated with usefulweb.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "sketchboard_mermaid_to_diagram",
        "x-owner-app": "sketchboard",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SketchboardMermaidToDiagramInput"
              },
              "examples": {
                "example1": {
                  "summary": "Sign-up flow with decisions",
                  "value": {
                    "mermaid": "flowchart TD\n  start([Visitor opens the sign-up page]) --\u003e form[Fill in name and e-mail]\n  form --\u003e valid{Is the e-mail valid?}\n  valid -- no --\u003e err[Show a clear error message] --\u003e form\n  valid -- yes --\u003e exists{Account exists already?}\n  exists -- yes --\u003e login[Offer to sign in instead]\n  exists -- no --\u003e create[(Create the account)]\n  create --\u003e mail[Send the welcome e-mail]\n  mail --\u003e done([Show the dashboard])\n  login --\u003e done"
                  }
                },
                "example2": {
                  "summary": "Release pipeline left to right, hand-drawn",
                  "value": {
                    "mermaid": "flowchart LR\n  code[Commit] --\u003e ci{{CI checks}}\n  ci --\u003e|green| stage[Deploy to staging]\n  ci -.-\u003e|red| fix[Fix the build] --\u003e code\n  stage --\u003e qa{QA OK?}\n  qa -- yes --\u003e prod([Release])\n  qa -- no --\u003e fix\n  subgraph Automated\n    ci\n    stage\n  end",
                    "direction": "",
                    "route": "elbow",
                    "style": "sketchy"
                  }
                },
                "example3": {
                  "summary": "Small graph with curved links",
                  "value": {
                    "mermaid": "graph TD\n  A((Hub)) --- B[North] \u0026 C[East] \u0026 D[South]\n  B --\u003e E[(Archive)]",
                    "route": "curved"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SketchboardMermaidToDiagramResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/sketchboard-auto-layout/calculate": {
      "post": {
        "operationId": "calculateSketchboardAutoLayout",
        "summary": "Tidy up a diagram automatically: layered flowchart layout or a balanced mind map.",
        "description": "Takes a Sketchboard board or a plain list of links (“A -\u003e B”) and arranges the boxes: a layered layout with few crossings for flowcharts and graphs in any direction, or a balanced left/right tree for mind maps. Returns the new positions, an SVG and the board file.\n\nMethodology:\n- Nodes are the board’s shapes, notes, texts and props that are not locked; links are connectors glued at both ends. From a link list every distinct name becomes a rounded box sized to its text.\n- Layered layout (Sugiyama et al. 1981): DFS back edges are reversed to remove cycles, ranks follow the longest path from the sources, long links get dummy nodes, barycentre sweeps (up to 12, the best ordering is kept) reduce crossings, and median alignment straightens links before overlaps are pushed apart. The result lists the number of crossings left between neighbouring ranks.\n- Mind map: a breadth-first tree from the root (the mind-map root shape, else the node with the most links); first-level branches go alternately right and left, whichever side is shorter so far, and every subtree is stacked vertically by its height.\n- The layout keeps the top-left corner of the old drawing and only moves boxes; glued connectors follow automatically.\n\nA layout is a starting point: very dense graphs keep some crossings, and nodes are not resized.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "sketchboard_auto_layout",
        "x-owner-app": "sketchboard",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SketchboardAutoLayoutInput"
              },
              "examples": {
                "example1": {
                  "summary": "Product plan from a link list",
                  "value": {
                    "edges": "Idea -\u003e Research\nResearch -\u003e Prototype\nPrototype -\u003e User test\nUser test -\u003e Prototype: needs changes\nUser test -\u003e Launch\nResearch -\u003e Budget\nBudget -\u003e Launch"
                  }
                },
                "example2": {
                  "summary": "The same links left to right with wider gaps",
                  "value": {
                    "edges": "Idea -\u003e Research\nResearch -\u003e Prototype\nPrototype -\u003e User test\nUser test -\u003e Prototype: needs changes\nUser test -\u003e Launch\nResearch -\u003e Budget\nBudget -\u003e Launch",
                    "direction": "LR",
                    "gapX": 60,
                    "gapY": 90
                  }
                },
                "example3": {
                  "summary": "Mind map board (template) re-balanced",
                  "value": {
                    "board": "{\"format\":\"sketchboard\",\"version\":1,\"name\":\"Project kickoff\",\"settings\":{\"grid\":20,\"showGrid\":true,\"snap\":true,\"sketchy\":false,\"unit\":\"m\",\"scale\":50,\"background\":\"#ffffff\"},\"layers\":[{\"id\":\"l1\",\"name\":\"Layer 1\",\"visible\":true,\"locked\":false}],\"elements\":[{\"id\":\"e3\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#64748b\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e1\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e2\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"e5\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e2\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e4\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"e7\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e2\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e6\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"e9\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e2\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e8\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"eb\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#64748b\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e1\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"ea\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"ed\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ea\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"ec\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"ef\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ea\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"ee\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"eh\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ea\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"eg\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"ej\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#64748b\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e1\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"ei\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"el\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ei\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"ek\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"en\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ei\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"em\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"ep\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ei\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"eo\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"er\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#64748b\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e1\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"eq\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"et\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"eq\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"es\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"ev\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"eq\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"eu\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"ex\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#64748b\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e1\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"ew\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"ez\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ew\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"ey\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"e11\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ew\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e10\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"e13\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2.5,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"ew\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e12\",\"port\":\"auto\"},\"route\":\"curved\",\"startHead\":\"none\",\"endHead\":\"none\"},{\"id\":\"e1\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":420,\"y\":159,\"w\":200,\"h\":64,\"rot\":0,\"text\":\"Website relaunch\",\"fill\":\"#dbeafe\",\"stroke\":\"#1d4ed8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":20,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-root\"},{\"id\":\"e2\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":690,\"y\":94,\"w\":130,\"h\":44,\"rot\":0,\"text\":\"Goals\",\"fill\":\"#dcfce7\",\"stroke\":\"#334155\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":17,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-topic\"},{\"id\":\"e4\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":890,\"y\":50,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"More sign-ups\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"e6\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":890,\"y\":100,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Faster pages\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"e8\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":890,\"y\":150,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Easier editing\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"ea\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":220,\"y\":44,\"w\":130,\"h\":44,\"rot\":0,\"text\":\"People\",\"fill\":\"#fef3c7\",\"stroke\":\"#334155\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":17,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-topic\"},{\"id\":\"ec\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Design: Mia\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"ee\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":50,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Code: Jonas\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"eg\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":100,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Content: Ada\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"ei\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":690,\"y\":244,\"w\":130,\"h\":44,\"rot\":0,\"text\":\"Timeline\",\"fill\":\"#fce7f3\",\"stroke\":\"#334155\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":17,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-topic\"},{\"id\":\"ek\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":890,\"y\":200,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Discovery (2 weeks)\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"em\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":890,\"y\":250,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Build (6 weeks)\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"eo\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":890,\"y\":300,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Launch in May\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"eq\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":220,\"y\":169,\"w\":130,\"h\":44,\"rot\":0,\"text\":\"Risks\",\"fill\":\"#fee2e2\",\"stroke\":\"#334155\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":17,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-topic\"},{\"id\":\"es\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":150,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Old links break\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"eu\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":200,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Content not ready\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"ew\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":220,\"y\":294,\"w\":130,\"h\":44,\"rot\":0,\"text\":\"Budget\",\"fill\":\"#e0e7ff\",\"stroke\":\"#334155\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":17,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-topic\"},{\"id\":\"ey\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":250,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Design 30 %\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"e10\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":300,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Development 55 %\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"},{\"id\":\"e12\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":0,\"y\":350,\"w\":150,\"h\":32,\"rot\":0,\"text\":\"Buffer 15 %\",\"fill\":\"none\",\"stroke\":\"#94a3b8\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":15,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"mind-leaf\"}]}",
                    "mode": "mindmap"
                  }
                },
                "example4": {
                  "summary": "Flowchart board laid out left to right",
                  "value": {
                    "board": "{\"format\":\"sketchboard\",\"version\":1,\"name\":\"Sign-up flow\",\"settings\":{\"grid\":20,\"showGrid\":true,\"snap\":true,\"sketchy\":false,\"unit\":\"m\",\"scale\":50,\"background\":\"#ffffff\"},\"layers\":[{\"id\":\"l1\",\"name\":\"Layer 1\",\"visible\":true,\"locked\":false}],\"elements\":[{\"id\":\"ea\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e1\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e2\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"eb\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e2\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e3\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"ec\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"no\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e3\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e4\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"ed\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e4\",\"port\":\"e\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e2\",\"port\":\"e\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"ee\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"yes\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e3\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e5\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"ef\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"yes\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e5\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e6\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"eg\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"no\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e5\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e7\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"eh\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e7\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e8\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"ei\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e8\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e9\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"ej\",\"type\":\"line\",\"layer\":\"l1\",\"x\":0,\"y\":0,\"w\":0,\"h\":0,\"rot\":0,\"text\":\"\",\"fill\":\"none\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":14,\"color\":\"#111827\",\"align\":\"center\",\"start\":{\"x\":0,\"y\":0,\"el\":\"e6\",\"port\":\"auto\"},\"end\":{\"x\":0,\"y\":0,\"el\":\"e9\",\"port\":\"auto\"},\"route\":\"elbow\",\"startHead\":\"none\",\"endHead\":\"arrow\"},{\"id\":\"e1\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":73,\"y\":60,\"w\":260,\"h\":66,\"rot\":0,\"text\":\"Visitor opens the sign-up page\",\"fill\":\"#dcfce7\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"terminator\"},{\"id\":\"e2\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":98,\"y\":196,\"w\":210,\"h\":48,\"rot\":0,\"text\":\"Fill in name and e-mail\",\"fill\":\"#ffffff\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"process\"},{\"id\":\"e3\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":64,\"y\":314,\"w\":277,\"h\":80,\"rot\":0,\"text\":\"Is the e-mail valid?\",\"fill\":\"#fef3c7\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"decision\"},{\"id\":\"e4\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":415,\"y\":480,\"w\":256,\"h\":48,\"rot\":0,\"text\":\"Show a clear error message\",\"fill\":\"#ffffff\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"process\"},{\"id\":\"e5\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":40,\"y\":464,\"w\":325,\"h\":80,\"rot\":0,\"text\":\"Account exists already?\",\"fill\":\"#fef3c7\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"decision\"},{\"id\":\"e6\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":92,\"y\":622,\"w\":221,\"h\":48,\"rot\":0,\"text\":\"Offer to sign in instead\",\"fill\":\"#ffffff\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"process\"},{\"id\":\"e7\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":363,\"y\":614,\"w\":188,\"h\":64,\"rot\":0,\"text\":\"Create the account\",\"fill\":\"#ffffff\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"database\"},{\"id\":\"e8\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":292,\"y\":748,\"w\":231,\"h\":48,\"rot\":0,\"text\":\"Send the welcome e-mail\",\"fill\":\"#ffffff\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"process\"},{\"id\":\"e9\",\"type\":\"shape\",\"layer\":\"l1\",\"x\":197,\"y\":866,\"w\":193,\"h\":48,\"rot\":0,\"text\":\"Show the dashboard\",\"fill\":\"#dcfce7\",\"stroke\":\"#1f2937\",\"sw\":2,\"dash\":\"solid\",\"opacity\":1,\"font\":\"sans\",\"size\":16,\"color\":\"#111827\",\"align\":\"center\",\"shape\":\"terminator\"}]}",
                    "mode": "layered",
                    "direction": "LR"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SketchboardAutoLayoutResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "Multi-tool workflows",
        "responses": {
          "200": {
            "description": "Workflow list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "SketchboardDrawioToSvgInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "diagram": {
            "title": "draw.io or Excalidraw file content",
            "description": "Paste the XML of a .drawio file (or the JSON of an .excalidraw file), or upload the file below.",
            "type": "string",
            "maxLength": 8000000,
            "default": ""
          },
          "diagramFile": {
            "title": "File (optional)",
            "description": "Used instead of the pasted text when given. Upload as {filename, contentType?, contentBase64}. Max 11719 KiB. Accepts .drawio,.xml,.excalidraw,.json,application/xml,text/xml,application/json.",
            "type": "object",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "page": {
            "title": "Page number (files with several pages)",
            "type": "integer",
            "minimum": 1,
            "maximum": 200,
            "default": 1
          },
          "style": {
            "title": "Drawing style",
            "type": "string",
            "enum": [
              "clean",
              "sketchy",
              "file"
            ],
            "default": "clean"
          }
        },
        "required": []
      },
      "SketchboardDrawioToSvgResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SketchboardMermaidToDiagramInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mermaid": {
            "title": "Mermaid flowchart",
            "description": "Starts with “flowchart TD” (or graph LR …). One link per line, for example A[Start] --\u003e B{OK?}.",
            "type": "string",
            "maxLength": 200000,
            "default": ""
          },
          "direction": {
            "title": "Direction",
            "type": "string",
            "enum": [
              "",
              "TB",
              "LR",
              "BT",
              "RL"
            ],
            "default": ""
          },
          "route": {
            "title": "Connector style",
            "type": "string",
            "enum": [
              "elbow",
              "straight",
              "curved"
            ],
            "default": "elbow"
          },
          "style": {
            "title": "Drawing style",
            "type": "string",
            "enum": [
              "clean",
              "sketchy",
              "file"
            ],
            "default": "clean"
          }
        },
        "required": []
      },
      "SketchboardMermaidToDiagramResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SketchboardAutoLayoutInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "edges": {
            "title": "Links, one per line",
            "description": "For example “Idea -\u003e Research” or “Research -\u003e Prototype: needs a budget”. A line with only a name adds a lonely box. Ignored when a board is given.",
            "type": "string",
            "maxLength": 200000,
            "default": ""
          },
          "board": {
            "title": "Or a Sketchboard board (JSON)",
            "description": "A .sketchboard.json file. Shapes that are glued to connectors are laid out; locked shapes stay.",
            "type": "string",
            "maxLength": 4000000,
            "default": ""
          },
          "mode": {
            "title": "Layout",
            "type": "string",
            "enum": [
              "auto",
              "layered",
              "mindmap"
            ],
            "default": "auto"
          },
          "direction": {
            "title": "Direction (layered)",
            "type": "string",
            "enum": [
              "TB",
              "LR",
              "BT",
              "RL"
            ],
            "default": "TB"
          },
          "gapX": {
            "title": "Gap between neighbours",
            "type": "integer",
            "minimum": 10,
            "maximum": 400,
            "default": 40
          },
          "gapY": {
            "title": "Gap between ranks",
            "type": "integer",
            "minimum": 10,
            "maximum": 400,
            "default": 60
          }
        },
        "required": []
      },
      "SketchboardAutoLayoutResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}