<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Carbone Changelog</title>
  <subtitle>New features, improvements and fixes of Carbone, the document generation and conversion engine.</subtitle>
  <id>https://carbone.io/changelog.xml</id>
  <link rel="self" type="application/atom+xml" href="https://carbone.io/changelog.xml"/>
  <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html"/>
  <updated>2026-10-06T12:00:00.000Z</updated>
  <icon>https://carbone.io/favicon.ico</icon>
  <logo>https://carbone.io/img/carbone-logo.svg</logo>
  <author>
    <name>Carbone</name>
    <uri>https://carbone.io</uri>
    <email>support@carbone.io</email>
  </author>
  <entry>
    <title>Carbone v5.15.4</title>
    <id>tag:carbone.io,2026:changelog/v5.15.4</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-15-4"/>
    <published>2026-10-06T12:00:00.000Z</published>
    <updated>2026-10-06T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Fix: DOCX templates using &lt;code&gt;:html(inline)&lt;/code&gt; in a paragraph with borders or tab stops no longer fail with the error &lt;code&gt;Cannot read properties of undefined (reading &amp;#39;type&amp;#39;)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.15.3</title>
    <id>tag:carbone.io,2026:changelog/v5.15.3</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-15-3"/>
    <published>2026-10-01T12:00:00.000Z</published>
    <updated>2026-10-01T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Fix: When converting HTML to PDF using Chrome, images could stop downloading after processing a web page that changed the Content-Security-Policy (CSP).&lt;ul&gt;
&lt;li&gt;Improved Carbone ICE (Instant Converter Engine), especially for DOCX to PDF conversions:&lt;ul&gt;
&lt;li&gt;If table of contents are saved with only first-level entries (common in Carbone templates), it is now rebuilt like Word does: deeper entries receive the correct styles and indentation. If a paragraph specifies a style not defined in the document, it now uses the default style instead.&lt;/li&gt;
&lt;li&gt;Page breaks: If the first paragraph inside a content control starts with a page break, any extra space above is removed on the new page, just like Word does.&lt;/li&gt;
&lt;li&gt;Charts: For charts with multiple data series and no title set, Word&amp;#39;s default title (&amp;quot;Chart Title&amp;quot;, in the document&amp;#39;s language) is now displayed instead of leaving the space empty. Titles coming from spreadsheet cells are also shown correctly.&lt;/li&gt;
&lt;li&gt;Lines mixing fonts: If a line has both a body font and a marker font (like Symbol or Wingdings), the line height now matches Word: it uses the tallest font&amp;#39;s ascent and the deepest descent.&lt;/li&gt;
&lt;li&gt;Improved ODT to PDF conversion: For bullet lists where the bullet uses a different font or size than the text, the line height now matches LibreOffice (highest ascent and deepest descent), and the text sits on the same baseline as the bullet.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.15.2</title>
    <id>tag:carbone.io,2026:changelog/v5.15.2</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-15-2"/>
    <published>2026-09-25T12:00:00.000Z</published>
    <updated>2026-09-25T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:appendTemplate&lt;/code&gt; is much faster when it is called many times with a large data-set: each sub-document no longer receives a copy of the data. They are copied only if the appended template modifies them with the &lt;code&gt;:set&lt;/code&gt; formatter. The &lt;code&gt;jsonSize&lt;/code&gt; statistic sent to the &lt;code&gt;afterRender&lt;/code&gt; storage plugin is now always &lt;code&gt;0&lt;/code&gt; for &lt;code&gt;&amp;quot;child&amp;quot;&lt;/code&gt; renders, as their data is already counted in the &lt;code&gt;jsonSize&lt;/code&gt; of the parent render.&lt;ul&gt;
&lt;li&gt;Fix: The &lt;code&gt;:set&lt;/code&gt; formatter now accepts whitespace around its name and parameter, like &lt;code&gt;{d.value : set ( d.other.sub ) }&lt;/code&gt;. Previously, this syntax was not recognized as a &lt;code&gt;:set&lt;/code&gt; marker: the value was stored with the legacy behavior (only at the root level of &lt;code&gt;d&lt;/code&gt; or &lt;code&gt;c&lt;/code&gt;, and only available to the tags placed after it in the document).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.15.1</title>
    <id>tag:carbone.io,2026:changelog/v5.15.1</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-15-1"/>
    <published>2026-09-24T12:00:00.000Z</published>
    <updated>2026-09-24T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Improved Carbone ICE (Instant Converter Engine) for DOCX-to-PDF conversions:&lt;ul&gt;
&lt;li&gt;Table of contents now supports heading numbers before entries (if present)&lt;/li&gt;
&lt;li&gt;Headings with no color set are now white or black, depending on the background shade. Numbered heading shading now covers the number too.&lt;/li&gt;
&lt;li&gt;Conditional formatting for a table’s first/last row or column also applies to list items inside cells, not just plain paragraphs.&lt;/li&gt;
&lt;li&gt;Section pages are now laid out with the correct header. Previously, a section’s first page could be pushed down by a taller header from later pages, moving content down by up to 10 points.  &lt;ul&gt;
&lt;li&gt;[On-Premise] Improved and fixed the statistics sent to the &lt;code&gt;afterRender&lt;/code&gt; storage plugin:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Added a new &lt;code&gt;type&lt;/code&gt; field:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;sync&amp;quot;&lt;/code&gt;: for a synchronously generated document,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;async&amp;quot;&lt;/code&gt;: for documents generated asynchronously and queued using the &lt;code&gt;carbone-webhook-url&lt;/code&gt; header,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;child&amp;quot;&lt;/code&gt;: for sub-documents generated by the &lt;code&gt;appendTemplate&lt;/code&gt; formatter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fix: Batch rendering (using &lt;code&gt;batchSplitBy&lt;/code&gt;) previously sent no metrics; the &lt;code&gt;metrics&lt;/code&gt; object was missing and &lt;code&gt;&amp;quot;isDebugActive&amp;quot;: true&lt;/code&gt; did not provide a &lt;code&gt;debug&lt;/code&gt; object. The &lt;code&gt;batchSize&lt;/code&gt; now counts all generated documents, so for a batch of 50 documents, &lt;code&gt;&amp;quot;batchSize&amp;quot;: 50&amp;quot;&lt;/code&gt; is returned.&lt;/li&gt;
&lt;li&gt;Fix: The &lt;code&gt;jsonSize&lt;/code&gt; statistic was always missing for asynchronously generated documents&lt;/li&gt;
&lt;li&gt;Fix: Improved error handling for batch generation if a batch reaches the time limit, a timeout error is now correctly returned.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.15.0</title>
    <id>tag:carbone.io,2026:changelog/v5.15.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-15-0"/>
    <published>2026-09-22T12:00:00.000Z</published>
    <updated>2026-09-22T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Added the &lt;code&gt;failOn&lt;/code&gt; option of &lt;code&gt;POST /render&lt;/code&gt;: with &lt;code&gt;&amp;quot;failOn&amp;quot;: [&amp;quot;IMAGE_URL_ERROR&amp;quot;]&lt;/code&gt;, the report generation stops and returns an error if an image cannot be downloaded from its URL, instead of replacing it with the &amp;quot;broken image&amp;quot; placeholder. As with &lt;code&gt;:appendFile&lt;/code&gt; and &lt;code&gt;:appendTemplate&lt;/code&gt;, an empty or undefined image value is not an error, and the report is generated as usual. Only images coming from a URL are concerned: base64 images, barcodes and charts keep their current behavior. The option must be an array of strings, and an unknown value is rejected with an explicit error instead of being ignored.&lt;ul&gt;
&lt;li&gt;⚡️ &lt;strong&gt;Improved Carbone ICE (Instant Converter Engine)&lt;/strong&gt;, even faster than the first version in 5.14.0, still requires no LibreOffice or any other program on the machine. Use it the same way: &lt;code&gt;&amp;quot;converter&amp;quot;: &amp;quot;I&amp;quot;&lt;/code&gt; in the options of &lt;code&gt;POST /render&lt;/code&gt;, or &amp;quot;Carbone ICE&amp;quot; in the document converter panel of the Studio preview, or with &lt;code&gt;{o.converter=I}&lt;/code&gt; in the template.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improved DOCX to PDF conversion&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;Table of contents: entries and their page numbers are automatically updated.&lt;/li&gt;
&lt;li&gt;Footnotes: now show their separator and notes&lt;/li&gt;
&lt;li&gt;Fixes more than 100 bugs: Rows taller than a page, page break before, section-specific page numbering, vertical text, shape groups, text in shapes and columns, floating tables, cell and header row heights, cell clipping, table borders, whitespace around text, and the positioning of shapes and images, complex sections, etc...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supports ODT to PDF conversion&lt;/strong&gt; [Beta] From 3x to 300x faster than the LibreOffice converter, with speed improvements scaling with document size (the larger the document, the greater the speed gain). Supports ODT templates with different page formats and sections (paper size, margins, headers/footers, mixed portrait/landscape, text columns), paragraph and character styles, right-to-left languages, lists and outline numbering, tables (borders, shading, merges, floating tables, rows kept together), images, shapes with text inside them, connectors, gradients, form controls, and basic charts rendered as vectors. Not yet supported (list may be incomplete): comments, tracked changes, and footnotes/endnotes. These elements are ignored if present; the rest of the document is converted normally. Consider this ODT-to-PDF as beta and only use it for documents that need extreme conversion speed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supports right-to-left languages&lt;/strong&gt; (Arabic, Hebrew) using the complete Unicode bidirectional algorithm, for text, tables, and image placement.&lt;/li&gt;
&lt;li&gt;Requesting the template&amp;#39;s own file format (&lt;code&gt;docx&lt;/code&gt; to &lt;code&gt;docx&lt;/code&gt;, &lt;code&gt;odt&lt;/code&gt; to &lt;code&gt;odt&lt;/code&gt;) no longer returns an error.&lt;/li&gt;
&lt;li&gt;Improved performance with smarter rotating cache management: fonts are now kept in memory from one document to the next, saving multiple milliseconds per document and per font face. The new &lt;code&gt;iceFontCacheSize&lt;/code&gt; setting (environment variable &lt;code&gt;CARBONE_ICE_FONT_CACHE_SIZE&lt;/code&gt;, 24 by default) controls how many font faces a factory keeps.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[Carbone Studio Cloud] Improvements and fixes&lt;ul&gt;
&lt;li&gt;The account menu now mirrors Carbone Account: Overview, API keys, Plans &amp;amp; pricing, Billing, Team members, and My profile, each returning to Studio after use. These pages are visible only to administrators and are hidden from other team members, as is the link to unlock the paid preview. Signing out is now done through Carbone Account.&lt;/li&gt;
&lt;li&gt;A new version uploaded from the Studio now keeps the origin of the template (API, HubSpot, Salesforce, Odoo) instead of being marked as a Studio template, so all versions of a template share the same origin.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fix: HTML to PDF, the &lt;code&gt;&amp;lt;carbone-pdf-header&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;carbone-pdf-footer&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;carbone-pdf-options&amp;gt;&lt;/code&gt; custom elements are now detected even if the tag is spread over multiple lines, contains extra spaces or attributes, or is written in uppercase. Previously, the multi-line form of &lt;code&gt;&amp;lt;carbone-pdf-options&amp;gt;&lt;/code&gt; was ignored, and a header written as &lt;code&gt;&amp;lt;carbone-pdf-header &amp;gt;&lt;/code&gt; silently disappeared from the PDF while staying visible in the document. Also fixes the &lt;code&gt;page-ranges&lt;/code&gt; option to accept a string like &lt;code&gt;&amp;quot;1-5&amp;quot;&lt;/code&gt;; ranges containing only digits, such as &lt;code&gt;page-ranges=&amp;quot;2&amp;quot;&lt;/code&gt;, are now accepted.&lt;/li&gt;
&lt;li&gt;The self-hosted binaries are now built with Node 24. Contrary to what was previously announced, version 5.14.0 still worked with Node 22.&lt;/li&gt;
&lt;li&gt;Fix: &lt;code&gt;POST /render&lt;/code&gt; with &lt;code&gt;&amp;quot;data&amp;quot;: null&lt;/code&gt; no longer crashes when the template has an image marker with a value (e.g., &lt;code&gt;{d.signature:prepend(&amp;#39;data:image/jpeg;base64,&amp;#39;)}&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.14.5</title>
    <id>tag:carbone.io,2026:changelog/v5.14.5</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-14-5"/>
    <published>2026-09-11T12:00:00.000Z</published>
    <updated>2026-09-11T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Fixed conversions failing in a cluster when the job balancer is enabled, for HTML templates with Chrome converter&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.14.4</title>
    <id>tag:carbone.io,2026:changelog/v5.14.4</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-14-4"/>
    <published>2026-09-08T12:00:00.000Z</published>
    <updated>2026-09-08T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;⚠️ Important Security Update: Following an in-depth internal penetration test, we strongly recommend updating to this version to address two critical security fixes and numerous other improvements that significantly increase Carbone&amp;#39;s overall security. Contact us if you want more details about the two critical security issues. The release note remains intentionally vague for security reasons, and the Open Source version will be updated in a few weeks.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Critical:&lt;/strong&gt; The LibreOffice converter is now significantly more secure. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical:&lt;/strong&gt; For historical reasons, Carbone allowed changing the template file &lt;code&gt;extension&lt;/code&gt; (file type) via the API without strict validation. This is now restricted: only recognized formats (like &lt;code&gt;docx&lt;/code&gt;, &lt;code&gt;xlsx&lt;/code&gt;, &lt;code&gt;xhtml&lt;/code&gt;, etc.) are accepted.&lt;/li&gt;
&lt;li&gt;LibreOffice converter: watermarking, file attachments (&lt;code&gt;:appendFile&lt;/code&gt;, &lt;code&gt;:attachFile&lt;/code&gt;, &lt;code&gt;:appendTemplate&lt;/code&gt;), and signing (&lt;code&gt;:sign&lt;/code&gt;) now work together even when generating password-protected PDFs. Previously, as soon as a PDF was protected with a password, the other features would stop working.&lt;/li&gt;
&lt;li&gt;Carbone ICE (Instant Converter Engine) now supports PDF encryption and watermarks, with the same options as Chrome, OnlyOffice, and LibreOffice.&lt;/li&gt;
&lt;li&gt;Documents generated in HTML, XHTML, SVG, or XML are now served with the &lt;code&gt;Content-Security-Policy: sandbox&lt;/code&gt; HTTP header. This causes browsers to give these files an isolated origin and blocks all scripts, protecting against code injection.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; header is now reliably set on every response. Browsers are required to respect the &lt;code&gt;Content-Type&lt;/code&gt; Carbone provides, reducing the risk of content-type based attacks.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;securityLevel&lt;/code&gt; options to remove local references in generated documents for these formats: &lt;code&gt;docx&lt;/code&gt;, &lt;code&gt;xlsx&lt;/code&gt;, &lt;code&gt;xlsm&lt;/code&gt;, &lt;code&gt;pptx&lt;/code&gt;, &lt;code&gt;odt&lt;/code&gt;, &lt;code&gt;ods&lt;/code&gt;, &lt;code&gt;odp&lt;/code&gt;, &lt;code&gt;odg&lt;/code&gt;, &lt;code&gt;fodt&lt;/code&gt;, &lt;code&gt;fods&lt;/code&gt;, &lt;code&gt;fodp&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;xhtml&lt;/code&gt;, &lt;code&gt;md&lt;/code&gt;, &lt;code&gt;svg&lt;/code&gt;, &lt;code&gt;xml&lt;/code&gt;, &lt;code&gt;txt&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt;, &lt;code&gt;rtf&lt;/code&gt;, &lt;code&gt;mht&lt;/code&gt;, &lt;code&gt;mhtml&lt;/code&gt;, &lt;code&gt;vml&lt;/code&gt;.&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SECURITY_API_REMOVE_LOCAL_HYPERLINK&lt;/code&gt; (256): Removes hyperlinks and references to private networks (local IPs, localhost, etc.).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SECURITY_API_REMOVE_EXTERNAL_FILE_REFERENCE&lt;/code&gt; (512): Removes references to local files (e.g., file paths) from documents.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Authentication failures (other than missing or expired tokens) now return a &lt;code&gt;401 Unauthorized&lt;/code&gt; with a generic message: &lt;code&gt;Unauthorized Access: Invalid API key or access token.&lt;/code&gt;, instead of a &lt;code&gt;500&lt;/code&gt; error with internal details.&lt;/li&gt;
&lt;li&gt;To prevent Denial of Service attacks, the following formatter arguments are now limited:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;formatN&lt;/code&gt; and &lt;code&gt;formatC&lt;/code&gt; decimal places: maximum 40&lt;/li&gt;
&lt;li&gt;&lt;code&gt;padl&lt;/code&gt; and &lt;code&gt;padr&lt;/code&gt; target length: maximum 10,000 characters&lt;/li&gt;
&lt;li&gt;Barcode &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt;: maximum 1,000 millimeters each, and a combined area (with scale) of 25 million pixels&lt;/li&gt;
&lt;li&gt;Barcode &lt;code&gt;textsize&lt;/code&gt;: maximum 100 points&lt;/li&gt;
&lt;li&gt;If these limits are exceeded, the value is rejected outright rather than silently reduced. Also, &lt;code&gt;replace(&amp;#39;&amp;#39;)&lt;/code&gt; no longer inserts the replacement between each character.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hyperlinks provided in your dataset are now validated before being included in the generated document. This prevents malicious URLs from affecting the document&amp;#39;s structure. Carbone encodes URLs before inserting them—if the URL already included a percent-escape (like &lt;code&gt;%20&lt;/code&gt;), this is now handled reliably and safely. Additionally, malformed percent sequences (like a single &lt;code&gt;%&lt;/code&gt;) are now safely encoded and will no longer cause errors during rendering.&lt;/li&gt;
&lt;li&gt;Color values from your dataset, used with &lt;code&gt;bindColor&lt;/code&gt;, are now validated before being written in the document. Only hexadecimal color values are accepted; any invalid color is simply ignored and the inherited color is kept, as before. This safely prevents injection of unexpected content via colors.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v4.27.0</title>
    <id>tag:carbone.io,2026:changelog/v4.27.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v4-27-0"/>
    <published>2026-09-08T12:00:00.000Z</published>
    <updated>2026-09-08T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Upgrade to the latest Node 22&lt;ul&gt;
&lt;li&gt;⚠️ Important Security Update: Following an in-depth internal penetration test, we strongly recommend updating to this version to address two critical security fixes and other improvements that increase Carbone&amp;#39;s overall security. Contact us if you want more details about the two critical security issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical:&lt;/strong&gt; The LibreOffice converter is now significantly more secure. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical:&lt;/strong&gt; For historical reasons, Carbone allowed changing the template file &lt;code&gt;extension&lt;/code&gt; (file type) via the API without strict validation. This is now restricted: only recognized formats (like &lt;code&gt;docx&lt;/code&gt;, &lt;code&gt;xlsx&lt;/code&gt;, &lt;code&gt;xhtml&lt;/code&gt;, etc.) are accepted.&lt;/li&gt;
&lt;li&gt;Documents generated in HTML, XHTML, SVG, or XML are now served with the &lt;code&gt;Content-Security-Policy: sandbox&lt;/code&gt; HTTP header. This causes browsers to give these files an isolated origin and blocks all scripts, protecting against code injection.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; header is now reliably set on every response. Browsers are required to respect the &lt;code&gt;Content-Type&lt;/code&gt; Carbone provides, reducing the risk of content-type based attacks.&lt;/li&gt;
&lt;li&gt;Authentication failures (other than missing or expired tokens) now return a &lt;code&gt;401 Unauthorized&lt;/code&gt; with a generic message: &lt;code&gt;Unauthorized Access: Invalid API key or access token.&lt;/code&gt;, instead of a &lt;code&gt;500&lt;/code&gt; error with internal details.&lt;/li&gt;
&lt;li&gt;To prevent Denial of Service attacks, the following formatter arguments are now limited:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;formatN&lt;/code&gt; and &lt;code&gt;formatC&lt;/code&gt; decimal places: maximum 40&lt;/li&gt;
&lt;li&gt;&lt;code&gt;padl&lt;/code&gt; and &lt;code&gt;padr&lt;/code&gt; target length: maximum 10,000 characters&lt;/li&gt;
&lt;li&gt;Barcode &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt;: maximum 1,000 millimeters each, and a combined area (with scale) of 25 million pixels&lt;/li&gt;
&lt;li&gt;Barcode &lt;code&gt;textsize&lt;/code&gt;: maximum 100 points&lt;/li&gt;
&lt;li&gt;If these limits are exceeded, the value is rejected outright rather than silently reduced. Also, &lt;code&gt;replace(&amp;#39;&amp;#39;)&lt;/code&gt; no longer inserts the replacement between each character.&lt;/li&gt;
&lt;li&gt;Hyperlinks provided in your dataset are now validated before being included in the generated document. This prevents malicious URLs from affecting the document&amp;#39;s structure. Carbone encodes URLs before inserting them—if the URL already included a percent-escape (like &lt;code&gt;%20&lt;/code&gt;), this is now handled reliably and safely. Additionally, malformed percent sequences (like a single &lt;code&gt;%&lt;/code&gt;) are now safely encoded and will no longer cause errors during rendering.&lt;/li&gt;
&lt;li&gt;Color values from your dataset, used with &lt;code&gt;bindColor&lt;/code&gt;, are now validated before being written in the document. Only hexadecimal color values are accepted; any invalid color is simply ignored and the inherited color is kept, as before. This safely prevents injection of unexpected content via colors.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v3.9.0</title>
    <id>tag:carbone.io,2026:changelog/v3.9.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v3-9-0"/>
    <published>2026-09-07T12:00:00.000Z</published>
    <updated>2026-09-07T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Upgrade to the latest Node 22&lt;ul&gt;
&lt;li&gt;⚠️ Important Security Update: Following an in-depth internal penetration test, we strongly recommend updating to this version to address two critical security fixes and other improvements that increase Carbone&amp;#39;s overall security. Contact us if you want more details about the two critical security issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical:&lt;/strong&gt; The LibreOffice converter is now significantly more secure. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical:&lt;/strong&gt; For historical reasons, Carbone allowed changing the template file &lt;code&gt;extension&lt;/code&gt; (file type) via the API without strict validation. This is now restricted: only recognized formats (like &lt;code&gt;docx&lt;/code&gt;, &lt;code&gt;xlsx&lt;/code&gt;, &lt;code&gt;xhtml&lt;/code&gt;, etc.) are accepted.&lt;/li&gt;
&lt;li&gt;Documents generated in HTML, XHTML, SVG, or XML are now served with the &lt;code&gt;Content-Security-Policy: sandbox&lt;/code&gt; HTTP header. This causes browsers to give these files an isolated origin and blocks all scripts, protecting against code injection.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; header is now reliably set on every response. Browsers are required to respect the &lt;code&gt;Content-Type&lt;/code&gt; Carbone provides, reducing the risk of content-type based attacks.&lt;/li&gt;
&lt;li&gt;To prevent Denial of Service attacks, the following formatter arguments are now limited:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;formatN&lt;/code&gt; and &lt;code&gt;formatC&lt;/code&gt; decimal places: maximum 40&lt;/li&gt;
&lt;li&gt;&lt;code&gt;padl&lt;/code&gt; and &lt;code&gt;padr&lt;/code&gt; target length: maximum 10,000 characters&lt;/li&gt;
&lt;li&gt;Barcode &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt;: maximum 1,000 millimeters each, and a combined area (with scale) of 25 million pixels&lt;/li&gt;
&lt;li&gt;Barcode &lt;code&gt;textsize&lt;/code&gt;: maximum 100 points&lt;/li&gt;
&lt;li&gt;If these limits are exceeded, the value is rejected outright rather than silently reduced.&lt;/li&gt;
&lt;li&gt;Hyperlinks provided in your dataset are now validated before being included in the generated document. This prevents malicious URLs from affecting the document&amp;#39;s structure. Carbone encodes URLs before inserting them—if the URL already included a percent-escape (like &lt;code&gt;%20&lt;/code&gt;), this is now handled reliably and safely. Additionally, malformed percent sequences (like a single &lt;code&gt;%&lt;/code&gt;) are now safely encoded and will no longer cause errors during rendering.&lt;/li&gt;
&lt;li&gt;Color values from your dataset, used with &lt;code&gt;bindColor&lt;/code&gt;, are now validated before being written in the document. Only hexadecimal color values are accepted; any invalid color is simply ignored and the inherited color is kept, as before. This safely prevents injection of unexpected content via colors.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.14.3</title>
    <id>tag:carbone.io,2026:changelog/v5.14.3</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-14-3"/>
    <published>2026-08-25T12:00:00.000Z</published>
    <updated>2026-08-25T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Fix: a template error in a batch item (e.g. &lt;code&gt;Missing showEnd or hideEnd&lt;/code&gt;) no longer crashes the worker. The error is now returned to the callback instead.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.14.2</title>
    <id>tag:carbone.io,2026:changelog/v5.14.2</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-14-2"/>
    <published>2026-08-25T12:00:00.000Z</published>
    <updated>2026-08-25T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Fix: Version v5.14.0 introduced a regression due to a security headers update, which prevented downloading generated documents inside an iframe. This has been fixed.&lt;ul&gt;
&lt;li&gt;Fix: &lt;code&gt;HEAD /render/:renderId&lt;/code&gt; is now allowed without authentication, like &lt;code&gt;GET /render/:renderId&lt;/code&gt;. A &lt;code&gt;HEAD&lt;/code&gt; used to return 401 when authentication was on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.14.1</title>
    <id>tag:carbone.io,2026:changelog/v5.14.1</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-14-1"/>
    <published>2026-08-21T12:00:00.000Z</published>
    <updated>2026-08-21T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[EE] Fix: &lt;code&gt;:set()&lt;/code&gt; with a relative path (e.g. &lt;code&gt;{d.obj.val:set(.flag)}&lt;/code&gt;) no longer crashes when the parent object is missing from the data. The value is left unset, the same way a marker naming missing data prints nothing.&lt;ul&gt;
&lt;li&gt;[EE] Fix: &lt;code&gt;batchReportName&lt;/code&gt; is now respected even when the ZIP contains only one file.&lt;/li&gt;
&lt;li&gt;Carbone ICE (Instant Converter Engine): now correctly handles line breaks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.14.0</title>
    <id>tag:carbone.io,2026:changelog/v5.14.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-14-0"/>
    <published>2026-08-18T12:00:00.000Z</published>
    <updated>2026-08-18T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Upgraded all dependencies and switched from Node 22 to Node 24&lt;ul&gt;
&lt;li&gt;⚡️ &lt;strong&gt;New converter: Carbone ICE (Instant Converter Engine)&lt;/strong&gt;. It reads a DOCX and converts it to PDF directly within Carbone, without relying on LibreOffice, OnlyOffice, Chrome or any other program on the machine. There is no office suite to install, no external process to start, watch or restart, and no temporary file written between the report generation and its conversion.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Up to 60x faster than LibreOffice on a 1000-page DOCX, and 3x faster on a one-page document.&lt;/strong&gt; The bigger the document, the wider the gap: a large report no longer pays the fixed cost of an office suite loading it, laying it out and printing it.&lt;/li&gt;
&lt;li&gt;When the job balancer is off, the document is handed directly from the render process to the converter in memory. On a 150-page report, this reduces the handover time to 30 ms instead of 345 ms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to use it&lt;/strong&gt;: pass &lt;code&gt;&amp;quot;converter&amp;quot;: &amp;quot;I&amp;quot;&lt;/code&gt; in the options of &lt;code&gt;POST /render&lt;/code&gt;, next to the existing &lt;code&gt;&amp;quot;L&amp;quot;&lt;/code&gt; (LibreOffice), &lt;code&gt;&amp;quot;O&amp;quot;&lt;/code&gt; (OnlyOffice) and &lt;code&gt;&amp;quot;C&amp;quot;&lt;/code&gt; (Chrome). In the Studio, pick &amp;quot;Carbone ICE (docx to pdf)&amp;quot; in the document converter panel of the preview. The converter is enabled and available by default. It can be disabled by setting &lt;code&gt;carboneIcePath&lt;/code&gt; (environment variable &lt;code&gt;CARBONE_CARBONE_ICE_PATH&lt;/code&gt;) to an empty string.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-threaded&lt;/strong&gt;: Carbone ICE converts multiple documents in parallel, controlled by the &lt;code&gt;factories&lt;/code&gt; setting (&lt;code&gt;CARBONE_FACTORIES&lt;/code&gt;). Each factory runs as a worker thread.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope for this first release:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;DOCX to PDF conversion only. Support for more formats coming soon.&lt;/li&gt;
&lt;li&gt;Pages/sections: Handles page size/orientation, section margins, headers, footers, mixed portrait/landscape, page/section breaks, text columns.&lt;/li&gt;
&lt;li&gt;Headers/footers: Different headers/footers for first, odd/even pages, per section. Calculates &lt;code&gt;PAGE&lt;/code&gt;, &lt;code&gt;NUMPAGES&lt;/code&gt;, &lt;code&gt;SECTIONPAGES&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Paragraphs: Supports all paragraph styles, alignment (left/center/right/justified), indentation, spacing, line spacing, tab stops, borders, shading, widow/orphan control.&lt;/li&gt;
&lt;li&gt;Text: Character styles, fonts, size, bold/italic/etc, color, highlighting, letter spacing, and clickable hyperlinks.&lt;/li&gt;
&lt;li&gt;Lists: Numbered/bulleted lists at all levels, with correct numbering format, bullet shapes, indentation, and alignment.&lt;/li&gt;
&lt;li&gt;Tables: Styles, conditional formatting (header rows/columns etc.), layouts, column widths, merges, cell borders/shading, nested tables, repeated header rows, floating tables.&lt;/li&gt;
&lt;li&gt;Pictures: Inline/floating images with all positioning options, cropping, full PNG/JPEG/SVG support keeping original color profiles and EXIF.&lt;/li&gt;
&lt;li&gt;Shapes/Text boxes: Supports standard and custom shapes, all fills/outlines, text inside shapes with correct styles.&lt;/li&gt;
&lt;li&gt;Charts: Bar, line, area, pie, doughnut—drawn as vectors. Includes titles, legends, axes options, gridlines, labels, colors, number formats.&lt;/li&gt;
&lt;li&gt;Fonts/colors: Uses installed fonts or falls back to &amp;quot;Noto Sans&amp;quot;. Reads all system font directories at startup.&lt;/li&gt;
&lt;li&gt;Fidelity: Output is matched pixel-for-pixel to the PDF saved from Word, ensuring layout accuracy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not yet supported (may not be exhaustive):&lt;/strong&gt; WEBP images, table of contents, SmartArt, complex charts, footnotes/endnotes, comments, tracked changes, bookmarks and links to them, form fields, equations, EMF/WMF images (Windows-only). These are ignored if present; the document still converts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fix: &lt;code&gt;GET /templates&lt;/code&gt; now returns a 400 error instead of a 500 when &lt;code&gt;search&lt;/code&gt; or &lt;code&gt;category&lt;/code&gt; contains a malformed URI (e.g. a &lt;code&gt;%&lt;/code&gt; not followed by two hex digits).&lt;/li&gt;
&lt;li&gt;Fix: files inside the ZIP archive of batch processing now keep the decoded &lt;code&gt;batchReportName&lt;/code&gt;. An index is appended to the filename (e.g. &lt;code&gt;report_1.pdf&lt;/code&gt;, &lt;code&gt;report_2.pdf&lt;/code&gt;) when &lt;code&gt;batchReportName&lt;/code&gt; is empty or not dynamic (it does not contain a Carbone tag). A second protection also triggers this automatic indexed naming if the first two files have the same name. Filenames are sanitized (&lt;code&gt;..&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;\&lt;/code&gt;, Windows reserved names such as &lt;code&gt;CON&lt;/code&gt;/&lt;code&gt;NUL&lt;/code&gt;, and characters like &lt;code&gt;:*?&amp;quot;&amp;lt;&amp;gt;|&lt;/code&gt;). Note: the generated filename index is not guaranteed to match the order of the input data.&lt;/li&gt;
&lt;li&gt;[Studio] Fixed issue where the converter would not correctly reset to LibreOffice when navigating to or from the design page.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:html&lt;/code&gt; formatter: optimize DOCX HTML list rendering by applying the numbering reset only to &lt;ol&gt; elements, improving performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.13.1</title>
    <id>tag:carbone.io,2026:changelog/v5.13.1</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-13-1"/>
    <published>2026-08-15T12:00:00.000Z</published>
    <updated>2026-08-15T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;⚠️ Chrome converter Only (HTML to PDF) : Fixed a rare issue where PDFs could mix content from different reports if several were generated at the same time. Now, each PDF always contains the correct data. No more blocked or mixed documents if a download is cancelled or the connection is lost during PDF creation. Errors or interruptions for one PDF can no longer affect another.&lt;ul&gt;
&lt;li&gt;[EE] Hardened the job balancer (only when CARBONE_JOB_BALANCER=true) with improved cluster-wide ID safety to prevent collisions. Cancelled or interrupted reports are now safely re-queued and are never lost or duplicated. This improvement is independent of the Chrome issue above and was made at the same time as a comprehensive review of the job system&amp;#39;s robustness.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.13.0</title>
    <id>tag:carbone.io,2026:changelog/v5.13.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-13-0"/>
    <published>2026-08-10T12:00:00.000Z</published>
    <updated>2026-08-10T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Chrome converter improvements:&lt;ul&gt;
&lt;li&gt;Reverted the changes in 5.12.0 regarding the maximum message size between Carbone and Chrome. Chrome enforces a built-in 100MB limit on messages (input HTML, or generated PDF), regardless of what Carbone sets for its WebSocket. The Carbone-defined limit is therefore removed. When the Chrome limit is reached, Carbone now swiftly restores communication, ensuring stability.&lt;/li&gt;
&lt;li&gt;Carbone forces Chrome to exit after 5 seconds if it cannot shut down properly, preventing an infinite wait.&lt;ul&gt;
&lt;li&gt;Added the ability to disable detection of missing i+1 tag in v5 when a pre-release tag (&lt;code&gt;preReleaseFeatureIn&lt;/code&gt;) is set to a value lower than 5000000 in the template, API, or global configuration (&lt;code&gt;CARBONE_PRE_RELEASE_FEATURE_IN&lt;/code&gt;). This can force Carbone v5 to behave like Carbone v4, helping you migrate to production without fixing legacy templates that contain syntax errors but previously worked in v4. Only features and fixes introduced up to the specified tag are enabled. Any introduced in a higher tag are disabled.&lt;/li&gt;
&lt;li&gt;Multiple improvements to PDF operations when generating PDFs with Chrome and OnlyOffice converters:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Default encryption is now AES-256 instead of the deprecated 128-bit encryption.&lt;/li&gt;
&lt;li&gt;Password protection now encrypts document properties (Title, Author, Subject, and other Info strings).&lt;/li&gt;
&lt;li&gt;Encryption performance improved by a factor of 5.&lt;ul&gt;
&lt;li&gt;Appending, merging, and adding multiple watermarks to PDFs is now at least twice as fast.&lt;/li&gt;
&lt;li&gt;Studio improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;studio.setConfig({ defaultDataPanel : &amp;#39;editor&amp;#39; })&lt;/code&gt; selects the panel shown at startup in the data editor: &lt;code&gt;&amp;#39;editor&amp;#39;&lt;/code&gt; for the raw JSON editor (default), &lt;code&gt;&amp;#39;viewer&amp;#39;&lt;/code&gt; for the simplified JSON viewer, where clicking a property inserts the corresponding Carbone tag. The user can still switch panels with the two buttons of the data editor.&lt;/li&gt;
&lt;li&gt;Accept more template origins: Salesforce (origin = 2), Odoo (3), HubSpot (4). For reference: 0 = API, 1 = Studio.&lt;ul&gt;
&lt;li&gt;[EE] Markdown templates now support dynamic &lt;strong&gt;barcodes&lt;/strong&gt; (&lt;code&gt;:barcode&lt;/code&gt;) and &lt;strong&gt;charts&lt;/strong&gt; (&lt;code&gt;:chart&lt;/code&gt;). Use an &lt;code&gt;&amp;lt;img src=&amp;quot;{d.config:chart}&amp;quot; width=&amp;quot;600&amp;quot; height=&amp;quot;400&amp;quot;/&amp;gt;&lt;/code&gt; tag to control the size of the injected image in the converted PDF/DOCX/ODT.&lt;/li&gt;
&lt;li&gt;[EE] The &lt;code&gt;:html&lt;/code&gt; formatter now renders &lt;code&gt;&amp;lt;hr&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;blockquote&amp;gt;&lt;/code&gt; and the task list checkboxes (&lt;code&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt;&lt;/code&gt;) in ODT/DOCX/PDF documents. This is a pre-release feature: it requires &lt;code&gt;{o.preReleaseFeatureIn=5011000}&lt;/code&gt; in the template, otherwise the tags are ignored.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The three elements are supported everywhere: inside the lists, the table cells, the headings, and inside a paragraph, which &lt;code&gt;&amp;lt;hr&amp;gt;&lt;/code&gt; splits while keeping the surrounding styles. The spacing and the indentation reproduce a browser: &lt;code&gt;0.5em&lt;/code&gt; around the rule, &lt;code&gt;40px&lt;/code&gt; for a quote, cumulative on each nesting level and added to the indentation of a list.&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;quotetheme&lt;/code&gt; option for &lt;code&gt;&amp;lt;blockquote&amp;gt;&lt;/code&gt;, like &lt;code&gt;tabletheme&lt;/code&gt; and &lt;code&gt;headingtheme&lt;/code&gt;: it applies a paragraph style of the template to the quotes instead of the default indentation, for example &lt;code&gt;{d.content:html(quotetheme:Quote)}&lt;/code&gt;. Word and LibreOffice both provide a &lt;code&gt;Quote&lt;/code&gt; and an &lt;code&gt;Intense Quote&lt;/code&gt; style by default. In ODT, a style name containing a space must be written the way ODF stores it, so &lt;code&gt;Intense Quote&lt;/code&gt; is passed as &lt;code&gt;Intense_20_Quote&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A checkbox is ticked with the HTML &lt;code&gt;checked&lt;/code&gt; attribute, whatever its form (&lt;code&gt;checked&lt;/code&gt;, &lt;code&gt;checked=&amp;quot;&amp;quot;&lt;/code&gt;, &lt;code&gt;checked=&amp;quot;checked&amp;quot;&lt;/code&gt;), and unticked without it: &lt;code&gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt; todo&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; checked&amp;gt; done&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In DOCX a checkbox stays clickable in Word, and it is rendered as a character everywhere else (&lt;code&gt;☑&lt;/code&gt;/&lt;code&gt;☐&lt;/code&gt;). Like a browser, the bullet of a task item is not rendered. Only &lt;code&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt;&lt;/code&gt; is rendered, the other input types are ignored.&lt;ul&gt;
&lt;li&gt;[EE] Fixed the &lt;code&gt;:html&lt;/code&gt; formatter. Unless stated otherwise, the fixes require &lt;code&gt;{o.preReleaseFeatureIn=5011000}&lt;/code&gt; so the existing templates are not impacted:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;An unencoded &lt;code&gt;&amp;lt;&lt;/code&gt; (e.g. &lt;code&gt;i&amp;lt;=2&lt;/code&gt; in a &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; block) could swallow the next real closing tag, corrupting the rest of the content. It now renders as expected.&lt;/li&gt;
&lt;li&gt;In DOCX, two identical &lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;/&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; lists shared the same numbering ID, so Word continued the count instead of restarting the second list. The second list now resets the numbering.&lt;/li&gt;
&lt;li&gt;Like a web browser, a &lt;code&gt;&amp;lt;?xml ?&amp;gt;&lt;/code&gt; processing instruction and a closing tag whose &lt;code&gt;&amp;lt;/&lt;/code&gt; is not followed by a letter (&lt;code&gt;&amp;lt;/ 3&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;/&amp;gt;&lt;/code&gt;) are now ignored.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;th&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; placed outside a &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;, and a block element left unclosed at the end of the HTML (&lt;code&gt;&amp;lt;b&amp;gt;&amp;lt;li&amp;gt;&lt;/code&gt;), were throwing an error and stopping the whole rendering. Fixed for all templates, no option needed.&lt;/li&gt;
&lt;li&gt;A list or a table left unclosed (&lt;code&gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;a&lt;/code&gt;, &lt;code&gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;A&lt;/code&gt;) generated an invalid XML, refused by Word: the missing closing tags are now added, and a closing tag without an opening tag is ignored, like a browser.&lt;/li&gt;
&lt;li&gt;The CSS of an element without a closing tag leaked on all the content coming after it: &lt;code&gt;&amp;lt;br style=&amp;quot;color:red&amp;quot;/&amp;gt;&lt;/code&gt; turned the rest of the document red.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; placed inside a list item was rendered on the same line as the item, and in DOCX its line breaks produced an invalid &lt;code&gt;&amp;lt;w:br/&amp;gt;&lt;/code&gt; nested inside &lt;code&gt;&amp;lt;w:t&amp;gt;&lt;/code&gt;: Word rendered it, but any tool reading &lt;code&gt;&amp;lt;w:t&amp;gt;&lt;/code&gt; as a simple text lost everything after the first break.&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; with uppercase attributes (&lt;code&gt;SRC&lt;/code&gt;, &lt;code&gt;WIDTH&lt;/code&gt;, &lt;code&gt;HEIGHT&lt;/code&gt;) was dropped, HTML attribute names are case-insensitive.&lt;/li&gt;
&lt;li&gt;A text or a paragraph placed inside a &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; but outside a cell (&lt;code&gt;&amp;lt;table&amp;gt;&amp;lt;p&amp;gt;text&amp;lt;/p&amp;gt;&amp;lt;tr&amp;gt;...&lt;/code&gt;) generated an invalid XML. Like a browser, it is not rendered inside the table anymore.&lt;/li&gt;
&lt;li&gt;The element names are now matched without the case: &lt;code&gt;&amp;lt;P&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;B&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;BR&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;UL&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;LI&amp;gt;&lt;/code&gt; were ignored.&lt;/li&gt;
&lt;li&gt;An attribute is now read whatever its quoting. HTML accepts &lt;code&gt;href=&amp;quot;x&amp;quot;&lt;/code&gt;, &lt;code&gt;href=&amp;#39;x&amp;#39;&lt;/code&gt; and &lt;code&gt;href=x&lt;/code&gt;, only the double quotes were read, so a link, an image, a style or a &lt;code&gt;colspan&lt;/code&gt; written with the two other syntaxes was silently lost.&lt;/li&gt;
&lt;li&gt;ODT: the headings &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; to &lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt; had no style when no &lt;code&gt;headingtheme&lt;/code&gt; was provided. A &lt;code&gt;&amp;lt;text:h&amp;gt;&lt;/code&gt; needs a style name, so the built-in &lt;code&gt;Heading_20_1&lt;/code&gt; to &lt;code&gt;Heading_20_6&lt;/code&gt; of the template are now used.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.12.0</title>
    <id>tag:carbone.io,2026:changelog/v5.12.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-12-0"/>
    <published>2026-07-29T12:00:00.000Z</published>
    <updated>2026-07-29T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Improved logging: Suppressed unnecessary error messages during routine cleanup of the template/render directories when files are already deleted or removed due to race conditions.&lt;ul&gt;
&lt;li&gt;[EE] Cluster peer connections (&lt;code&gt;peerPort&lt;/code&gt; / &lt;code&gt;peerEndpoints&lt;/code&gt;) are now more reliable, key improvements:&lt;ul&gt;
&lt;li&gt;A periodic supervisor:&lt;ul&gt;
&lt;li&gt;Recreates the WebSocket server if it crashes or the port becomes unavailable (&lt;code&gt;EADDRINUSE&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Re-resolves &lt;code&gt;peerEndpoints&lt;/code&gt; via DNS, so peers with changed IPs (e.g. during Kubernetes rolling updates) are rediscovered.&lt;/li&gt;
&lt;li&gt;Reconnects to any missing peer endpoint.&lt;/li&gt;
&lt;li&gt;Cleans up dead connections using a liveness timer when a connection opens, preventing rare deadlocks that could occur in previous versions and ensuring automatic connection recovery without requiring a restart. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;New exposed parameter &lt;code&gt;peerCheckInterval&lt;/code&gt; (or &lt;code&gt;CARBONE_PEER_CHECK_INTERVAL&lt;/code&gt;, default 10s): period of the peer liveness ping. The supervisor runs twice as often (half this value) so a lost peer is re-dialed faster than it is detected.&lt;/li&gt;
&lt;li&gt;Connections establish more reliably, no matter which peer initiates&lt;/li&gt;
&lt;li&gt;Supervisor uses exponential backoff: starts at half &lt;code&gt;peerCheckInterval&lt;/code&gt;, increases up to 1 minute, and resets to fast on important events (startup, server restart, peer connect/disconnect).&lt;/li&gt;
&lt;li&gt;Peer DNS resolution is fault-tolerant: if a peer name cannot be resolved (e.g. missing DNS during a rolling update), other available peers still connect; the whole cluster isn&amp;#39;t skipped.&lt;/li&gt;
&lt;li&gt;Maximum WebSocket message size for cluster peer connections now uses the existing &lt;code&gt;maxDataSize&lt;/code&gt; (&lt;code&gt;CARBONE_MAX_DATA_SIZE&lt;/code&gt;) parameter. By consequence, the default changed from 100MB to 60MB.&lt;/li&gt;
&lt;li&gt;Improved &lt;code&gt;Event-bus&lt;/code&gt; logs: cluster events show peer count and addresses resolved by DNS resolution (only when changed). Unreachable peers are logged with the next retry delay (e.g. &lt;code&gt;cannot reach peer ... - retrying in Xs&lt;/code&gt;) at every attempt, so network issues are visible without enabling debug logs. Remaining low-level socket errors are shown only at debug level.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The maximum message size between Carbone and Chrome is now limited by the existing &lt;code&gt;maxDataSize&lt;/code&gt; (&lt;code&gt;CARBONE_MAX_DATA_SIZE&lt;/code&gt;). As a consequence, the default changed from 100MB to 60MB (same as default &lt;code&gt;maxDataSize&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.11.0</title>
    <id>tag:carbone.io,2026:changelog/v5.11.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-11-0"/>
    <published>2026-07-24T12:00:00.000Z</published>
    <updated>2026-07-24T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[EE] Make the &lt;code&gt;:autoOrient&lt;/code&gt; formatter more robust when DOCX files are edited with Microsoft Word Online.&lt;ul&gt;
&lt;li&gt;[EE] The :html formatter now renders the &lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;sub&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;kbd&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;samp&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; elements in ODT/DOCX/PDF documents. This is a pre-release feature: it requires &lt;code&gt;{o.preReleaseFeatureIn=5011000}&lt;/code&gt; in the template, otherwise the content of these tags is rendered without formatting.&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;sub&amp;gt;&lt;/code&gt;: renders text as superscript / subscript.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt;: applies a fixed yellow highlight (color not customizable).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;kbd&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;samp&amp;gt;&lt;/code&gt; — applies the Courier New font.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt;: renders preformatted text, preserving newline characters (\n, \r\n), with the Courier New font. An empty paragraph is added after the block to mimic the browser&amp;#39;s bottom spacing.&lt;/li&gt;
&lt;li&gt;Options affecting &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt;:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nospace&lt;/code&gt;: removes the empty paragraph added after a &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; block.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inline&lt;/code&gt;: collapses newline characters to a single space. &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; keeps its Courier New font but no longer renders newlines.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Each element must have a matching opening and closing tag; an unclosed tag (e.g. a &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; with no &lt;code&gt;&amp;lt;/pre&amp;gt;&lt;/code&gt;) produces invalid HTML.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[EE] Fixed &lt;code&gt;:html&lt;/code&gt; heading rendering (&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;–&lt;code&gt;&amp;lt;h6&amp;gt;&lt;/code&gt;) in ODT templates: when a heading is not closed, the empty paragraph reproducing the browser&amp;#39;s bottom spacing is now added. It was previously missing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.10.0-beta</title>
    <id>tag:carbone.io,2026:changelog/v5.10.0-beta</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-10-0-beta"/>
    <published>2026-07-09T12:00:00.000Z</published>
    <updated>2026-07-09T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[EE] The &lt;strong&gt;job balancer&lt;/strong&gt; now also distributes asynchronous rendering jobs (&lt;code&gt;POST /render&lt;/code&gt; with a webhook). When enabled, both job types (document conversions and asynchronous document generations) can be offloaded to other peers that have available resources.&lt;ul&gt;
&lt;li&gt;Asynchronous jobs are now stored on disk in a compressed format, reducing disk usage and speeding up job transfers between peers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.9.2</title>
    <id>tag:carbone.io,2026:changelog/v5.9.2</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-9-2"/>
    <published>2026-06-30T12:00:00.000Z</published>
    <updated>2026-06-30T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Improved logs when the &lt;strong&gt;job balancer&lt;/strong&gt; is used, making it easier to distinguish between external requests and internal job distribution.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.9.1</title>
    <id>tag:carbone.io,2026:changelog/v5.9.1</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-9-1"/>
    <published>2026-06-30T12:00:00.000Z</published>
    <updated>2026-06-30T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[EE] Added a &lt;strong&gt;job balancer&lt;/strong&gt; (Beta) that spreads document conversion load across the peers of a cluster. When a peer is idle and another peer is overloaded, the idle peer automatically &amp;quot;steals&amp;quot; pending conversion jobs from the busy peer, runs them locally, and sends the result back. This smooths out conversion spikes without any external load balancer.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Disabled by default.&lt;/strong&gt; Enable it with the &lt;code&gt;jobBalancer&lt;/code&gt; parameter (env var &lt;code&gt;CARBONE_JOB_BALANCER=true&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;It only works when the internal cluster channel is enabled, i.e. when &lt;code&gt;peerPort&lt;/code&gt; is set (and peers are reachable through &lt;code&gt;peerEndpoints&lt;/code&gt;). If &lt;code&gt;peerPort&lt;/code&gt; is not defined, the job balancer stays inactive even when &lt;code&gt;jobBalancer&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;How it works: each peer periodically broadcasts the size of its conversion queue to the other peers. A peer that has free conversion factories pulls jobs from the most overloaded peer (pull-based model, so newly started peers naturally take their share and slow peers take fewer jobs). Aborted jobs and timeouts are propagated to the remote peer, and a peer stops stealing new jobs as soon as it begins a graceful shutdown.&lt;/li&gt;
&lt;li&gt;⚠️ Like the rest of the cluster channel, this internal traffic is &lt;strong&gt;not authenticated or encrypted&lt;/strong&gt;: use it only inside a secure private network.&lt;ul&gt;
&lt;li&gt;[EE] The OpenMetrics &lt;code&gt;/metrics&lt;/code&gt; endpoint now exposes a new gauge &lt;code&gt;carbone_reports_inflight{stage=&amp;quot;conversion&amp;quot;}&lt;/code&gt; reporting the number of document conversion jobs currently waiting in the queue.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.9.0</title>
    <id>tag:carbone.io,2026:changelog/v5.9.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-9-0"/>
    <published>2026-06-22T12:00:00.000Z</published>
    <updated>2026-06-22T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;If &lt;code&gt;data&lt;/code&gt; is undefined when calling &lt;code&gt;POST /render&lt;/code&gt;, Carbone only converts the file and skips the entire templating process. As a result, tags remain unchanged in the converted document.&lt;ul&gt;
&lt;li&gt;Added support for the custom header &lt;code&gt;carbone-egress-header-authorization&lt;/code&gt; to customize the &lt;code&gt;authorization&lt;/code&gt; header for egress traffic, such as webhooks, images, and external PDF URLs. For example, if &lt;code&gt;carbone-egress-header-authorization: my-secret&lt;/code&gt; is included during report generation, the header &lt;code&gt;authorization: my-secret&lt;/code&gt; will be added when Carbone calls a webhook, an external image URL, an external PDF URL, etc.
If &lt;code&gt;carbone-webhook-header-authorization&lt;/code&gt; is used at the same time, it overrides &lt;code&gt;carbone-egress-header-authorization&lt;/code&gt; for webhook calls only.
Only the &lt;code&gt;authorization&lt;/code&gt; header can be customized, and its value must not exceed 512 characters.&lt;/li&gt;
&lt;li&gt;Studio: General UX improvements:&lt;ul&gt;
&lt;li&gt;Rename the &lt;strong&gt;&amp;quot;Stop Auto-Upload&amp;quot;&lt;/strong&gt; button to the less technical &lt;strong&gt;&amp;quot;Finish Editing&amp;quot;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Improve filename readability for long filenames by displaying as much of the name as possible while always keeping the end of the filename visible (use an ellipsis in the middle).&lt;/li&gt;
&lt;li&gt;Clearly indicate that the Studio is listening for file changes with a subtle, low-resource animated icon.&lt;/li&gt;
&lt;li&gt;Clearly show how long ago the file was updated and when the latest changes were synchronized and taken into account by the Studio.&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;Docs&lt;/strong&gt; button with an enriched menu.&lt;/li&gt;
&lt;li&gt;Fix the &lt;strong&gt;Profile&lt;/strong&gt; button on Safari.&lt;/li&gt;
&lt;li&gt;Improve text search in the JSON editor with &lt;strong&gt;Next&lt;/strong&gt; and &lt;strong&gt;Previous&lt;/strong&gt; buttons, a result counter, and the current search position. If more than 200 occurrences are found, the UI stops counting them to avoid performance issues with very large JSON files.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.8.0</title>
    <id>tag:carbone.io,2026:changelog/v5.8.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-8-0"/>
    <published>2026-06-10T12:00:00.000Z</published>
    <updated>2026-06-10T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[Studio] Fix the drop-down list bug and the recent list issue in Safari.&lt;ul&gt;
&lt;li&gt;[On-Premise only] In Markdown templates, the special tag &lt;code&gt;{o.styleSource = templateOrVersionId}&lt;/code&gt; allows applying the style from another DOCX or ODT template. The style template can include Carbone tags. Styles such as headings, tables, headers, and footers are applied only when converting Markdown to DOCX, ODT, or PDF.&lt;/li&gt;
&lt;li&gt;[EE] PDFs generated with Chrome and OnlyOffice converters now support full encryption and security options, matching LibreOffice. &lt;ul&gt;
&lt;li&gt;All PDF security features are supported:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EncryptFile&lt;/code&gt; (boolean): Enable PDF encryption (requires password).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DocumentOpenPassword&lt;/code&gt; (string): Password required to open the PDF.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RestrictPermissions&lt;/code&gt; (boolean): Restrict actions like printing, copying, and editing (requires &lt;code&gt;PermissionPassword&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PermissionPassword&lt;/code&gt; (string): Password to set/change permissions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Changes&lt;/code&gt; (integer): Control what edits are allowed (0: none, 1: pages, 2: forms, 3: comments/forms, 4: all except extraction).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EnableCopyingOfContent&lt;/code&gt; (boolean): Allow content copying.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EnableTextAccessForAccessibilityTools&lt;/code&gt; (boolean): Allow access for accessibility tools.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Printing&lt;/code&gt; (integer): Allow printing (0: none, 1: low-res, 2: high-res).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Increased the allowed memory allocation to 8 GB to support large XLSX reports.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.7.0</title>
    <id>tag:carbone.io,2026:changelog/v5.7.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-7-0"/>
    <published>2026-06-05T12:00:00.000Z</published>
    <updated>2026-06-05T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[Studio] Small UI fixes and update BeerCSS to v4.0.21 (Material Design M3)&lt;ul&gt;
&lt;li&gt;Template list: remove empty items from category/tag filters&lt;/li&gt;
&lt;li&gt;The selected item in the list is now visible only after pressing a keyboard arrow key to avoid confusion with mouse hover&lt;/li&gt;
&lt;li&gt;Replace HTML &lt;code&gt;main&lt;/code&gt; tags with &lt;code&gt;div&lt;/code&gt; elements to keep a single global &lt;code&gt;main&lt;/code&gt; element and avoid bugs with the new BeerCSS&lt;/li&gt;
&lt;li&gt;Harmonize margins and button styles&lt;/li&gt;
&lt;li&gt;Use the new split buttons&lt;/li&gt;
&lt;li&gt;Improve table responsiveness&lt;ul&gt;
&lt;li&gt;Accept equality filters that do not strictly match types in array search expressions (&lt;code&gt;lookup&lt;/code&gt;), added in v5.2.0.
For example: &lt;code&gt;table[rank=3]&lt;/code&gt; matches both &lt;code&gt;rank = 3&lt;/code&gt; and &lt;code&gt;rank = &amp;#39;3&amp;#39;&lt;/code&gt;. This change aligns the behavior with the historical behavior of array filters.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.6.1</title>
    <id>tag:carbone.io,2026:changelog/v5.6.1</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-6-1"/>
    <published>2026-05-14T12:00:00.000Z</published>
    <updated>2026-05-14T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[On-Premise] Added the global parameter &lt;code&gt;maxDownloadFileTimeout&lt;/code&gt; (&lt;code&gt;CARBONE_MAX_DOWNLOAD_FILE_TIMEOUT&lt;/code&gt;) to configure the default timeout (6 seconds) for downloading images or files from URLs or when using &lt;code&gt;appendTemplate&lt;/code&gt; (which behaves similarly by downloading a file from another Carbone instance).&lt;ul&gt;
&lt;li&gt;[On-Premise] Added the global boolean parameter &lt;code&gt;pdfPostCompression&lt;/code&gt; (&lt;code&gt;CARBONE_PDF_POST_COMPRESSION&lt;/code&gt;, default: false), which can reduce PDF size by up to 3x when merging PDFs using &lt;code&gt;:appendTemplate&lt;/code&gt;, &lt;code&gt;:appendFile&lt;/code&gt;, or during batch processing to a single PDF output.&lt;/li&gt;
&lt;li&gt;[EE] Fix: PDF templates that use annotations with Carbone tags to update forms are now cleanly removed from the result PDF.&lt;/li&gt;
&lt;li&gt;[EE] PDFs generated with Chrome converter can now be encrypted using the same options as LibreOffice. Example: &lt;code&gt;{ &amp;quot;convertTo&amp;quot;: { &amp;quot;formatName&amp;quot;: &amp;quot;pdf&amp;quot;, &amp;quot;formatOptions&amp;quot;: { &amp;quot;EncryptFile&amp;quot;: true, &amp;quot;DocumentOpenPassword&amp;quot;: &amp;quot;QWERTY1234&amp;quot; } } }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;[EE] Fix: Timeout when downloading images or files from URLs when using batch processing no longer causes a crash.&lt;/li&gt;
&lt;li&gt;[On-Premise] Improve logs at startup (number of &lt;code&gt;factories&lt;/code&gt;, show if options &lt;code&gt;pdfPostCompression&lt;/code&gt; or &lt;code&gt;nbReportMaxPerBatch&lt;/code&gt; are activated)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.6.0</title>
    <id>tag:carbone.io,2026:changelog/v5.6.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-6-0"/>
    <published>2026-05-07T12:00:00.000Z</published>
    <updated>2026-05-07T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[EE] The &lt;code&gt;:autoOrient&lt;/code&gt; formatter can be used to automatically rotate an image according to the camera or smartphone orientation. It is supported only in DOCX templates.
  It can be used with &lt;code&gt;imageFit(contain)&lt;/code&gt; or &lt;code&gt;imageFit(fillWidth)&lt;/code&gt;, but not with &lt;code&gt;imageFit(fill)&lt;/code&gt;. It only works with JPEG images. Other image formats ignore this formatter. To reduce processing as much as possible, the orientation is applied directly in the template (no JPEG processing).&lt;ul&gt;
&lt;li&gt;Fix: Accepts whitespace before the &lt;code&gt;:color&lt;/code&gt; formatter.&lt;/li&gt;
&lt;li&gt;[EE] The &lt;code&gt;:color(scope, type)&lt;/code&gt; formatter is supported in PPTX templates for all combinations of &lt;code&gt;type&lt;/code&gt; (background, text, border) and &lt;code&gt;scope&lt;/code&gt; (row, cell, shape). &amp;quot;border&amp;quot; is supported only for shapes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.5.1</title>
    <id>tag:carbone.io,2026:changelog/v5.5.1</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-5-1"/>
    <published>2026-05-06T12:00:00.000Z</published>
    <updated>2026-05-06T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[On-Premise] Add the debug option &lt;code&gt;DEBUG=carbone:webserver&lt;/code&gt; to see sparse logs of the HTTP body and headers when a report is generated&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.5.0</title>
    <id>tag:carbone.io,2026:changelog/v5.5.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-5-0"/>
    <published>2026-04-30T12:00:00.000Z</published>
    <updated>2026-04-30T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[EE] Added a new &lt;code&gt;:drop/:keep&lt;/code&gt; option &lt;code&gt;col&lt;/code&gt; to dynamically delete table columns. This beta feature is supported for DOCX, XLSX, PPTX, ODT, ODS, ODP, and HTML templates. Example Carbone tag to place in a table cell: &lt;code&gt;{d.value:ifEM:drop(col)}&lt;/code&gt;. This means that if the value is empty, the entire column is deleted.  It can be combined with other &lt;code&gt;:drop(row)&lt;/code&gt; tags or with multiple &lt;code&gt;:drop(col)&lt;/code&gt; tags based on different conditions.&lt;ul&gt;
&lt;li&gt;[EE] The &lt;code&gt;:html&lt;/code&gt; formatter supports the full spectrum of HTML entities (previously limited to named entities only):&lt;ul&gt;
&lt;li&gt;Added full support for decimal &lt;code&gt;&amp;amp;#169;&lt;/code&gt; and hexadecimal &lt;code&gt;&amp;amp;#xA9;&lt;/code&gt; numeric entities, with strict XML 1.0 validation.&lt;/li&gt;
&lt;li&gt;Added Emojis support as literal Unicode characters and numeric HTML entities.&lt;/li&gt;
&lt;li&gt;Fixed named entities mapping to two code points (e.g. &lt;code&gt;&amp;amp;fjlig;&lt;/code&gt;, &lt;code&gt;&amp;amp;caps;&lt;/code&gt;) now render correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[EE] Completely reworked the asynchronous rendering system with webhooks to fix race condition issues and speed up processing.&lt;/li&gt;
&lt;li&gt;[EE] Reduce the risk of converter starvation when a template uses &lt;code&gt;appendTemplate&lt;/code&gt;. When a template uses this formatter, &lt;code&gt;maxDownloadFileConcurrency&lt;/code&gt; is automatically adjusted for this report only, so it is lower than or equal to the number of converter threads.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.4.5</title>
    <id>tag:carbone.io,2026:changelog/v5.4.5</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-4-5"/>
    <published>2026-04-13T12:00:00.000Z</published>
    <updated>2026-04-13T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[On-Premise] Fixed Markdown file type detection to enable MD to PDF, MD to DOCX, MD to ODT, ...&lt;ul&gt;
&lt;li&gt;[On-Premise] Added Markdown support in the Studio&lt;/li&gt;
&lt;li&gt;Fixed Swiss QR code (&lt;code&gt;swissqrcode&lt;/code&gt;) bugs related to accented characters&lt;/li&gt;
&lt;li&gt;Fixes for the &lt;code&gt;:html&lt;/code&gt; formatter:&lt;ul&gt;
&lt;li&gt;Multiple arguments provided to the formatter were not recognised; now fully supported: Custom Heading and/or Table Themes and/or the &amp;quot;nospace&amp;quot; option.&lt;/li&gt;
&lt;li&gt;If the HTML contained a color as an inline style, it was not recognised when it contained space characters; it is now fully recognised.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.4.4</title>
    <id>tag:carbone.io,2026:changelog/v5.4.4</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-4-4"/>
    <published>2026-04-08T12:00:00.000Z</published>
    <updated>2026-04-08T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Add the new optional tag &lt;code&gt;{o.hardRefresh=true}&lt;/code&gt; to force a template to be processed by a converter (LibreOffice, etc.) even when the output file type is the same as the input file type. For example, it can be used to update XLSX formulas after Carbone injects the data.&lt;ul&gt;
&lt;li&gt;Add limits &lt;code&gt;maxTemplateUncompressedSize&lt;/code&gt; (200 MB by default) for unzipped templates to improve resistance to zip bomb denial-of-service attacks (CVE-2026-18929)&lt;/li&gt;
&lt;li&gt;[EE] Update to Node 22.22.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v4.26.3</title>
    <id>tag:carbone.io,2026:changelog/v4.26.3</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v4-26-3"/>
    <published>2026-04-07T12:00:00.000Z</published>
    <updated>2026-04-07T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[EE] Update to Node 20.20.2&lt;ul&gt;
&lt;li&gt;Add limits &lt;code&gt;maxTemplateUncompressedSize&lt;/code&gt; (200 MB by default) for unzipped templates to improve resistance to zip bomb denial-of-service attacks (CVE-2026-18929)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
</feed>
