Known limits
The limits the editor has today: undo depth, table size, paste caps, PDF preview, touch support and the browser coverage that was measured.
Everything on this page is a limit of the editor as it ships. None of it is a bug report; it is what to expect before you build on top of it.
Editing
- No undo depth limit is configured. Long sessions can hold a lot of history.
- Find counts stop at 1000 matches, and the bar shows the count with a plus sign.
- Restart numbering has no menu or toolbar control. Only the numbered input rule, with a number above 1, sets it.
- Creating a synced reference has no menu item. The command exists and is tested, but no control runs it, so a user cannot make one yet.
- Mod+F opens the editor's find bar when focus is in the editor, in place of the browser's find.
- A markdown shortcut typed through an input method composition does not convert, for example
-then space on a Vietnamese IME. - Emoji data loads on first use, so the first
:may pause for a moment.
Tables and structure
- A table holds at most 50 rows and 20 columns, cannot sit inside another table, and its cells hold paragraphs only.
- The slash menu inserts a table at 3 by 3, and the table options menu has no size picker.
- Footnote definitions are top level only. A definition moved anywhere else becomes a paragraph.
- A
<sup>in pasted HTML stays plain text. Footnotes are not parsed from HTML. - Equations are capped at 4000 characters.
- A document with a code line, table row or table cell at the top level opens as unsupported.
Media
- Files need a
fileUploadadapter. Without one, dropped or pasted files are rejected with a notice, and the readable text of the media is kept. With one, each file becomes an image, video, audio or file block, up to 10 per paste or drop, and HTMLimg,videoandaudioelements are not stored. - Video and audio play only direct file links the browser can load. A YouTube or Vimeo page link is not turned into a player, and a link the browser cannot play shows as unavailable. Both players load on demand, the first time a block of that type is shown.
- The audio block shows its player alone: no card, no file name, no icon. The static output is the browser's own
<audio controls>in the same bounded column, so the two match. The player sends no CORS request, so a link on another site plays without CORS headers. - A PDF file block has a Preview action only when the browser's PDF viewer is on (
navigator.pdfViewerEnabled); without it, Download is the fallback. Preview fetches the file and the bytes must start with%PDF-within the first 1024 bytes. A file the browser cannot fetch, such as a cross-origin link without CORS, shows "This PDF can't be previewed." A PDF over 50 MB is not shown. - Page links have no URL in static output, so a read-only page needs no route for them.
Paste and size
- Paste is capped at 2000 blocks and 1,000,000 text characters, and HTML over 2,000,000 characters is dropped in favour of its plain text.
- Autosave waits 800 ms after a change by default, and a revision conflict asks the user to reload.
- The document limits are 20,000 nodes and 2 MB of JSON. Larger documents are not measured.
Browser and touch
- Browser support is measured, not certified. Core flows pass in automated runs on Chrome 154, Firefox and WebKit (Playwright builds) at 1280×900, and in Chrome and WebKit touch emulation at 390×844. Safari, iOS Safari, Android Chrome, VoiceOver and a real Vietnamese IME have not been tested by hand.
- Touch devices have no block menu. The block handle is hidden when the device cannot hover, and nothing else opens Turn into, Duplicate, Delete, Color or move for a block. The selection toolbar and the slash menu work on touch.
- The on-screen keyboard is not handled. Popovers do not follow
visualViewport, so the keyboard can cover them.
Performance
Measured up to 5,000 paragraphs on one machine: Apple M5, Chrome headless, production build of the demo app at 1280×900. Typing latency is measured from keydown to the frame after it, so it includes up to one frame of waiting.
- 1,000 paragraphs: mount 0.13 s, typing p50 8 ms and p95 10 ms.
- 5,000 paragraphs: mount 0.36 s, typing p50 20 ms and p95 24 ms.
- A keystroke does no work that grows with the number of blocks in the editor's own code. The rest of the cost at 5,000 paragraphs is in Plate's store and React.
- A text-only document loads about 2.0 MB of JavaScript (0.62 MB over the network). The video and audio players add about 0.6 MB when a document has such a block.
Related
- Document format for the rules behind the structural limits
- File uploads for what an adapter has to do