Plota docs

12. Known limitations

Collected from the code, from its comments, and from driving the app. Nothing here is a plan; it is what the thing does not do today.

Rendering and export#

  • PDF artwork is a raster. Page geometry is vector-exact (media box in points, multi-page splitting, A4 tiling), but the artwork is a JPEG at 200 dpi by default, so PDF text is not selectable or searchable and deep zooms show pixels. This is deliberate: the PDF is rasterised from the exporter's own SVG so the two can never look different. dpi: 300 is the print setting.
  • SVG, PNG, draw.io and Mermaid are per page. Only Plota JSON and PDF cover a whole multi-page document in one file; exporting the others with scope All pages writes one file per page.
  • Mermaid export is a flowchart projection (a sequence diagram exports as sequenceDiagram). Shape kinds collapse to the handful of Mermaid node shapes; styling, layers, data and pages are dropped.
  • A document theme change rewrites the theme's style keys. Per-node overrides survive, but there is no per-page theme.

Import#

  • A foreign SVG becomes one image node. Only SVGs this app wrote are re-read as a real document. The importer says which one you got.
  • Mermaid import covers 13 diagram types (see Mermaid diagrams). Charts and grids — gantt, pie, quadrantChart, xychart, sankey, packet, kanban, radar-beta, treemap-beta — and zenuml are refused by name.
  • Icons and service tiles from captions are an MCP-server feature. A Mermaid chart pasted into the editor keeps plain shapes; add icons from the Icons panel.
  • The PlantUML reader is a deliberately small subset: declarations (participant, actor, class, component, database, entity, usecase, …), the arrow spellings, [*] terminals and title. Skinparams, notes, packages and nested blocks are ignored.
  • Lucidchart import reads the clipboard's text/html flavour, not .lucid files. Unknown block classes fall back to a plain rectangle rather than dropping the paste.
  • draw.io shapes outside the mapped style vocabulary become rectangles. The warning list in the import dialog names what was approximated.

Routing#

  • Smart Route plans orthogonal and Smart connectors with both ends on a shape and no hand-placed waypoints together. Elbow, straight, curved, waypointed and free-ended connectors are drawn one at a time, so they are not spread along a shape's side or kept apart from their neighbours.
  • On very large pages routing is the slowest part of redrawing; turn Smart Route off while you rearrange, or set the busiest connectors to elbow.
  • Keeping parallel runs apart is best-effort. Where there is no room, two connectors can still share a run.

Text#

  • Auto-fit does not apply to containers and renderer-driven kinds: plane, group, fragment, lane, lifeline, activation and image are skipped and reported as skipped, because sizing them from their own label would collapse them over their children.
  • ERD attribute rows are drawn by the ERD stencil, not the shared label renderer. The shared renderer treats a newline as ordinary whitespace and re-wraps the body into a centred block, which cannot line an attribute up with its divider. Consequence: inline markup (**bold**, links, …) does not apply inside attribute lines — only in the entity name.
  • The same is true of the other content-driven stencils (table, umlClass): their body text is a model, not prose.

Persistence and AI#

  • No autosave, no server, no accounts, no collaboration. Ctrl/⌘ S writes to localStorage; clearing site data deletes it. Export JSON for anything that matters.
  • WebLLM needs WebGPU and a one-off download of roughly 1.5 GB. Without WebGPU the panel says so and downloads nothing.
  • Embeddings need the model CDN on first use (~23 MB, then cached). Offline the semantic features degrade to lexical similarity and say so.
  • Ollama cannot be reached from a file:// page — there is no origin to put in OLLAMA_ORIGINS. Serve the single-file build over http:// if you want a local model with it.
  • The single-file build stubs the three heavy in-browser models — WebLLM, transformers.js (embeddings) and background removal — because inlining them would add gigabytes. It does not stub the network providers: Ollama and any OpenAI-compatible server work normally, since they are plain fetch calls. Serve the file over http:// rather than opening it as file://, or the browser sends a null origin that Ollama's CORS check rejects.
  • A model can produce a valid but wrong plan. The op schema is enforced, so it cannot corrupt the document, but it can still propose nonsense — which is why nothing is applied without a preview.

Everything in Plota runs in your browser — no account, no server, no telemetry.