A table row taller than one page had nowhere to go. Rows are laid out as cells side by side, so the page splitter had no valid place to break one, and the next page could not fit it either. It gave up and failed the request — one awkward table took the entire document with it.
Those documents now render.
What changed
Table rows split across pages. A row taller than the page is broken cell by cell at the same height, so the continuation keeps its column widths, alignment and borders. The exhausted columns carry on as empty cells rather than collapsing, so the table still reads as a table. Rows that fit on a page of their own are still moved intact — ordinary tables paginate between rows exactly as before.
Blockquotes, GFM alerts, code blocks and list items taller than a page split too. Short ones stay atomic, unchanged; the split only happens when the block cannot fit on a fresh page anyway.
Unbreakable text — a 20,000-character token in a code block, a 5,000-character word in a paragraph — now wraps and paginates instead of failing.
Cramped geometry is handled: small page sizes with large fonts, deeply indented lists, and margins that leave only a sliver of usable height all paginate now.
What this means for you
If you have ever seen a 500 from /api/v1/md, /api/v1/preview or /api/v1/render on a document with a big table or a long quoted block, retry it. Nothing about your markdown or DSL needs to change.
Pagination is now best-effort rather than all-or-nothing. In the rare case where something genuinely cannot be broken — an image taller than the page, say — that one block is placed on its own page and clipped at the edge, and the rest of the document still renders. Losing one block beats losing the document.