<?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-09-11T12: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.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>
  <entry>
    <title>Carbone v3.8.2</title>
    <id>tag:carbone.io,2026:changelog/v3.8.2</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v3-8-2"/>
    <published>2026-04-03T12:00:00.000Z</published>
    <updated>2026-04-03T12: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;li&gt;Node.js library only:&lt;ul&gt;
&lt;li&gt;Fix a critical security issue identified in a recent audit. This issue had already been fixed in all other versions.&lt;/li&gt;
&lt;li&gt;Align published version on npm with this version&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.3</title>
    <id>tag:carbone.io,2026:changelog/v5.4.3</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-4-3"/>
    <published>2026-03-30T12:00:00.000Z</published>
    <updated>2026-03-30T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Add new options that can be used in a template to force some parameters&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{o.timezone = Europe/Paris}&lt;/code&gt;: force the timezone&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{o.converter = L}&lt;/code&gt;: force the converter (&lt;code&gt;L&lt;/code&gt;: LibreOffice, &lt;code&gt;O&lt;/code&gt;: OnlyOffice, &lt;code&gt;C&lt;/code&gt;: Chrome)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{o.lang = en-US}&lt;/code&gt;: force the language. Accepts uppercase or lowercase&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{o.exportFormattedValuesAsText = true}&lt;/code&gt;: force &lt;code&gt;formatN&lt;/code&gt; to generate numbers as localized text instead of converting them to the XLSX number format. Available only for XLSX templates.&lt;ul&gt;
&lt;li&gt;Fix: after analysis, we noticed that the fix for object iteration introduced in v5.4.2 could break some poorly designed reports.
Therefore, this version disables the fix by default. It can be enabled only by adding the pre-release tag &lt;code&gt;{o.preReleaseFeatureIn=5004002}&lt;/code&gt; to the template.&lt;/li&gt;
&lt;li&gt;[Studio] Fix: avoid relying on the machine time to set the deployment timestamp&lt;/li&gt;
&lt;li&gt;[API]: &lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;PATCH /template&lt;/code&gt; now return the &lt;code&gt;deployedAt&lt;/code&gt; value saved by the backend. This is useful when the submitted object contains the constant value &lt;code&gt;42000000000&lt;/code&gt; to set the deployment time to now.&lt;/li&gt;
&lt;li&gt;[Studio] Fix: Studio now automatically deploys a version if all versions of a template have &lt;code&gt;deployedAt = 0&lt;/code&gt; (no deployed template). This can happen if the template was created through the API without setting the &lt;code&gt;deployedAt&lt;/code&gt; timestamp.&lt;/li&gt;
&lt;li&gt;[Studio] Fix: remove an unnecessary preview refresh when downloading a file too early, before the file is fully downloaded&lt;/li&gt;
&lt;li&gt;Enable the &lt;code&gt;:appendTemplate&lt;/code&gt; formatter for Carbone Cloud&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.2</title>
    <id>tag:carbone.io,2026:changelog/v5.4.2</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-4-2"/>
    <published>2026-03-25T12:00:00.000Z</published>
    <updated>2026-03-25T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Fix: Support direct object access and iteration over the object at the same time: &lt;code&gt;&amp;lt;xml&amp;gt; {d.myObj.id} &amp;lt;b/&amp;gt; {d.myObj[i].att} &amp;lt;b/&amp;gt; {d.myObj[i+1].att} &amp;lt;/xml&amp;gt;&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;Fix: Incorrect output when direct object access is used after iterating over the object at the same time&lt;/li&gt;
&lt;li&gt;Fix: Support &lt;code&gt;:aggSum&lt;/code&gt; when the root &lt;code&gt;d&lt;/code&gt; is an array with nested loops: &lt;code&gt;{d[].sub[].val:aggSum}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fix: Scheduled metadata flush cron now works even when &lt;code&gt;peerEndpoints&lt;/code&gt; is defined but no peers are available&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.4.1</title>
    <id>tag:carbone.io,2026:changelog/v5.4.1</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-4-1"/>
    <published>2026-03-18T12:00:00.000Z</published>
    <updated>2026-03-18T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;[On-Premise] Fix the template metadata cron when no other peers are used.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Carbone v5.4.0</title>
    <id>tag:carbone.io,2026:changelog/v5.4.0</id>
    <link rel="alternate" type="text/html" href="https://carbone.io/changelog.html#v5-4-0"/>
    <published>2026-03-17T12:00:00.000Z</published>
    <updated>2026-03-17T12:00:00.000Z</updated>
    <content type="html">&lt;ul&gt;
