Skip to content

Changelog

Notable changes to the Papermill editor, the Press document language and typesetting API, and the MCP server, newest first.

2026-08-02

Added

  • Right-to-left text — Arabic and other right-to-left scripts now render correctly.
  • Presence in the editor — see who else has a template open: connected collaborators appear as coloured avatars beside the template name, with their cursors and selections shown live in the document.
  • Chart axis and grid control — hide either axis on a bar or line chart with y-axis / x-axis, or hide just its ticks, tick labels, axis line, or gridlines with y-ticks/x-ticks, y-tick-labels/x-tick-labels, y-line/x-line, and y-grid/x-grid. show-grid toggles the background grid. See Visualisations.
  • Bar sizing and spacingbar-width pins a bar to an exact thickness and bar-max-width caps it while leaving narrower bars alone; bar-gap sets the space between categories and the new bar-group-gap the space between the bars within one category, and both now take a dimension like 6pt as well as a fraction.
  • Per-point colour — a chart data point can set its own color and label.color to highlight a single value without splitting it into its own series.
  • Markdown code samples — fenced code blocks and inline code spans inside a type="markdown" flow are now treated as literal text, so a Press tag — or the flow's own closing tag — can appear inside a code sample without escaping it.
  • Wrapping rows — a direction="row" frame with row-wrap="true" now wraps its children onto further rows anywhere, not only inside a chart legend, which suits tag or chip lists.
  • Repeated table headers — set repeat-header="true" on <table> and its <thead> reprints on every page the table continues onto. See Block attributes.

Fixed

  • A table cell's direction attribute is honoured — <td direction="row"> lays its children across the cell instead of down it, as already documented.
  • A break="group-children" block reading a flow no longer fails with Unexpected Error. Please contact Papermill — it renders correctly instead.
  • Fixed an issue with space-before and siblings ahead of it using height="fill" or width="fill".
  • The editor's auto-indent and syntax highlighting — pressing Enter indents consistently across commented-out tags, multi-tag lines, and JSON/CDATA/comment blocks, and highlighting no longer breaks on things like a single-quoted type='json' or a closing tag at the end of a markdown heading.
  • Open Template names who last opened a workspace template instead of showing an internal id, and groups templates nobody has opened yet under "Not opened yet".

2026-07-10

Added

  • Stretch sizing — set width="stretch" or height="stretch" to have a block fill its container's cross axis.
  • Justified alignmenth-align="justify" and v-align="justify" distribute content evenly across a frame.
  • Machine-readable error codes/v2/pdf error responses carry a data.code you can branch on instead of matching message text.

Changed

  • null behaves as absent — a null in your data is falsy in show-if and renders as nothing through {{ }}, exactly like a missing field.
  • More accurate HTTP status codes — an invalid API key returns 401 (was 403), a missing template 404 (was 400), an authoring mistake 400 (was 401), and a render timeout 504 (was 408).

Fixed

  • Superscripts in fonts without OS/2 metrics raise correctly instead of sitting on the baseline.
  • <donut-plot show-labels="false"> fills its box instead of reserving room for labels it never draws.
  • Custom fonts — an unreadable font is rejected with message Couldn't read the font at <src>. It isn't a valid TTF, OTF, WOFF or WOFF2 font., and a document using two WOFF2 fonts renders reliably.
  • Data errors point at the problemInvalid JSON cites the line and column, and Invalid CSV the row.
  • Rejections say where to look — they carry at <tag> (line:col), cite the data value behind the failure, and say whether the location is in your template or your payload.
  • Overflow rejections name the element that actually overflowed, report the axis, and give needed-versus-available measurements rather than blaming the enclosing component.
  • Authoring mistakes are rejected with actionable messages — a page sharing a component's name, <repeat> over a flow group, an empty <border> value, an out-of-range y-dp or value-dp, and a bare <li> outside a list.
  • validate_press reports every finding in your document at once rather than stopping at the first, and no longer reports advisory warnings as blocking.
  • The PDF stays usable while it re-renders — you can scroll, zoom, and select during a render, and a badge shows progress.
  • The editor says Can't open document when it cannot confirm your access, instead of retrying forever behind a "Reconnecting" spinner.
  • Error text appears verbatim, no longer title-cased, so you can search for the message you were given.
  • Signing up no longer fails at the profile-setup step.

2026-07-03

Added

  • Rows that split across pages — set break="auto" on a <tr> and a row taller than the page splits mid-cell instead of being rejected. Rows keep break="never" by default.
  • Flows inside table cells<flow name="…" /> in a <td> reads its flow and resumes correctly across pages.

Fixed

  • Glued content at a line break10<sup>2</sup> no longer splits across two lines.
  • Missing spaces around inline elements — text flanking <code>, <em>, or <sup> no longer runs together.
  • prevent-last orphan control no longer drops content from your PDF, and no longer rejects a document where a heading could never share its page.
  • Styles on standalone images<styles> rules targeting img and qr-code apply instead of being silently ignored.
  • Tables whose columns sum to 100% fit their page instead of being rejected as overflowing.
  • Long unbroken text in a cell — a hash, URL, or key too wide for its column breaks to fit instead of rejecting the table.
  • The problems banner lists errors and warnings with jump-to-line, and your last good PDF stays on screen instead of being covered.
  • Pasted data URIs are no longer hidden behind a blank band in the editor.

2026-06-26

Fixed

  • Nested lists at a page break — a prevent-last="true" list item carries its nested list with it to the next page instead of dropping the sub-list.
  • Headings next to a counter — a prevent-last element followed by <counter-define> moves to the next page instead of disappearing.
  • Counter resets at a page break — a <counter-define> landing on a page boundary applies its reset, so section numbering no longer carries the previous section's increment.
  • Rotated content held to a later page keeps the width and height you declared instead of rendering with them swapped.

2026-06-19

Added

  • Starter templates when creating a template — begin from a Letter, Report, or Invoice starter instead of only a blank template, with a suggested name you can overwrite.

Fixed

  • Third-level list bullets render as bullets instead of empty boxes when your body font lacks the glyph.
  • Nested list markers restart their sequence, so an <ol> inside a <ul> numbers from 1..
  • Watermarks on MCP renders follow your plan, so paid plans no longer get the free-tier watermark.

2026-06-12

Added

  • Modern Invoice template — a new invoice with automatic table sizing and page breaking, available in the editor and renderable with template_id=papermill-modern-invoice.