&lt;li&gt;👌 We simplified the vocabulary across the documentation and logs to make Carbone easier to understand:&lt;ul&gt;
&lt;li&gt;&amp;quot;Stateful VS Stateless&amp;quot; becomes &amp;quot;With / Without template management&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Studio Web Component: embedded versioning vs embedded&amp;quot; becomes &amp;quot;Studio Web Component: With / Without template management&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;With / Without versioning&amp;quot; becomes &amp;quot;With / Without template management&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;With / Without database&amp;quot; becomes &amp;quot;With / Without template management&amp;quot;&lt;/li&gt;
&lt;li&gt;The term &amp;quot;Database&amp;quot; is replaced by &amp;quot;Template metadata&amp;quot;&lt;/li&gt;
&lt;li&gt;For new installations, the default filename stored on disk (or external storage) is &lt;code&gt;metadata.db&lt;/code&gt;. Consider it as a special template file, stored like any other template in template storage.&lt;ul&gt;
&lt;li&gt;Renamed &lt;code&gt;databaseName&lt;/code&gt; (&lt;code&gt;CARBONE_DATABASE_NAME&lt;/code&gt;) to &lt;code&gt;templateMetadataFile&lt;/code&gt; (&lt;code&gt;CARBONE_TEMPLATE_METADATA_FILE&lt;/code&gt;). Default value is &amp;quot;metadata.db&amp;quot;. &lt;/li&gt;
&lt;li&gt;&lt;code&gt;databaseName&lt;/code&gt; (&lt;code&gt;CARBONE_DATABASE_NAME&lt;/code&gt;) remains supported for backward compatibility and automatically enables &lt;code&gt;templateManagement=true&lt;/code&gt;. If both old and new parameters are set, Carbone uses the new parameters in priority&lt;/li&gt;
&lt;li&gt;☝️ Add a single boolean configuration parameter, &lt;code&gt;templateManagement&lt;/code&gt; (or &lt;code&gt;CARBONE_TEMPLATE_MANAGEMENT&lt;/code&gt;), to enable the template management. It replaces the old method, which required setting a filename in &lt;code&gt;databaseName&lt;/code&gt; (or &lt;code&gt;CARBONE_DATABASE_NAME&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;⚡️ Adds the final missing features to fully support template management across a cluster of nodes or Docker containers, with high availability and no single point of failure&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Carbone now regularly flushes template metadata to &lt;code&gt;/template&lt;/code&gt; as:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.metadata.db.0&lt;/code&gt; = current&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.metadata.db.1&lt;/code&gt; = previous&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If template plugin hooks are implemented (&lt;code&gt;writeTemplate&lt;/code&gt; and &lt;code&gt;readTemplate&lt;/code&gt;), these files are also stored on external storage as:&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.metadata.db.0.backup&lt;/code&gt; = current&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.metadata.db.1.backup&lt;/code&gt; = previous&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Combined with the existing conflict-free synchronization (&lt;code&gt;peerPort&lt;/code&gt; and &lt;code&gt;peerEndpoints&lt;/code&gt;), this allows cluster nodes to start and stop dynamically while staying in sync without data loss&lt;/li&gt;
&lt;li&gt;Additional parameters:&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;/* Flush frequency on disk / external storage */
templateMetadataFlushCron: &amp;#39;5 0 * * *&amp;#39;, // = CARBONE_TEMPLATE_METADATA_FLUSH_CRON
/* Flush on exit */
templateMetadataFlushOnExit: true, // = CARBONE_TEMPLATE_METADATA_FLUSH_ON_EXIT
/* Retention time of CRDT patch sets used for synchronization between cluster nodes.
  Must be greater than the time between 2 flushes. */
templateMetadataPatchRetentionHours: 50, // = CARBONE_TEMPLATE_METADATA_PATCH_RETENTION_HOURS&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Startup lifecycle:&lt;ul&gt;
&lt;li&gt;On startup, Carbone tries to load the latest flushed metadata from external storage &lt;code&gt;.metadata.db.0(.backup)&lt;/code&gt; or from the shared &lt;code&gt;/template&lt;/code&gt; volume&lt;/li&gt;
&lt;li&gt;If the current file is missing, Carbone falls back to &lt;code&gt;.metadata.db.1(.backup)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;It then fetches the missing events from other peers since the last persisted flush. It is possible because each cluster node keeps events for &lt;code&gt;templateMetadataPatchRetentionHours&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;HTTP servers start only after synchronization is complete&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Shutdown lifecycle:&lt;ul&gt;
&lt;li&gt;If the cluster node is elected leader (the oldest peer ID), it automatically flushes metadata based on &lt;code&gt;templateMetadataFlushCron&lt;/code&gt;, or on exit if &lt;code&gt;templateMetadataFlushOnExit=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Before overwriting &lt;code&gt;.metadata.db.0(.backup)&lt;/code&gt;, Carbone copies the previous file to &lt;code&gt;.metadata.db.1(.backup)&lt;/code&gt;, locally and on external storage when plugin hooks are enabled&lt;/li&gt;
&lt;li&gt;If the cluster node is not the leader, it ensures all local changes are synchronized with the other nodes before exiting&lt;/li&gt;
&lt;li&gt;Removed the &lt;code&gt;backup&lt;/code&gt; directories. &lt;/li&gt;
&lt;li&gt;Rewrite startup logs for better readability.&lt;/li&gt;
&lt;li&gt;Fix the Prometheus metric &lt;code&gt;replication_connected_peers&lt;/code&gt; and add &lt;code&gt;last_successful_backup_timestamp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fix and optimize Carbone shutdown. Before, it could take up to 1.5 seconds to stop Carbone while waiting for Chrome to exit. Now it is almost instantaneous (as long as there are no pending requests and no metadata flush in progress).&lt;/li&gt;
&lt;li&gt;Accept &lt;code&gt;peerEndpoints&lt;/code&gt; without a port. In that case, it assumes the endpoints use the same port as &lt;code&gt;peerPort&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;peerEndpoints&lt;/code&gt; accepts a domain name with or without a port. It resolves the domain automatically and uses all returned IP addresses as peer endpoints.&lt;/li&gt;
&lt;li&gt;Accept the &lt;code&gt;in&lt;/code&gt; unit in PPTX/ODP when using the &lt;code&gt;:transform&lt;/code&gt; formatter.&lt;/li&gt;
&lt;li&gt;When template management is enabled, all API endpoints return an error if the template ID or version ID is not a 64-hex-character value or a 64-bit number.&lt;/li&gt;
&lt;li&gt;Improve the API rules for &lt;code&gt;PATCH /template/:id&lt;/code&gt; and &lt;code&gt;POST /template&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fix an inconsistency between the documentation and the API about the constant value used to set the “current timestamp” (&lt;code&gt;42000000000&lt;/code&gt; vs &lt;code&gt;4200000000&lt;/code&gt;). The API was expecting &lt;code&gt;4200000000&lt;/code&gt; (one zero was missing).&lt;/li&gt;
&lt;li&gt;Return an error if &lt;code&gt;deployedAt&lt;/code&gt; has the same value as the currently deployed version.&lt;/li&gt;
&lt;li&gt;Return an error if a template changes its ID and there is a conflict (same value) with the &lt;code&gt;deployedAt&lt;/code&gt; of the currently deployed version.&lt;/li&gt;
&lt;li&gt;Return an error when the new &lt;code&gt;deployedAt&lt;/code&gt; is lower than the currently deployed version (to prevent modifying the currently deployed version). To un-deploy a version, a new version must be deployed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
</feed>