Changed

  • Modern Letter and Modern Report have been redesigned, and their flows renamed: in papermill-modern-letter, signature is now signoff; in papermill-modern-report, contents-footer is now toctext, and financials has been replaced by data.financials. A payload flow replaces a template flow by name, so rename any flow in your payload that targets an old name.
  • Generated PDFs identify their originPapermill (https://papermill.io) appears as producer and creator in your reader's document properties.

Fixed

  • The preview no longer flashes a loading skeleton and reloads when you switch back to the source editor.

2026-06-05

Added

  • API key regeneration — regenerate a key from the API Keys settings page. The old key keeps working for 7 days so you can migrate, and you can delete a superseded key immediately from the "Scheduled for deletion" list.
  • Starter templates on sign-up — new accounts are seeded with Modern Report, Modern Letter, and Modern Invoice, and a welcome modal lets you open one.
  • Copy your API request from the editor — the API button opens a ready-to-paste request for the template you're editing.

Fixed

  • Horizontal bar-plot labels — on a <bar-plot flip="true" show-labels="true">, the label on the longest bar is no longer clipped.
  • Editor autocomplete only suggests where Press expects a tag, attribute, or value, instead of interrupting prose.
  • The PDF preview renders your current editor content rather than an earlier snapshot.
  • Editor ligatures-->, <=, and != display as the characters you typed.
  • Signing up no longer fails with a server error.

2026-05-22

Added

  • page-rotation — set page-rotation="90", "180", or "270" on an element and the whole page containing it renders rotated clockwise. Page numbers and outline entries still refer to the same logical page.
  • Page overage in Quota settings — usage bars show a +N over badge when you pass your monthly cap.

Changed

  • The free plan includes 250 pages per month. Accounts created before the free plan keep their existing allowance.
  • Inverted font-size bounds are rejected — when font-size-min exceeds font-size-max, Papermill rejects the document with message font-size-min (Xpt) must be less than or equal to font-size-max (Ypt) instead of silently swapping them.
  • An invalid or revoked API key returns 401 rather than 403, so clients stop retrying it as a permissions problem.

Fixed

  • text-shadow with a parenthesised colour1pt 2pt rgba(0, 0, 0, 0.4) keeps its colour instead of splitting on the spaces inside the brackets.
  • Payload data reaches Markdown inside components — a {{ data.* }} expression inside <markdown inline="true"> in a component resolves against the data you post rather than the template default.
  • Repeating pages that list several flows<page repeat="true" flow="a;b"> keeps going until every listed flow is drained, so content no longer goes missing.
  • Renaming a template — the dialog opens pre-filled with the current name, and renaming works on templates that previously refused.
  • Signing in with the wrong password shows Incorrect email or password. Please try again. instead of failing silently.

2026-05-15

Added

  • Free plan — new accounts start on a Free plan with a monthly page allowance, and Settings → Usage shows a separate Draft pages bar alongside Pages.

Fixed

  • Inline <code> no longer hyphenates, so identifiers and paths inside a hyphenated paragraph stay intact.
  • Per-item colours in visualization legends — a {{ }} expression in font-color on a <repeat> applies the iteration's colour instead of the literal expression.

2026-05-08

Added

  • Markdown payloads — POST text/markdown to /v2/pdf with a template_id and your Markdown fills the template's body flow. Use ?flow= to target a different one.
  • Bearer authentication — send your API key as Authorization: Bearer <key> as an alternative to x-api-key.
  • Typography inherits through flows and componentsfont-size, font-family, and font-color set on the frame holding <flow name="body" /> now apply to the flow's content. Layout properties such as padding, margin, and width deliberately do not cross that boundary.

Changed

  • An unsupported content type tells you what's accepted — Papermill rejects the request with message Unsupported Content-Type '<sent>'. Supported: text/xml, application/xml, text/plain, application/json, text/csv, text/markdown.
  • Malformed JSON is rejected with the line and columnInvalid JSON body: <reason> (line N column M), and an empty body returns Request body is empty for Content-Type: application/json.

Fixed

  • Code set in JetBrains Mono renders — documents containing </, />, <>, or => in that family no longer fail. Programming ligatures do not form in it.
  • Hyphenated words are carried whole to the next page instead of stranding half a word at the foot of the previous one.
  • Charts and legends inherit the template's typography when you render through template_id.

2026-05-01

Added

  • Public templates — pass template_id=papermill-modern-report, papermill-modern-letter, papermill-simple-report, or papermill-invoice to /v2/pdf and render a ready-made document without creating one first. An unknown papermill-* id is rejected with a message listing the available templates.
  • <donut-plot> — draw a donut or pie inside <visualization>. Set cutout (default 50%; 0% gives a pie), pick a label-format of name, value, percent, name-value, or name-percent, and control labels with show-labels.
  • Dual y-axis charts — set y2="true" on <line-plot> or <bar-plot>, mark a series "axis": "right", and style the second axis with y2-label, y2-min, y2-max, y2-dp, y2-prefix, y2-suffix, y2-separator, and y2-label-color.
  • Grouped sub-series — nest a relatedSeries array inside a series to break it into children that inherit the parent's colour, line style, and axis, each stylable with lineStyle (solid, dashed, dotted), dashLength, and gapLength.
  • <legend-key> — build a legend swatch reproducing the exact colour and dash pattern the plot draws. Name the series with series, scope to a child with related-series, and size it with width, height, and marker.

Changed

  • Documents render substantially faster — text-heavy reports return around three times quicker, and image-heavy templates up to five times quicker.

Fixed

  • Wide tables auto-rotate again — a table that overflows the page width rotates to landscape instead of failing with Table columns are too narrow, including when the rule sits on an alias or the content arrives through a <flow> reference. Content around the break is no longer duplicated.
  • Table-of-contents entries and internal links resolve — a heading that forces a page break keeps its slug, so entries are no longer blank and links land on the right anchor. Headings inside a <repeat> get a distinct slug per iteration.
  • Words in tightly-fitting table cells stay whole instead of splitting into fragments.
  • Base64 SVG data URIs work in <img>.
  • Images render inside visualization legends instead of leaving a blank frame.

2026-04-24

Added

  • Self-serve billing — subscribe from account settings, and manage or cancel an existing subscription through the billing portal. Your page quota follows the plan automatically when you upgrade, cancel, or reactivate.
  • Named API keys — give a key a human-readable label, and rename it later, from the API Keys settings page.
  • Email verification — a guided sign-up flow with a password-strength meter, a resend option on the forgotten-password screen, and a banner that walks you through confirming your address. Account settings stay locked until your address is verified.
  • absolute on <value> — bind a number as its absolute magnitude, dropping the sign.
  • stacked="true" on <bar-plot> and <line-plot> — stack series instead of grouping them.
  • marker-font-size on chart visualisations — size chart labels explicitly, or use marker-font-size="auto" for the default.
  • marker-flip — invert bar-plot label orientation when a bar is too short to hold its label inside.
  • fill-start and fill-end on <line-plot> — fade a gradient fill beneath a series.
  • forecast-dash — set a custom dash pattern on the forecast portion of a line plot.
  • break-before="auto" — unset an inherited frame break for a single child, restoring normal flow.
  • separator on <value> — group thousands in formatted numbers.

Changed

  • Large documents no longer hit a response size limit. Long reports and image-heavy documents that previously failed at 32 MiB now render and download normally.
  • PDF viewer zoom scales proportionally to a trackpad pinch or Ctrl/Cmd + wheel, and anchors on the pointer, so the page no longer jumps as you zoom.
  • Data-driven documents render faster on first request, including images referenced from a <data type="json"> block.
  • Active API keys are capped at 50 per user. Existing keys above the cap keep working; issuing a new key requires revoking an old one first.

Fixed

  • Line-plot markers appear at the exact (x, y) you declare, including coordinates that fall between series points.
  • The last row of a tightly-fitting grid no longer disappears.
  • Trailing blank pages no longer appear on documents whose conditional sections leave a page with nothing to show.
  • Rotated tables honour page breaks inside nested <repeat> blocks, and apply-if predicates resolve correctly on repeated rows. Auto-rotation only applies when a column would genuinely overflow.
  • XML samples inside code blocks render correctly instead of breaking the surrounding document.
  • Nested components keep their content intact through several layers of expansion.

2026-03-26

Added

  • <schema> — validate the incoming data payload against JSON Schema. Papermill rejects a violating payload with a structured error before rendering.
  • JSON and CSV payloads on /v2/pdf — POST application/json or text/csv against a template_id and the body merges into the template's default <data>, so you send only the fields that change.
  • <markdown inline="true"> — embed an inline Markdown run inside a Press document, preserving its line breaks. Block-level Markdown is not supported: Papermill rejects the document with message <markdown> requires inline="true". Block-level markdown is not yet supported.
  • Forecasts and markers on line plots, through a series-based data format that carries forecast and marker metadata alongside the points.
  • text-transform"upper", "lower", and "title" on inline and block elements.
  • apply-if conditional styles — apply a style only when a predicate holds.
  • index on <repeat> — expose the current iteration index for conditional logic and styling.
  • Variable indexing in data expressions — name the index with <repeat index="i">, then read data.items[i].label.
  • Automatic heading slugs in Markdown — headings become targets for cross-references and the table of contents without an explicit id.
  • break-before — force a page break before a frame.
  • gap on <frame> — space children evenly in horizontal and vertical frames.
  • scale on <img> — choose how an image fills its container when you set both width and height: contain, cover, or stretch.
  • Row wrapping on horizontal <frame> — children wrap onto a new row when they exceed the container width.
  • columns on <grid> — lay out cells automatically instead of positioning each one.
  • Word hyphenation for justified text.
  • text-align="justify".
  • Press syntax highlighting for embedded JSON, CSV, and Markdown in the editor.
  • New PDF viewer — opens at fit-page-width, zooms more smoothly, and holds your position as the document re-renders.
  • Mobile editor — a drawer menu makes the editor usable on a phone.

Changed

  • Overflow rejections name the element that overflowed and the chain of containers it sits in, so Not enough space in parent for <element> now comes with a trace you can act on.

Fixed

  • Page margins set on <page> override the same property on <document>.
  • Table-of-contents page numbers resolve on deferred pages instead of leaving the MMMM placeholder.
  • Wide tables breaking across pages keep every row.
  • Valid tables with tight page breaks are no longer rejected for containing an empty row.
  • Table columns that sum to fractionally more than the available width lay out correctly instead of overflowing.
  • The PDF preview updates on the first Cmd+Enter after you open a document.
  • Schema validation runs when a JSON payload is sent against a template_id.
  • <markdown inline="true"> keeps explicit line breaks.
  • odd() and even() predicates apply to the correct row inside a <repeat>.
  • direction on <frame> accepts a data expression, so layout direction can be data-driven.
  • The JSON formatter leaves invalid JSON alone instead of inserting blank lines.
  • Reconnecting the editor no longer renders the PDF twice or flashes a loading skeleton.
  • The editor no longer flickers when you switch tabs.

2026-02-23

A typography and layout-control release.

Added

  • font-weight — a first-class style property taking numeric weights and named keywords, mapped to the closest available cut.
  • letter-spacing and word-spacing for fine-grained typographic control.
  • target and id on frames and inlines — link to a specific element rather than only to a page.
  • Standard library v2 — a refreshed set of built-in components and utilities. Templates can opt into either generation while you migrate. See Standard Library.
  • WebP images.

Changed

  • Lining figures are used by default in PDF output, replacing old-style figures for cleaner numeric tables.
  • Very long unbroken tokens such as URLs and identifiers break rather than overflow their container.

Fixed

  • Breaking inside a component no longer duplicates the component's content on the next page.
  • Outline entries with an unknown source are rejected with source-location information instead of an opaque error.
  • Rejected documents carry the underlying diagnostic rather than a generic wrapper message.
  • Tables with tight columns or rotated layouts size correctly.
  • The same font family used at several weights renders consistently.

2026-01-28

Visualisations land: charts are now native Press elements.

Added

  • Visualisations — donut, pie, bar, line, and area charts as native Press elements (<x-donut>, <bar-plot>, <line-plot>). See Visualisations.
  • Landscape pages — via orientation on <page>, or a format suffix such as A4-landscape.
  • Assets — declare images, colours, and reusable data once in <assets> and reference them from anywhere in the document.
  • <line-plot> axis configurationy-label, x-label, y-prefix, y-suffix, y-dp, y-separator, y-min, and y-max.
  • <x-donut> limitslimit and limit-color for partial-fill charts, such as progress against a target.
  • Total pages — a primitive for "Page X of Y" footers.
  • name on <data>, and multiple <data> blocks in a single template, with defined merge semantics.
  • Boolean literals in data instructions.
  • Border radius on block and inline images.
  • <frame-break> — an explicit frame-level break.
  • Counter formats — numeric and alphabetic — for outline numbering.
  • Outline entries<repeat> over the document outline, named-destination cross-references, page references, and outline data in expressions.
  • Anonymous flows — a flow no longer needs a name, simplifying templates that only have one.

Fixed

  • Table borders are centred on the cell boundary, removing sub-pixel asymmetry between adjacent cells.
  • Page references through data variables resolve correctly.
  • Inline images with no declared size are skipped rather than rendered at zero size.
  • Invalid base64 in an image source is rejected with an actionable message.
  • <frame-break> as a frame's first child is rejected with a clear message instead of producing ghost pages at the end of the document.
  • Documents rendered concurrently produce correct <repeat> output.
  • The editor reconnects reliably after a network drop.
  • Lone < and > characters in content no longer break the surrounding document.

2025-12-18

Added

  • Document outline — structured <outline> rendering with cross-references and page-number resolution, plus built-in table-of-contents support. See Table of Contents.
  • Frame rotations as a first-class layout primitive.
  • Counter pop and re-increment for advanced numbering schemes.
  • <repeat over="outline"> — repeat over outline entries.
  • Anchor links align to the text baseline.
  • Headings join the outline automatically, and outline names the tree an entry is filed under.

Changed

  • Documents with many repeated data references render faster.

Fixed

  • A <span> inside a content <repeat> no longer rejects the document.
  • Multiple style aliases can be applied to one element.
  • A style alias named by a data expression resolves correctly.
  • List items space correctly, and no longer disappear under certain nesting patterns.
  • Headings break to a new page rather than being orphaned at the foot of the previous one.
  • Vertical text centring balances line height above and below the baseline.
  • A popped counter displays its own value rather than the value at the level above.
  • Empty <span>s, invalid colour values, and frame wrap edge cases are rejected with actionable messages instead of generic failures.
  • The editor no longer disconnects immediately when you resume a session.
  • Underlines render correctly.
  • Absolutely-positioned elements ignore the parent's padding, as documented.
  • Absolute images scale to their declared size rather than the source's intrinsic dimensions.
  • Capitalised data keys are preserved through resolution.
  • "Cannot iterate over a data leaf" rejections carry source-location information.
  • Zero-width frames are rejected with a message naming the frame.

2025-11-26

Added

  • Automatic image cropping — an imported image is cropped to its salient region when the frame's aspect ratio differs from the source. See Images.
  • Named destinations in PDF output, used by both the table of contents and arbitrary cross-references.
  • Outline cross-references — link to an outline entry by name, with automatic page-number resolution.
  • <repeat> over outline entries — generate tables of contents and figure indexes from the document structure.
  • Counter formats — numeric and alphabetic — for outline numbering.
  • Frame rotations, including rotated children with correct bounds.
  • Deferred pages — a page whose content depends on the finished document, such as a cover showing a computed page count.
  • min-width is respected during frame layout.

Fixed

  • Vertical text centring balances line height above and below the baseline.
  • Rotated content is placed consistently.
  • Orphan lines are prevented in documents where they previously slipped through.
  • An empty request body is rejected with a message naming the missing field, rather than an unexpected error.

2025-11-08

Papermill and the Press document language are generally available.

Added

  • The Press document language — an XML-based, print-native language for defining page layouts, typography, content flows, components, and data bindings.
  • The PDF API/v2/pdf for rendering Press documents from templates and payloads.
  • The editor — a browser-based editor with live preview, real-time collaboration, and template management.
  • Templates and payloads — store a template and render it against a per-call data payload, with defined merge semantics for overrides.
  • The standard library — built-in components for headings, tables, lists, code blocks, headers, and footers.
  • Outline and table of contents, with automatic page-number resolution.
  • Image, font, and asset management, supporting PNG, JPEG, and SVG.
  • Accounts and quotas, including API keys and per-user page quotas.

To get started, see the Quickstart and Core concepts.