---
source: https://carbone.io/changelog.html
title: "Carbone - Changelog"
description: "Carbone is constantly evolving to offer you new advanced functions to enhance your reports and documents."
generated_at: "2026-07-07"
---

# Change Log

Carbone Enterprise Edition is one major version ahead of the Community Edition.

## v5.9.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.9.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.9.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.9.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.9.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.9.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.9.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: June 30th 2026
-   \[EE\] Added a **job balancer** (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 "steals" 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.
    -   **Disabled by default.** Enable it with the `jobBalancer` parameter (env var `CARBONE_JOB_BALANCER=true`).
    -   It only works when the internal cluster channel is enabled, i.e. when `peerPort` is set (and peers are reachable through `peerEndpoints`). If `peerPort` is not defined, the job balancer stays inactive even when `jobBalancer` is `true`.
    -   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.
    -   ⚠️ Like the rest of the cluster channel, this internal traffic is **not authenticated or encrypted**: use it only inside a secure private network.
-   \[EE\] The OpenMetrics `/metrics` endpoint now exposes a new gauge `carbone_reports_inflight{stage="conversion"}` reporting the number of document conversion jobs currently waiting in the queue.

## v5.9.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.9.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.9.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.9.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.9.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.9.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.9.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: June 22th 2026
-   If `data` is undefined when calling `POST /render`, Carbone only converts the file and skips the entire templating process. As a result, tags remain unchanged in the converted document.
-   Added support for the custom header `carbone-egress-header-authorization` to customize the `authorization` header for egress traffic, such as webhooks, images, and external PDF URLs. For example, if `carbone-egress-header-authorization: my-secret` is included during report generation, the header `authorization: my-secret` will be added when Carbone calls a webhook, an external image URL, an external PDF URL, etc. If `carbone-webhook-header-authorization` is used at the same time, it overrides `carbone-egress-header-authorization` for webhook calls only. Only the `authorization` header can be customized, and its value must not exceed 512 characters.
-   Studio: General UX improvements:
    -   Rename the **"Stop Auto-Upload"** button to the less technical **"Finish Editing"**.
    -   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).
    -   Clearly indicate that the Studio is listening for file changes with a subtle, low-resource animated icon.
    -   Clearly show how long ago the file was updated and when the latest changes were synchronized and taken into account by the Studio.
    -   Add a **Docs** button with an enriched menu.
    -   Fix the **Profile** button on Safari.
    -   Improve text search in the JSON editor with **Next** and **Previous** 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.

## v5.8.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.8.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.8.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.8.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.8.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.8.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.8.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: June 10th 2026
-   \[Studio\] Fix the drop-down list bug and the recent list issue in Safari.
-   \[On-Premise only\] In Markdown templates, the special tag `{o.styleSource = templateOrVersionId}` 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.
-   \[EE\] PDFs generated with Chrome and OnlyOffice converters now support full encryption and security options, matching LibreOffice.
    -   All PDF security features are supported:
        -   `EncryptFile` (boolean): Enable PDF encryption (requires password).
        -   `DocumentOpenPassword` (string): Password required to open the PDF.
        -   `RestrictPermissions` (boolean): Restrict actions like printing, copying, and editing (requires `PermissionPassword`).
        -   `PermissionPassword` (string): Password to set/change permissions.
        -   `Changes` (integer): Control what edits are allowed (0: none, 1: pages, 2: forms, 3: comments/forms, 4: all except extraction).
        -   `EnableCopyingOfContent` (boolean): Allow content copying.
        -   `EnableTextAccessForAccessibilityTools` (boolean): Allow access for accessibility tools.
        -   `Printing` (integer): Allow printing (0: none, 1: low-res, 2: high-res).
-   Increased the allowed memory allocation to 8 GB to support large XLSX reports.

## v5.7.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.7.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.7.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.7.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.7.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.7.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.7.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: June 5th 2026
-   \[Studio\] Small UI fixes and update BeerCSS to v4.0.21 (Material Design M3)
    -   Template list: remove empty items from category/tag filters
    -   The selected item in the list is now visible only after pressing a keyboard arrow key to avoid confusion with mouse hover
    -   Replace HTML `main` tags with `div` elements to keep a single global `main` element and avoid bugs with the new BeerCSS
    -   Harmonize margins and button styles
    -   Use the new split buttons
    -   Improve table responsiveness
-   Accept equality filters that do not strictly match types in array search expressions (`lookup`), added in v5.2.0. For example: `table[rank=3]` matches both `rank = 3` and `rank = '3'`. This change aligns the behavior with the historical behavior of array filters.

## v5.6.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.6.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.6.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.6.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.6.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.6.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.6.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: May 14th 2026
-   \[On-Premise\] Added the global parameter `maxDownloadFileTimeout` (`CARBONE_MAX_DOWNLOAD_FILE_TIMEOUT`) to configure the default timeout (6 seconds) for downloading images or files from URLs or when using `appendTemplate` (which behaves similarly by downloading a file from another Carbone instance).
-   \[On-Premise\] Added the global boolean parameter `pdfPostCompression` (`CARBONE_PDF_POST_COMPRESSION`, default: false), which can reduce PDF size by up to 3x when merging PDFs using `:appendTemplate`, `:appendFile`, or during batch processing to a single PDF output.
-   \[EE\] Fix: PDF templates that use annotations with Carbone tags to update forms are now cleanly removed from the result PDF.
-   \[EE\] PDFs generated with Chrome converter can now be encrypted using the same options as LibreOffice. Example: `{ "convertTo": { "formatName": "pdf", "formatOptions": { "EncryptFile": true, "DocumentOpenPassword": "QWERTY1234" } } }`
-   \[EE\] Fix: Timeout when downloading images or files from URLs when using batch processing no longer causes a crash.
-   \[On-Premise\] Improve logs at startup (number of `factories`, show if options `pdfPostCompression` or `nbReportMaxPerBatch` are activated)

## v5.6.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.6.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.6.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.6.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.6.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.6.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.6.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: May 7th 2026
-   \[EE\] The `:autoOrient` 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 `imageFit(contain)` or `imageFit(fillWidth)`, but not with `imageFit(fill)`. 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).
-   Fix: Accepts whitespace before the `:color` formatter.
-   \[EE\] The `:color(scope, type)` formatter is supported in PPTX templates for all combinations of `type` (background, text, border) and `scope` (row, cell, shape). "border" is supported only for shapes.

## v5.5.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.5.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.5.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.5.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.5.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.5.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.5.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: May 6th 2026
-   \[On-Premise\] Add the debug option `DEBUG=carbone:webserver` to see sparse logs of the HTTP body and headers when a report is generated

## v5.5.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.5.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.5.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.5.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.5.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.5.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.5.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: April 30th 2026
-   \[EE\] Added a new `:drop/:keep` option `col` 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: `{d.value:ifEM:drop(col)}`. This means that if the value is empty, the entire column is deleted. It can be combined with other `:drop(row)` tags or with multiple `:drop(col)` tags based on different conditions.
-   \[EE\] The `:html` formatter supports the full spectrum of HTML entities (previously limited to named entities only):
    -   Added full support for decimal `&#169;` and hexadecimal `&#xA9;` numeric entities, with strict XML 1.0 validation.
    -   Added Emojis support as literal Unicode characters and numeric HTML entities.
    -   Fixed named entities mapping to two code points (e.g. `&fjlig;`, `&caps;`) now render correctly.
-   \[EE\] Completely reworked the asynchronous rendering system with webhooks to fix race condition issues and speed up processing.
-   \[EE\] Reduce the risk of converter starvation when a template uses `appendTemplate`. When a template uses this formatter, `maxDownloadFileConcurrency` is automatically adjusted for this report only, so it is lower than or equal to the number of converter threads.

## v5.4.5

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.5-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.4.5-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.5-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.4.5`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.4.5`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.4.5`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: April 13th 2026
-   \[On-Premise\] Fixed Markdown file type detection to enable MD to PDF, MD to DOCX, MD to ODT, ...
-   \[On-Premise\] Added Markdown support in the Studio
-   Fixed Swiss QR code (`swissqrcode`) bugs related to accented characters
-   Fixes for the `:html` formatter:
    -   Multiple arguments provided to the formatter were not recognised; now fully supported: Custom Heading and/or Table Themes and/or the "nospace" option.
    -   If the HTML contained a color as an inline style, it was not recognised when it contained space characters; it is now fully recognised.

## v5.4.4

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.4-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.4.4-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.4-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.4.4`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.4.4`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.4.4`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: April 8th 2026
-   Add the new optional tag `{o.hardRefresh=true}` 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.
-   Add limits `maxTemplateUncompressedSize` (200 MB by default) for unzipped templates to improve resistance to zip bomb denial-of-service attacks
-   \[EE\] Update to Node 22.22.2

## v4.26.3

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.3-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.26.3-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.3-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.26.3`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.26.3`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.26.3`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: April 7th 2026
-   \[EE\] Update to Node 20.20.2
-   Add limits `maxTemplateUncompressedSize` (200 MB by default) for unzipped templates to improve resistance to zip bomb denial-of-service attacks

## v3.8.2

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-3.8.2-linux-x64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-3.8.2-macos-x64)

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: April 3rd 2026
-   \[EE\] Update to Node 20.20.2
-   Add limits `maxTemplateUncompressedSize` (200 MB by default) for unzipped templates to improve resistance to zip bomb denial-of-service attacks
-   Node.js library only:
    -   Fix a critical security issue identified in a recent audit. This issue had already been fixed in all other versions.
    -   Align published version on npm with this version

## v5.4.3

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.3-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.4.3-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.3-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.4.3`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.4.3`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.4.3`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: March 30th 2026
-   Add new options that can be used in a template to force some parameters
    -   `{o.timezone = Europe/Paris}`: force the timezone
    -   `{o.converter = L}`: force the converter (`L`: LibreOffice, `O`: OnlyOffice, `C`: Chrome)
    -   `{o.lang = en-US}`: force the language. Accepts uppercase or lowercase
    -   `{o.exportFormattedValuesAsText = true}`: force `formatN` to generate numbers as localized text instead of converting them to the XLSX number format. Available only for XLSX templates.
-   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 `{o.preReleaseFeatureIn=5004002}` to the template.
-   \[Studio\] Fix: avoid relying on the machine time to set the deployment timestamp
-   \[API\]: `POST` and `PATCH /template` now return the `deployedAt` value saved by the backend. This is useful when the submitted object contains the constant value `42000000000` to set the deployment time to now.
-   \[Studio\] Fix: Studio now automatically deploys a version if all versions of a template have `deployedAt = 0` (no deployed template). This can happen if the template was created through the API without setting the `deployedAt` timestamp.
-   \[Studio\] Fix: remove an unnecessary preview refresh when downloading a file too early, before the file is fully downloaded
-   Enable the `:appendTemplate` formatter for Carbone Cloud

## v5.4.2

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.2-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.4.2-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.2-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.4.2`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.4.2`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.4.2`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: March 25th 2026
-   Fix: Support direct object access and iteration over the object at the same time: `<xml> {d.myObj.id} <b/> {d.myObj[i].att} <b/> {d.myObj[i+1].att} </xml>`
-   Fix: Incorrect output when direct object access is used after iterating over the object at the same time
-   Fix: Support `:aggSum` when the root `d` is an array with nested loops: `{d[].sub[].val:aggSum}`
-   Fix: Scheduled metadata flush cron now works even when `peerEndpoints` is defined but no peers are available

## v5.4.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.4.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.4.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.4.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.4.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: March 18th 2026
-   \[On-Premise\] Fix the template metadata cron when no other peers are used.

## v5.4.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.4.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.4.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.4.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.4.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.4.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: March 17th 2026
-   👌 We simplified the vocabulary across the documentation and logs to make Carbone easier to understand:
    -   "Stateful VS Stateless" becomes "With / Without template management"
    -   "Studio Web Component: embedded versioning vs embedded" becomes "Studio Web Component: With / Without template management"
    -   "With / Without versioning" becomes "With / Without template management"
    -   "With / Without database" becomes "With / Without template management"
    -   The term "Database" is replaced by "Template metadata"
    -   For new installations, the default filename stored on disk (or external storage) is `metadata.db`. Consider it as a special template file, stored like any other template in template storage.
-   Renamed `databaseName` (`CARBONE_DATABASE_NAME`) to `templateMetadataFile` (`CARBONE_TEMPLATE_METADATA_FILE_NAME`). Default value is "metadata.db".
-   `databaseName` (`CARBONE_DATABASE_NAME`) remains supported for backward compatibility and automatically enables `templateManagement=true`. If both old and new parameters are set, Carbone uses the new parameters in priority
-   ☝️ Add a single boolean configuration parameter, `templateManagement` (or `CARBONE_TEMPLATE_MANAGEMENT`), to enable the template management. It replaces the old method, which required setting a filename in `databaseName` (or `CARBONE_DATABASE_NAME`).
-   ⚡️ 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
    -   Carbone now regularly flushes template metadata to `/template` as:
        -   `.metadata.db.0` = current
        -   `.metadata.db.1` = previous
    -   If template plugin hooks are implemented (`writeTemplate` and `readTemplate`), these files are also stored on external storage as:
        -   `.metadata.db.0.backup` = current
        -   `.metadata.db.1.backup` = previous
    -   Combined with the existing conflict-free synchronization (`peerPort` and `peerEndpoints`), this allows cluster nodes to start and stop dynamically while staying in sync without data loss
    -   Additional parameters:
        
        ```js
        /* Flush frequency on disk / external storage */
        templateMetadataFlushCron: '5 0 * * *', // = 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
        ```
        
    -   Startup lifecycle:
        -   On startup, Carbone tries to load the latest flushed metadata from external storage `.metadata.db.0(.backup)` or from the shared `/template` volume
        -   If the current file is missing, Carbone falls back to `.metadata.db.1(.backup)`
        -   It then fetches the missing events from other peers since the last persisted flush. It is possible because each cluster node keeps events for `templateMetadataPatchRetentionHours`.
        -   HTTP servers start only after synchronization is complete
    -   Shutdown lifecycle:
        -   If the cluster node is elected leader (the oldest peer ID), it automatically flushes metadata based on `templateMetadataFlushCron`, or on exit if `templateMetadataFlushOnExit=true`
        -   Before overwriting `.metadata.db.0(.backup)`, Carbone copies the previous file to `.metadata.db.1(.backup)`, locally and on external storage when plugin hooks are enabled
        -   If the cluster node is not the leader, it ensures all local changes are synchronized with the other nodes before exiting
-   Removed the `backup` directories.
-   Rewrite startup logs for better readability.
-   Fix the Prometheus metric `replication_connected_peers` and add `last_successful_backup_timestamp`.
-   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).
-   Accept `peerEndpoints` without a port. In that case, it assumes the endpoints use the same port as `peerPort`.
-   `peerEndpoints` accepts a domain name with or without a port. It resolves the domain automatically and uses all returned IP addresses as peer endpoints.
-   Accept the `in` unit in PPTX/ODP when using the `:transform` formatter.
-   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.
-   Improve the API rules for `PATCH /template/:id` and `POST /template`:
    -   Fix an inconsistency between the documentation and the API about the constant value used to set the “current timestamp” (`42000000000` vs `4200000000`). The API was expecting `4200000000` (one zero was missing).
    -   Return an error if `deployedAt` has the same value as the currently deployed version.
    -   Return an error if a template changes its ID and there is a conflict (same value) with the `deployedAt` of the currently deployed version.
    -   Return an error when the new `deployedAt` 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.

## v5.3.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.3.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.3.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.3.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.3.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.3.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.3.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: February 23rd 2026
-   Remove unsupported/outdated conversion format: mediawiki (mediawiki), StarWriter (sdw3, sdw4, vor, vor3, vor4, vor5), AportisDoc (pdb), StarCalc (sdc, sdc3, sdc4), StarDraw (sxd3, sxd5), X PixMap (xpm), StarImpress (sda, sdd, sdd3, sdd4)
-   \[On-Premise only\] Added new import/export formats supported by the latest LibreOffice version:
    -   Document: Markdown (`md`), SVG (`svg`), WEBP (`webp`), Apple Pages (`pages`)
    -   Spreadsheet: Apple Numbers (`numbers`), Parquet (`parquet`), JSON (`json`)
    -   Graphics: WEBP (`webp`), MS Publisher (`pub`), Corel Draw (`cdr`)
    -   HTML: JPEG (`jpeg`), JPG (`jpg`), WEBP (`webp`), PNG (`png`)
    -   Presentation: WEBP (`webp`)
-   Make Carbone compatible with LibreOffice v26.2, without losing compatibility with older versions.
-   On macOS only, look for an external Python binary in `/Applications/libreoffice-python/Resources/python` and `$HOME/libreoffice-python/Resources/python`, because LibreOffice 25.2.4.2+ no longer allows running the embedded Python.
-   \[EE\] Fixed: The `:html` formatter renders Heading Elements (`<h1>`) with the default "Heading 1" through "Heading 6" styles in DOCX when no custom theme is specified. Previously, in some cases, headings were rendered with the Normal style.
-   \[EE\] Watermarks improvements:
    -   Multiple watermarks can be defined (5 max), each with options for color, position, rotation, size, font, etc.
    -   Supports `{#PAGE_NUMBER}` and `{#PAGE_TOTAL}` variables for dynamic page numbering in watermarks.
    -   Automatic alignment based on the chosen anchor.
    -   Both the old `Watermark` (defaults: centered, 45°) and the new `Watermarks` fields can be used simultaneously.
    -   Up to 4 watermarks can be set at the same time.
    -   Example usage:
        
        ```js
        {
          "convertTo": {
            "formatName": "pdf",
            "formatOptions": {
              // Legacy (backwards compatible): single centered watermark (string)
              "Watermark": "Watermark Carbone.io",
              // New: array of watermark objects
              "Watermarks": [
                {
                  "text": "Confidential Page {#PAGE_NUMBER} / {#PAGE_TOTAL}",
                  "anchor": "topLeft",
                  "offsetX": 10,
                  "offsetY": 10,
                  "rotation": -45,
                  "color": "#000000",
                  "size": 64,
                  "opacity": 0.21,
                  "font": "Helvetica",
                  "fromPage": 1,
                  "toPage": 10
                }
              ]
            }
          }
        }
        ```
        
        All properties except `text` are optional. Validation rules:
        -   `text`: Watermark label; 1–2000 characters. Supports `{#PAGE_NUMBER}` and `{#PAGE_TOTAL}` variables.
        -   `anchor`: Page position. One of: `topLeft`, `top`, `topRight`, `left`, `center`, `right`, `bottomLeft`, `bottom`, `bottomRight`. Default: `center`.
        -   `offsetX`: Horizontal offset in pt (points). Default: `0`. In PDFs, origin is bottom-left, so positive values move right.
        -   `offsetY`: Vertical offset in pt. Default: `0`. In PDFs, positive values move up from the anchor.
        -   `rotation`: Rotation in degrees (`-360` – `360`). Default:
            -   `center`: any value allowed
            -   others: only `0`, `90`, or `-90` allowed
        -   `color`: Color in `#RGB` or `#RRGGBB` format (e.g. `#000000`, `#fff`). Default: `#000000`.
        -   `size`: Font size in pt. `1`–`2000`. Default: for anchor `center`, automatic; otherwise `12`.
        -   `opacity`: Between `0` and `1`. Default: `0.1` for `center` anchor, `1` for others.
        -   `font`: Default `Helvetica`. Allowed values:  
            `Courier`, `Courier-Bold`, `Courier-Oblique`, `Courier-BoldOblique`, `Helvetica`, `Helvetica-Bold`, `Helvetica-Oblique`, `Helvetica-BoldOblique`, `Times-Roman`, `Times-Bold`, `Times-Italic`, `Times-BoldItalic`.
        -   `fromPage`: First page (1-based) to apply. Default: `1`.
        -   `toPage`: Last page (1-based) to apply. Default: all following pages.

## v5.2.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.2.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.2.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.2.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.2.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.2.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.2.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: February 9th 2026
-   Fix: the `GET /templates/tags` and `GET /templates/categories` endpoints now list only tags and categories from deployed templates (same logic as `GET /templates`), sorted by name.
-   Studio now automatically detects the base path when Carbone is served behind a reverse proxy under a subpath (for example, `https://<domain>/sub/path`)
-   Fix: prevent a possible crash when a PDF form contains an invalid Carbone tag
-   Fix: accept parsing of invalid PDF forms
-   **Array search expressions are now supported in all formatters.**  
    Example: `:print(d.tables[searchExpression].id)`. This feature is enabled only when the pre-release tag `{o.preReleaseFeatureIn=5002000}` is used. Supported `searchExpression` forms:
    -   **Index lookup**: `[INTEGER]` Selects the element at a numeric index.
        -   Example: `{d[i].movies[i].id:print(..actors[10].name)}`
    -   **Current iterator lookup**: `[.i]` Uses the current loop index.
        -   Example: `{d.movies[i].id:print(..otherTable[.i].name)}`
    -   \[NEW\] **Equality lookup**: `[LEFT_OPERAND = RIGHT_OPERAND]`  
        Filters the target array and returns the first matching element.
        -   Rules:
            -   Only one equality expression is allowed per lookup.
            -   `LEFT_OPERAND` must be relative to the searched array items and must match types (e.g., `integer` cannot match `string`).
                -   You can write `id` or `.id` (both are accepted).
                -   Example: in `{d.movies[i].id:print(..actors[id=.actorId].name)}`, `id` refers to a field on objects inside the `actors` array.
                -   Important: if you write something like `d.sub.id`, `d` is treated as a field on the searched array item, not an absolute root path.
            -   `RIGHT_OPERAND` can be either:
                -   a relative path from the main tag (starting with `.`), or
                -   an absolute path starting with `d.` or `c.`.
                -   Example: `{d.movies[i].id:print(..actors[id=.actorId].name)}` where `.actorId` comes from the current `movies` item.
            -   If `RIGHT_OPERAND` does not start with `d.`, `c.`, or `.`, it is treated as a constant string.
                -   Limitation: constant strings cannot contain whitespace.
-   **\[EE\] HTML Formatter Improvements:**
    -   New Beta Feature: The `:html` formatter now supports rendering HTML Headings Elements in ODT/DOCX/PDF documents (h1/h2/h3/h4/h5/h6).
        -   To enable this, use the pre-release tag: `{o.preReleaseFeatureIn=5002000}`. Without it, the heading text is rendered into a single paragraph.
        -   The default Heading theme of the document is applied by default. It is possible to provide a custom Heading Theme:
            1.  In Word or LibreOffice, you need to define a theme for each Heading level. The theme names must end with a number corresponding to the heading level (e.g., "theme-custom-1" for H1, "theme-custom-2" for H2, etc.). To Create a Custom Heading Theme:
                -   LibreOffice: "Style" Menu > Manage Styles > Right-click on "Headings" > New > Define name (e.g., "theme-custom-1") > Inherit From: Select heading level (e.g., "Heading 1") > Customize Font Style > OK > Save Template. Note: Missing themes for any heading level will prevent rendering in the document.
                -   MS Word: "Home" Tab > "Styles Pane" Button > "New Style" > Define name (e.g., "theme-custom-1") > Style Type: "Paragraph" > Style based on: Select heading level (e.g., "Heading 1") > Customize Font Style > OK > Save Template. Note: Missing themes for any heading level will use the default style.
            2.  Use the prefix in the "headingtheme" option. For example, if the themes are named `theme-custom-1`, `theme-custom-2`, etc., set "headingtheme" to `theme-custom-`. Example usage: `{d.value:html(headingtheme:theme-custom-)}`.
        -   Automatic Closing: Headings without end tags are automatically closed when followed by a block element, such as `<p>` or `<li>`.
        -   Nospace Mode: An empty paragraph is added after the closing tag to mimic web browser spacing. To remove it, use the "nospace" option with the HTML formatter, e.g., `{d.content:html(nospace)}`.
        -   Inline Mode: Headings are supported and injected as text within the current paragraph. Example usage: `{d.content:html(inline)}`.
        -   Compliance with Official HTML Specification:
            -   Allowed Child HTML Elements: `<img>`, `<a>`, `<span>`, `<strong>`, `<em>`, `<br>`, `<i>`, `<b>`, `<u>`, `<s>`, `<del>`, `<tab>`
            -   Allowed Parent HTML Elements: `<ul>`, `<ol>`, `<table><tr><td>`, `<div>`
            -   Not Allowed Child HTML Element: `<p>`, `<table>`, `<ul>`, `<ol>`, `<div>`, or another Heading `<h>`. Note: If any of these elements are found, the heading element will be automatically closed before the child element is opened.
            -   DOCX Limitation: Heading elements within lists (`<ul>`, `<ol>`) are rendered as formatted text with bullets rather than semantic headings, due to DOCX format constraints.
    -   New Beta Feature: Insert page breaks before or after paragraphs using Inline CSS `break-before="page"` or `break-after="page"`. This style currently applies only to Paragraph Elements (`<p>`) and requires the pre-release tag `{o.preReleaseFeatureIn=5002000}` to be enabled; otherwise, it is ignored. Notes: Page break are not executed when located in: Headers, Footers, Table Cells.
    -   Improved: Hyperlinks wrapping multiple block elements (`<p>`, `<ol>/<ul>`, `<h1>/<h6>`, `table`, `img`) are now correctly converted to DOCX/ODT formats.
    -   Fixed: HTML table elements in DOCX now correctly apply the default "TableGrid" theme (solid black borders) when no custom theme is defined. Previously, some tables appeared without borders due to missing style application.
    -   Fixed: HTML list items (`<li>`) with text-only content inside table cells (`<td>`) are now correctly converted to ODT and DOCX without generating malformed documents.
    -   Fixed: Table rows in ODT templates now correctly include valid row style IDs, resolving rendering issues.
    -   Fixed: When Carbone tags are placed in ODT headers/footers with custom paragraph styles, the injected HTML content now correctly inherits those styles instead of reverting to defaults.

## v5.1.5

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.5-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.1.5-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.5-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.1.5`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.1.5`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.1.5`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: January 21st 2026
-   Studio: Fix opening templates when all versions have `deployedAt = 0`.

## v5.1.4

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.4-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.1.4-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.4-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.1.4`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.1.4`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.1.4`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: January 19th 2026
-   \[EE\] HTML Formatter Tables Improvements
    -   New Feature: Automatic Table Styling from Template Themes.  
        For DOCX only, injected tables can now automatically inherit styling from existing Table Themes defined in the template. This feature is not supported for ODT templates. The priority order for theme application is:
        1.  Explicitly passed theme name via the `tabletheme` argument (e.g., `{d.content:html(tabletheme:GridTable2-Accent3)}`).
        2.  Default theme set for the entire document. Instructions to set a default theme for the entire document: Open your DOCX template > Insert a table and navigate to the "Table Design" tab. > Right-click a theme and select "Set as Default" > "This Document Only". > Delete the temporary table and save the template. > This ensures all injected tables use the default theme unless overridden.
        3.  Fallback theme: "TableGrid" (used if no other theme is specified).
    -   Fixed: DOCX templates now render tables at 100% of the document body width, preventing overflow.
    -   Fixed: ODT templates now render tables at 100% of the document body width consistently, resolving issues where complex tables were previously shrunk.
    -   Fixed: Column widths in DOCX and ODT templates are now consistent and evenly distributed.
    -   Improved: `<th>` elements in DOCX and ODT templates now render as bold text, aligning with the HTML standard.
    -   Note: To enable HTML table rendering, use the pre-release tag: `{o.preReleaseFeatureIn=5000009}`.
-   Accept Watermark with number value instead of string
-   Disable tagged PDFs when the Chrome converter is used, to generate smaller and faster PDFs by default.
-   Add the boolean option `generate-tagged-pdf` when converting from HTML to PDF using the Chrome converter (`converter: 'C'`). The default is `false`.
    
    ```html
    <carbone-pdf-options generate-tagged-pdf="true" />
    ```
    

## v4.26.2

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.2-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.26.2-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.2-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.26.2`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.26.2`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.26.2`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: January 19th 2026
-   Accept invalid input silently (as in `v4.26.0`) to avoid regressions.

## v5.1.3

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.3-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.1.3-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.3-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.1.3`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.1.3`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.1.3`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: January 17th 2026
-   Update dependencies
-   ⚠️ Fix a critical security issue identified in a recent audit

## v4.26.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.26.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.26.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.26.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.26.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: January 17th 2026
-   Update dependencies
-   ⚠️ Fix a critical security issue identified in a recent audit

## v3.8.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-3.8.1-linux-x64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-3.8.1-macos-x64)

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: January 17th 2026
-   Update dependencies + latest IANA database to manage correctly Daylight Saving Time
-   ⚠️ Fix a critical security issue identified in a recent audit

## v5.1.2

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.2-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.1.2-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.2-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.1.2`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.1.2`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.1.2`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release January 14th 2026
-   In SVG templates, automatically replace ligatures to prevent Carbone tags from breaking. This addresses an issue where Affinity Designer and Adobe Illustrator tend to insert ligatures inside Carbone tags by default.
-   Fix the download issue when calling `GET /template/templateOrVersionId_sample.json` (the second call always returned the template instead of the JSON sample).

## v5.1.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.1.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.1.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.1.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.1.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release January 7th 2026
-   Embedded Web Component Studio improvements
    -   Restored the previous `studio.openTemplate(template, options)` method from before 5.1.0 for easier [migration](/documentation/developer/on-premise-installation/upgrade-guide.md#v5-0-v5-1-1). This function now displays a deprecation warning (superseded by `openTemplateVersionId`).
    -   Removed the ambiguous `studio.openTemplateWithVersioning` API.
    -   Added `studio.openTemplateId(id)` to open a template by its 64-bit ID and automatically load all related versions.
    -   Added `studio.openTemplateVersionId(versionId, type, defaultTemplateAttributes)` to open a template by versionId.  
        In embedded-versioning mode, this will automatically assign a unique 64-bit ID to the template.
-   \[On-Premise\] Fix: In the template list, the Studio does not display the "Free tier" label or the call-to-action button to disable template auto-delete.

## v5.1.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.1.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.1.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.1.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.1.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.1.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release January 6th 2026
-   \[EE\] Fixed an issue with the `:html` formatter for ODT templates when a `<table>` contained only one column.
-   \[EE\] Fix XLSM processing
-   Fix `:formatR` formatter: the country was not translated when Carbone was compiled as a binary package.
-   Studio improvements
    -   Fix Online HTML editor encoding/decoding when editing HTML with accented characters
-   Multiple Embedded Web Component Studio fixes and improvements:
    -   ⚠️ The Studio API has breaking changes. Please read this [migration guide](/documentation/developer/on-premise-installation/upgrade-guide.md#v5-0-v5-1-1).
    -   Do not listen for navigation URL changes in embedded mode.
    -   Add the ability to customize the list of available Carbone API versions (it can be removed completely).
    -   Always use a valid data URI (instead of mixed base64/data URI) in API calls and `template:updated` events.
    -   Fix duplicated origin in some API calls when using a custom origin with `studio.setConfig({ origin: "URL" })`.
    -   Add the ability to reset the Studio state with `studio.reset()`.
    -   Allow updating the Carbone theme and CSS at any time (even after init).
    -   Trigger the `template:updated` event from the Online HTML editor, and fix unnecessary events triggered with empty values.
    -   The `template:updated` event now contains 3 attributes: `createdAt`, `dataURI`, `type`.
    -   Clearly separate the two embedded Studio modes: `embedded` and `embedded-versioning` [more info](/documentation/developer/embedding/studio-web-component.md#embedded-mode), and adapt the UI accordingly.
    -   Add the Studio mode `off` to start Studio silently and set state before making it visible.
    -   Trigger the `options:updated` event when currency, timezone, API version, or converter changes.
    -   The `template:saved` event returns a reference to the internal template object with all template attributes.
    -   Add the `template:deployed` event when `embedded-versioning` mode is used.
    -   Remove the Save button and the versioned file list in the default `embedded` mode.
    -   `studio.setConfig()` can be called multiple times with a sparse object (only provided attributes are updated; others stay unchanged).
    -   `studio.setConfig()` accepts new parameters to set Studio mode, theme, version, and enable versioning.
    -   `studio.setRenderOptions(options, forceRefreshPreview = false)` automatically shows the “Update preview” button if needed. The second parameter `forceRefreshPreview` can refresh the preview without waiting for the user to click the refresh button.
    -   `studio.getRenderOptions()` returns new parameters: `reportName` and `converter`.
    -   `studio.openTemplate(template)` now accepts `versionId` and `type` (instead of `templateId` and `extension`) and works only in `embedded` mode.
    -   Add `studio.openTemplateWithVersioning(template)` to open a template by ID and automatically load all versions (like in Carbone Cloud).
    -   Add `studio.openTemplateDataURI(templateDataURI, defaultTemplateAttributes)` to open a template from a data URI.
    -   Add `studio.openTemplateURL(templateURL, sampleDataURL, defaultTemplateAttributes)` to open a template and sample data from external URLs.

## v5.0.9

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.9-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.9-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.9-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.9`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.9`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.9`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 19th 2025
-   Fix: `:convCRLF` now preserves whitespace in DOCX
-   \[On-Premise\] Official multi-tenancy support: If `req.tenantId` is set in a global `before` middleware plugin, Carbone separates data by `tenantId` in the database.
    -   By default, without plugins, template files are stored on disk using the pattern `tenantId-versionId`.
    -   If storage plugins are used (`writeTemplate`, `readTemplate`, `deleteTemplate`), it is up to the developer to separate files per `req.tenantId` (different filename, bucket, etc.).
    -   All endpoints become tenant-sensitive (for example, `GET /templates` returns only the templates for that specific tenant).
    -   `tenantId` must be a non-negative 64-bit signed integer. Since JavaScript integers are limited to 53 bits, string values are accepted to fully use the full 64-bit range. (`'1'` to `'9223372036854775807'`). If this constraint is not respected, an error is returned.
    -   To enforce security, the bit-field `securityLevel` (`CARBONE_SECURITY_LEVEL`) parameter can be set to `0b00000010` (2) to enforce multi-tenancy and make `tenantId` mandatory. This disables Carbone’s default behavior when no tenantId is used, where templates are stored in the database with `tenantId = 0` and template files are stored on disk without a tenant ID.
-   \[On-Premise\] Return an error when a `before` middleware plugin is not a function.
-   \[EE\] New Beta Feature: The `:html` formatter now supports rendering HTML tables in ODT/DOCX/PDF documents. You can inject all HTML markups supported by the formatter (e.g., images, lists, bold, paragraphs) within table cells.
    -   To enable this, use the pre-release tag: `{o.preReleaseFeatureIn=5000009}`. Without it, the table text is rendered into a single paragraph.
    -   Supported: Rows, columns, cells, colspan, and rowspan.
    -   Not supported: `<tbody>`, `<thead>`, and `<caption>` tags.
    -   Default styling: Tables are rendered with a black solid border (custom styling is not available yet).

## v5.0.8

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.8-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.8-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.8-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.8`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.8`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.8`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 12th 2025
-   Studio:
    -   Fix incorrect base64 conversion when using the online HTML editors.  
        It now correctly supports emojis, accented characters, etc.
    -   Fix invisible caret when pasting content with a white background.
    -   Update to the latest Squire editor to fix some other issues.
-   Improved `appendTemplate` behavior:
    -   Better performance and no need to expose `localhost` for internal requests.
    -   Disallows a nested document from using `appendTemplate`, to avoid circular dependencies or complex dependency trees.
    -   Returns error messages from nested templates.

## v5.0.7

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.7-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.7-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.7-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.7`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.7`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.7`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 5th 2025
-   Fix leader election in a cluster of Carbone nodes for automatic deletion of expired templates

## v5.0.6

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.6-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.6-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.6-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.6`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.6`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.6`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 4th 2025
-   Automatically deletes expired templates
    -   A new parameter `templateRetentionDaysAfterExpiry` (`CARBONE_TEMPLATE_RETENTION_DAYS_AFTER_EXPIRY`) can be used to control the number of days after which expired templates are automatically deleted. If `templateRetentionDaysAfterExpiry = 0` (default value), automatic deletion of expired templates is disabled.
    -   This operation is done asynchronously for all templates updated by the API with an expiration date (`POST /template` or `PUT /template`).
    -   Templates deleted with `DELETE /template` are still deleted synchronously for now, but this will become asynchronous in a future version for consistency.
    -   Only one peer, automatically elected (the one with the lowest `peerId`), executes this asynchronous task daily at midnight.
-   Studio:
    -   Fix: the refresh preview button was not shown if the data was modified while the preview was updating.

## v5.0.5

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.5-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.5-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.5-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.5`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.5`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.5`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 1st 2025
-   Fix crash in asynchronous jobs when reports download images/files, and return a timeout error just like in synchronous requests.

## v5.0.4

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.4-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.4-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.4-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.4`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.4`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.4`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release November 27th 2025
-   New formatter `formatR(regionCode)` to format a country/region code into a human-readable region name, in the report's language. It accepts ISO 3166-1 Alpha-3 (FRA, USA, ...), ISO 3166-1 Alpha-2 (FR, US, ...), and ISO 3166-1 Numeric codes (250, 840, ...).
-   \[On-Premise\] Rename `converterFactoryTimeout` (`CARBONE_CONVERTER_FACTORY_TIMEOUT`, `CARBONE_EE_CONVERTERFACTORYTIMEOUT`) to `maxGenerationTime` (`CARBONE_MAX_GENERATION_TIME`). The old parameter can still be used for backward compatibility. If both are defined at the same time, the chosen value is not guaranteed. Use only one of them.
-   Better management of document generation timeout/aborting. `maxGenerationTime` (formerly `converterFactoryTimeout`) now covers the entire generation process, not only the document conversion step. For example, if downloading external images takes too long, the generation is cancelled. Previously, image downloads could continue even after the `converterFactoryTimeout`.
-   Aborted report generations (`POST /render`) are now fully cancelled, including: pending image/file downloads, barcode and eCharts generation, queued conversion jobs, and the current conversion task. In some cases, Carbone may take an additional 5 seconds before cancelling the request and sending the response.
-   \[On-Premise\] Improved startup message, showing a quick overview of all API limits and enabled security settings.
-   \[On-Premise\] New parameters `maxDownloadFileConcurrency` (`CARBONE_MAX_DOWNLOAD_FILE_CONCURRENCY`) and `maxDownloadImageConcurrency` (`CARBONE_MAX_DOWNLOAD_IMAGE_CONCURRENCY`) to set the maximum number of concurrent requests for downloading images/files in a report. Default value is 15 (same as the cloud).
-   \[On-Premise\] Fix for global server timeout: `maxGenerationTime` (formerly `converterFactoryTimeout`) now accepts values above 60 seconds. Previously, the server closed the socket after 62 seconds.
-   Improved timeout error messages in logs and API responses, now including more detailed metrics, for example: `Error: Time limit reached (max 1100 ms). Details: Carbone (1ms) + files/images/barcodes download (2003ms, 0MB) + conversion (0ms)`.
-   Optimizations:
    -   In processing drop/keep tags: for templates containing many drop/keep tags (> 10000), processing can be up to **1000× faster**.
    -   When `isDebugActive` is true (for the debugging studio), concatenating Carbone tags in the JSON result can also be up to **1000× faster** for templates containing more than 10000 Carbone tags.
-   When `isDebugActive` is true, the `planTime` metric is more accurate and includes other sub-processes.

## v5.0.3

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.3-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.3-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.3-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.3`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.3`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.3`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release November 14th 2025
    
-   Improved converter error handling to capture all errors in debug mode
    
-   Fix: show correct metrics when files are injected into the template with `appendFile` in the Studio logs
    
-   Added `:appendTemplate(templateIdOrVersionId, position)` formatter to append an external template to the generated document. It sends the data to another template, generates that template (as PDF), and appends the result to the current document. This can also be used inside loops to append multiple documents. It can optimize the generation of a PDF with 20,000 pages by concatenating many small, parallelized PDFs generation instead of generating one huge file. The following options are automatically forwarded to the appended template: `lang`, `currency`, `enum`, `converter`, `translations`, `complement`.
    
    Carbone returns an error if:
    
    -   The appended template fails during generation.
    -   The number of appended files exceeds `maxDownloadFileCount`.
    -   The combined size of appended files exceeds `maxDownloadFileSizeTotal` (MB).
    
    Carbone ignores the formatter and generates the main report normally if:
    
    -   The formatter receives `null`, `undefined`, or an empty string.
    -   The final report is not a PDF (only PDFs can be appended).
    
    Notes:
    
    -   Available only in Carbone On-Premise.
    -   No protection against infinite loops.
    
    Parameters:
    
    -   `templateIdOrVersionId`: The ID or version ID of the template to append.
    -   `position`: Insert position: `"start"` or `"end"` (default).
    
    Usage example:
    
    -   If the main template contains this loop: `{d.myArray[i]:appendTemplate(110212)} {d.myArray[i+1]}`
    -   The nested template will receive each object of the `myArray` as data under `{d.}`.
    -   Each object generates a new document that is appended to the main document.

## v5.0.2

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.2-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.2-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.2-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.2`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.2`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.2`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release November 7th 2025
-   The endpoints `POST /render` and `POST /template` accept templates in base64 format that are just below the `maxTemplateSize` limit (the base64 size is correctly converted to byte size).
-   \[On-Premise\] Updates only the `expireAt` field if the message received on the WebSocket contains only `versionId` and `expireAt`.

## v5.0.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release November 4th 2025
-   \[On-Premise\] Fix: ignore `iss` in JWT tokens to accept tokens generated with Carbone v4.
-   \[On-Premise\] Fix: in the systemd script, use `KillMode=mixed` to ensure that only the main process receives the SIGTERM signal. This allows Carbone to gracefully shut down its child processes (Chrome, LibreOffice, OnlyOffice). Following Linux recommendations, `TimeoutSec=180` is set to let the OS send the final SIGKILL to all processes and child processes if Carbone does not exit automatically.

## v5.0.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release October 31th 2025
    
-   **\[Team\] message**
    
    Yes - here we are! 🎉 This is the **final v5 release** of Carbone! 😅
    
    The changelog below includes **only the updates since the last public beta (v5.0.0-beta.21)**.
    
    We’ll soon update our website with a full summary of the v5 release and migration tips 😉. All AI-related features have been postponed to Carbone v5.2, and the first features will be publicly available for Christmas Day. 🎄
    
    Thank you all for your feedback!
    
-   **\[Studio\] Fixes and Improvements**
    
    ✨ User Experience
    
    -   Improved the tag/category search dropdown on the template list page: no more duplicate names.
    -   Enhanced the search input placeholder to explain that users can search for or create a new tag or category.
    -   Made the template list more responsive by hiding less important columns on smaller screens.
    -   Show a progress icon while requests are running in the list.
    -   Increased the search field size to make copying/pasting `versionId` easier, and show the searched fields.
    -   Improved the style of switches and the home page button.
    -   Updated the welcome screen and added a message when no recent templates are available.
    -   Temporarily hide the AI Template Generator (coming back later).
    -   Improved pagination: now displays the total number of templates instead of page numbers.
    -   In the list, show templates created in the studio by default.
    -   Accept XLS exports.
    -   Added XHTML and XLS icons, and fallback to a generic icon for unknown formats.
    -   The preview now updates automatically when switching between embedded and default PDF viewers.
    -   \[Cloud Edition only\] Added a guided tour for new users.
    -   \[Cloud Edition only\] Managed paid/free feature visibility.
    
    🧱 Template Management
    
    -   Prevent users from deleting the deployed version in the template panel.  
        (Deleting the deployed version would remove all versions)
    -   Added a button to view ephemeral templates in the list and remove their expiration.
    
    🐞 Bug Fixes
    
    -   Fix: translations are now correctly saved.
    -   Fix: "New" (upload) button now works in Firefox and Safari, with a warning message when needed.
    -   Fix: stopped upload animation when clicking on "New" (Safari doesn’t trigger `mouseleave` events).
    -   Fix: the Studio now works in older browsers (e.g., Firefox 115).  
        It automatically disables the embedded PDF viewer when incompatible and uses the native browser viewer.
    -   Fix: `expireAt` value is now correctly handled.
    -   Fix: return a clear error when a template cannot be downloaded with live reload.
    -   Fix: call `fetchOverride` when downloading a template for live reload.
    -   Fix: templates continue to save with the v5 API, even if an older Carbone version is selected for preview.
    -   Fix: read-your-writes consistency when the backend is distributed (via `Carbone-Session-Token` header).
    -   Fix: automatically add a template ID and `deployedAt` if not defined (for templates uploaded without versioning).
    -   Fix: show the `versionId` in the list when the name is empty.
    -   Fix: automatically update the preview when opening a template without versioning (`templateId` missing).
    -   Fix: Undo/Redo in the JSON editor now properly triggers the preview update.
    -   Fix: saving JSON samples now works correctly.
    
    🔐 Security and Configuration
    
    -   Added optional `loginRedirectUrl` (or `CARBONE_LOGIN_REDIRECT_URL`) configuration on backend to control the authentication redirect.
        -   Active only when the Studio is enabled.
        -   Backend redirects when accessing `/`.
        -   Frontend redirects when the API returns `401 Not Authorized`.
    -   Enforced stronger Content-Security-Policy and Cross-Origin settings.
    -   Enabled caching for the Studio JS app with cache busting.

-   **\[API\] Fixes and Enhancements**
    
    ⚙️ Endpoints and Behavior
    
    -   Fix: `POST /template` now accepts any positive `expireAt` value.
    -   Fix: `PATCH /template` now returns `versionId` and the updated attributes.
    -   Added an optional `origin` field in `/template(s)` endpoints (0 = uploaded by API by default, 1 = uploaded from Studio).
    -   Added logs for authentication errors on the backend.
    -   Added `GET /me` endpoint for Cloud Edition to retrieve basic user info and show a Gravatar icon in Studio.
    -   Fix: `reportName` now works correctly with batch processing.
    -   Added `batchReportName` to define individual filenames inside ZIP exports (see below).
    
    📊 Performance and Rendering
    
    -   Optimized `POST /render` for large JSON files, up to 120 ms faster for 60 MB JSON.
    -   \[Cloud Edition only\]: the "Carbone" watermark in preview mode is now applied only to the first 5 pages plus 1 random page (faster previews).
    -   The total HTTP request timeout is now `converterFactoryTimeout + 8 seconds` (was +2 seconds), giving more time to download images.
    -   Added support for the `:html` formatter in XHTML templates.
    -   Allow inserting images with direct array access in XLSX templates (e.g., `{d.myArray[2].image}`).
    -   Fix: improved currency formatting for the Indonesian locale (`id`). `:formatC` now outputs `Rp1,400.00` instead of `1,400,00 Rp`.

-   **\[API\] POST /render Added batchReportName**
    
    Customize each file’s name in a ZIP batch export using `batchReportName`. Tags used in the name follow the same syntax as in templates (relative or full JSON paths).
    
    _Example 1 - Template using the full JSON path_
    
    -   Template: `Title {d.items[i].id} / {d.items[i+1].id}`
    -   Data: `{ items = [{ id: 1 }, { id: 2 }, { id: 3 }] }`
    -   Options:
        -   `batchSplitBy = "d.items"`
        -   `batchReportName = "report-{d.items[0].id}"`
        -   `reportName = "final_name_{d.items[0].id}"`
    -   Result:
        -   ZIP filename: `final_name_1.zip`
        -   Files inside ZIP: `report-1.pdf`, `report-2.pdf`, `report-3.pdf`  
            (Here, `{d.items[0].id}` is replaced dynamically as if written `{d.items[i].id}`.)
    
    _Example 2 - Template using the relative JSON path_
    
    -   Template: `Title {d.id}`
    -   Data: `{ items = [{ id: 1 }, { id: 2 }, { id: 3 }] }`
    -   Options:
        -   `batchSplitBy = "d.items"`
        -   `batchReportName = "report-{d.id}"`
        -   `reportName = "final_name_{d.items[0].id}"`
    -   Result:
        -   ZIP filename: `final_name_1.zip`
        -   Files inside ZIP: `report-1.pdf`, `report-2.pdf`, `report-3.pdf`

-   **\[Backend\] New Database Management**
    
    📂 Folder change
    
    If the database is enabled, Carbone now stores template metadata in a local SQLite database located in `/database` instead of `/config`. On first startup, Carbone automatically copies the existing database to the new folder and applies schema migrations.  
    On next startups, if `/database` already contains a valid database, Carbone loads it directly and ignores the old one.  
    The old database remains as a backup but can be safely deleted later.
    
    ⚠️ Important
    
    The `/database` folder must **not** be shared between multiple Carbone nodes. The replication and automatic backup features handle synchronization across the cluster (see below).
    
-   **\[Backend\] Database Replication for High Availability**
    
    💡 Why?
    
    When Carbone runs with all features (Studio, `templateId`/`versionId`, API to list templates), a small SQLite database is required to store metadata about templates. This database can now be automatically replicated across multiple Carbone nodes using an internal WebSocket network. In the upcoming releases, Carbone will use this internal network to efficiently distribute jobs across the entire cluster, even with multiple heterogeneous Carbone versions and converters.
    
    ⚙️ How it works
    
    Carbone uses a **high-performance, conflict-free replication system** with no master, no single point of failure or no leader bottlenecks. All nodes can write data (multi-writer model). Temporary divergences may occur but all replicas always converge automatically. By default, Each node stores **25 hours of journal events**. This allows each node to restore only the **missing events** within that time window. If the downtime exceeds 25 hours, the node must be restarted from a **recent database backup** (less than 25 hours old).
    
    🧰 How to enable it
    
    Open an internal WebSocket communication port in your cluster to synchronize all nodes:
    
    -   `peerPort`: `'5001'` - listening port for WebSocket connections
    -   `peerEndpoints`: `'ws://10.0.0.1:5001, ws://10.0.0.2:5001, ws://10.0.0.3:5001'` - list of all peers (including self; Carbone automatically detects and closes local loops). In this version, all nodes must be aware of each other.
    -   The system can be enabled only when the `databaseName` is defined.
    -   ⚠️ **Warning:** this internal channel is **not authenticated or encrypted**. Use it only inside a secure private network.
    
    🪶 How to log traffic
    
    Add one of these environment variables when starting Carbone:
    
    -   `DEBUG=carbone:event-bus` → show all event bus messages, including those printed by `carbone:db`
    -   `DEBUG=carbone:db` → show all database synchronization messages
    -   `DEBUG=carbone:db:*:write` → log all write operations sent/received
    -   `DEBUG=carbone:db:*:ping` → log ping messages sent/received
    -   `DEBUG=carbone:db:*:retry` → log retry attempts (startup sync or lost packets)
    
    📨 How to modify the database content manually
    
    Templates can be added or updated in the database via an external WebSocket connection.  
    Each new template object is automatically synchronized across the cluster.  
    The same rules as the public API `POST /template` apply, except that `createdAt` and `tenantId` can be set manually (Multi-tenancy mode will be explained in a future release)
    
    ```json
    {
      "type": "template",
      "meta": {
        "tenantId": 0
      },
      "payload": {
        "name": "name1",
        "type": "docx",
        "versionId": "1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c",
        "expireAt": 1859253047716,
        "deployedAt": 1,
        "size": 1000,
        "comment": "comment1",
        "tags": ["tags1"],
        "category": "cat1",
        "createdAt": 1707523200
      }
    }
    ```
    
    The database can also be opened with an SQLite editor. However, direct modifications made in the tables will not be replicated across the cluster. If you edit the database manually, it is your responsibility to apply the same changes to all nodes in the cluster. ⚠️ Do **not** modify the database while Carbone is running. Note that a backup created from one node can be restored on another node interchangeably.
    
    🔑 Peer ID generation
    
    Each Carbone node creates a unique `peerId` (timestamp + random number) at startup.  
    If you use stateful servers, this ID is saved in `assets/.carbone-peer-id` and reused after restart.  
    In stateless systems (like Docker), it changes on each restart.  
    A fixed peer ID helps debugging but is not required.
    
    🧪 Stability status
    
    This replication system is still young but already used in production in our cloud environment.  
    We recommend waiting for Carbone v5.1, which will introduce automatic backups on S3 and full stateless support for Docker and Kubernetes at scale.
    
-   **\[Backend\] Database Automatic Backup (S3 / Volume / Disk)**
    
    🕒 Coming soon
    
    More details will be included in Carbone v5.1.
    
    💡 Tip (manual backup)
    
    You can back up your SQLite database manually using the CLI:
    
    ```bash
    sqlite3 "file:/carbone-ee/database/database.sqlite?mode=ro" ".backup '/var/tmp/backup.sqlite'"
    ```
    
-   **\[Backend\] New OpenMetrics interface** on the internal `peerPort` with an HTTP GET `/metrics` endpoint, directly usable by Prometheus or similar tools.
    
    ```sh
      # HELP Number of reports currently in progress inside Carbone (queued, rendering).
      # TYPE gauge
      carbone_reports_inflight{stage="queued"} 12
      carbone_reports_inflight{stage="rendering"} 5
    
      # HELP Total number of reports rendered by Carbone, labeled by result.
      # TYPE counter
      carbone_reports_rendered_total{result="success"} 21
      carbone_reports_rendered_total{result="error"} 3
    
      # HELP Number of peers currently connected to this node.
      # TYPE gauge
      carbone_db_replication_connected_peers{peer="1000"} 1
    
      # HELP Current replication lag in seconds (this peer vs upstream peer)
      # TYPE gauge
      # UNIT seconds
      carbone_db_replication_lag_seconds{peer="1000", remote_peer="3000"} 0.1
    
      # HELP Total number of retransmission requests sent to peers for missing/drop/out-of-order sequences
      # TYPE counter
      carbone_db_replication_retransmission_requests_total{peer="1000", direction="sent"} 10
      carbone_db_replication_retransmission_requests_total{peer="1000", direction="received"} 0
    
      # HELP Total replication messages processed by this node
      # TYPE counter
      carbone_db_replication_messages_total{peer="1000", direction="sent"} 17
      carbone_db_replication_messages_total{peer="1000", direction="received"} 16
    
      # HELP Cumulative wall-clock time spent in maintenance tasks (checks/cleanup/backup)
      # TYPE counter
      # UNIT seconds
      carbone_db_maintenance_time_seconds_total{peer="1000"} 0.0010
    
      # HELP Maximum logical/clock drift observed vs any peer (absolute value)
      # TYPE gauge
      # UNIT seconds
      carbone_db_logical_clock_drift_max_seconds{peer="1000"} 0.0001
    
      # HELP Number of client reads that returned stale/old data
      # TYPE counter
      carbone_db_read_your_write_timeouts_total{peer="1000"} 0
    ```
    
-   **\[Backend\] Improve Graceful Exit on `SIGTERM` signal**
    
    -   When the `SIGTERM` signal is received, `GET /status` returns 503, allowing it to be used as a probe for your load balancer or Kubernetes.
    -   Carbone then shuts down after completing and clearing the queue of all ongoing report generation tasks (including batch processing).
    -   Two new parameters have been added to customize this behavior:
        -   `exitDeadline` or environment variable `CARBONE_EXIT_DEADLINE` (in ms, default: 3 minutes):  
            The maximum total time before the process is forcibly terminated, regardless of ongoing report generation. This defines the absolute shutdown deadline.
        -   `exitQuietPeriod` or environment variable `CARBONE_EXIT_QUIET_PERIOD` (in ms, default: 6 seconds):  
            The delay after all ongoing jobs have finished before shutting down. This allows load balancers or clients to detect the unavailability (HTTP 503 of GET /status).  
            If new requests arrive during this quiet period, they are processed, and a new quiet period starts.  
            If the quiet period passes with no new requests, the process terminates.
    -   Gracefully exit Chrome converter (fixes zygote errors on Linux during shutdown)
    -   Add and improve logs during the shutdown process

## v5.0.0-beta.21

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.21-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.21-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.21-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.21`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.21`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.21`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release September 17th 2025
-   Fix: Prevent storing empty JSON sample data

## v5.0.0-beta.20

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.20-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.20-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.20-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.20`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.20`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.20`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release September 11th 2025
-   The `:sign` formatter no longer returns an error when the signature is removed by a condition **and** the associated data is undefined.

## v5.0.0-beta.19

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.19-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.19-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.19-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.19`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.19`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.19`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release September 9th 2025
-   Fixed Carbone API Authentication to return status code 401 instead of 500 when an API key has expired.
-   \[EE\] Resolved an issue in the `POST /render/template` endpoint where documents generated from ephemeral templates failed to download when using the `?download=true` query parameter

## v4.26.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.26.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.26.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.26.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.26.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.26.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release September 9th 2025
-   Fixed Carbone API authentication to return status code 401 instead of 500 when an API key has expired.
-   Support for sending volatile templates using base64 with a `data-URI` prefix.

## v3.8.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-3.8.0-linux-x64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-3.8.0-macos-x64)

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release September 8th 2025
-   Fixed Carbone API Authentication to return status code 401 instead of 500 when an API key has expired.
-   Carbone On-Premise: add parameter `maxTemplateSize` (bytes) to change default limit (20MB)
-   Accept to send a volatile template when calling the API `POST /render/template`. This template is never stored and it does not trigger the middleware `readTemplate`
    
    ```text
    {
      data      : {},
      template  : "base64-encoded-file-with-or-without-data-URI-prefix",
      convertTo : "pdf"
    }
    ```
    
    This update makes Carbone v3 compatible with the new Carbone v5 Studio.

## v5.0.0-beta.18

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.18-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.18-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.18-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.18`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.18`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.18`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release August 26th 2025
-   \[EE\] Fixed an issue where DOCX templates with dynamic images inside shapes would generate corrupted documents.

## v5.0.0-beta.17

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.17-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.17-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.17-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.17`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.17`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.17`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release August 14th 2025
-   Removed the hard limit on batch jobs per tenant
-   Fixed empty cells when templates were created programmatically using third-party software
-   \[EE\] Fix: Enforced the `template` file field to be the last element in `POST /template` form-data requests
    -   If the `template` file is not the last field in the multipart form, the API now returns a 400 Bad Request error

## v5.0.0-beta.16

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.16-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.16-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.16-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.16`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.16`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.16`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release August 7th 2025
-   Fixed issues with 64-bit numbers when versioning is activated
-   A new parameter `chromeFlags: ""` can be defined in the configuration (or using the environment variable `CARBONE_CHROME_FLAGS`) for the Chrome converter. All flags must be separated by commas. Flags added by Carbone by default cannot be removed or overwritten. Example: `"chromeFlags":"--no-sandbox"`.
-   Resolved an issue where the `:html` formatter was not supported when templates were created programmatically using third-party software.
-   Added support for the `:html` formatter in HTML templates.
-   \[EE\] Added support for the `:barcode` formatter in HTML templates, allowing the injection of barcodes as SVG images. To inject a barcode, insert a Carbone tag within the `src` attribute of an image tag and chain it with the `:barcode` formatter, specifying the type as an argument. For example: `<img src="{d.code:barcode(qrcode)}" alt="Barcode" width="200" height="200">` To adjust the barcode dimensions:
    -   Using the `<img>` tag: Set the `width` and `height` attributes directly on the `<img>` tag.
    -   Using the barcode tag: Specify dimensions within the barcode tag options, for example: `{d.code:barcode(qrcode, 'width:120;height:80')}`
-   \[EE\] Added support for the `:chart` formatter in HTML templates, enabling the injection of ECharts as SVG images. To inject a chart, insert a Carbone tag within the `src` attribute of an image tag and chain it with the `:chart` formatter. Example: `<img src="{d.chartOptions:chart}" alt="Chart Image" width="200" height="200">` To adjust the dimensions:
    -   Using the `<img>` tag: Set the `width` and `height` attributes directly on the `<img>` tag.
    -   Using the EChart configuration: Define the width and height within the EChart configuration object in your JSON dataset, for example: `{ type: "echarts@v5a", width: 600, height: 400, option: { series: [] } }`
-   \[EE\] Support for dynamic hyperlinks in PPTX, ODP, and ODG templates.
-   Includes v4.25.10 and v4.25.11

## v4.25.11

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.11-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.11-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.11-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.11`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.11`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.11`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release August 6th 2025
-   Fixed an issue accessing dynamic variables when combined with array filters, involving two nested arrays and a filter on the parent array. This fix is applied only when the pre-release tag `{o.preReleaseFeatureIn=4025011}` is set (enabled by default in v5).

## v4.25.10

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.10-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.10-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.10-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.10`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.10`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.10`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release July 29th 2025
-   Updated IANA database (2025) - fixes `:formatD` for the America/Mexico\_City timezone, for example
-   Updated dependencies

## v5.0.0-beta.15

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.15-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.15-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.15-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.15`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.15`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.15`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release July 24th 2025
-   Fixed a random bug when using the `:html` formatter multiple times (could apply unwanted styles).
-   Allow whitespace around parameters in the `:html(inline)` formatter
-   Fixed missing migration file in the On-Premise build

## v5.0.0-beta.14

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.14-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.14-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.14-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.14`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.14`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.14`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release July 17th 2025
    
-   **Support for SVG image templates** (backend + Studio).  
    Update SVG by modifying specific attributes based on the provided data with these new formatters:
    
    -   `:svgUpdate(attrName, selectorValue, selectorType)` Updates an SVG attribute (e.g., `fill`, `stroke`) of the selected SVG nodes.
    -   `:svgSelectiveUpdate(attrName, attrValue, selectorType)` Selects SVG nodes and injects a value. This formatter works like the previous one but uses a selector as input instead of a direct attribute value.  
        
    
    _Parameters:_
    
    -   `attrName`: The SVG attribute to update. This can be:
        -   A fixed string in quotes (e.g., `fill`, `stroke`).
        -   A relative path to a property of the parent object (e.g., `.siblingObj.id`).
    -   `attrValue`: The attribute value(s) to insert into the SVG. (e.g., a color value like `'#F00'`).
    -   `selectorValue`: The value used to select the target SVG element(s). This can be:
        -   A fixed string (e.g., `10`).
        -   A data path (e.g., `.siblingObj.id`).
    -   `selectorType`: The SVG attribute used to identify and select shape(s) to modify. Default: `id *`. Options:
        -   `id` : selects only the node with the exact `id`.
        -   `id > *` : selects the node and its direct children.
        -   `id *` : selects the node and all its descendants.  
            
    
    _Template example:_
    
    ```html
      <!-- {d.myTable[].width:svgUpdate('width', .id)} -->
      <!-- {d.myTable[active=true].id:svgSelectiveUpdate('fill', .color)} -->
      <svg width="100%" height="100%" viewBox="0 0 596 842" version="1.1">
        <circle id="B12" cx="220" cy="434" r="149" style="fill:#ebebeb;"/>
        <circle id="B10" cx="379" cy="232" r="122" fill="#ababab"/>
        <circle id="B11" cx="406" cy="638" r="95" fill="#ebebeb"/>
      </svg>
    ```
    
    _After data injection:_
    
    ```html
      <svg width="100%" height="100%" viewBox="0 0 596 842" version="1.1">
        <circle id="B12" cx="220" cy="434" r="149" style="fill:#ebebeb;" width="200"/>
        <circle id="B10" cx="379" cy="232" r="122" fill="#66a200" width="100"/>
        <circle id="B11" cx="406" cy="638" r="95" fill="#aa66aa" width="300"/>
      </svg>
    ```
    
    _Data sample_
    
    ```json
        {
          "id"      : "B10",
          "myTable" : [
            { "id" : "B10", "color" : "#66a200", "active" : true  , "width" : 100},
            { "id" : "B12", "color" : "#aa66aa", "active" : false , "width" : 200},
            { "id" : "B11", "color" : "#aa66aa", "active" : true  , "width" : 300}
          ]
        }
    ```
    
    Only basic SVG shapes are updated: `rect`, `circle`, `line`, `ellipse`, `polygon`, `polyline`, and `path`.
    

* * *

-   🚨 **Major Release** 🚨
    
    All changes described below mainly concern developers who integrate Carbone Studio into their own solutions.  
    Some of these changes may evolve based on feedback from early users. For all other users, everything will continue to work as before (plugins, SDKs, API, document generation, etc.).
    
-   **\[Studio\] New Studio starting modes**: `<carbone-studio carbone-mode="embedded">`
    
    -   `embedded` (default): Displays only the designer page, without template version management. Intended for integrators embedding the Studio.
    -   `light`: Same as `embedded`, but with the Carbone title bar. This is the default Studio interface when opened in a browser without any database configured.
    -   `full`: Displays all pages and full navigation. Available only if a database is defined (see below). This mode is the complete interface that will replace the Studio in the Cloud Edition.
-   **\[Studio\] Add the ability to override fetch requests made by the Studio**
    
    ```js
      const studio = document.createElement('carbone-studio');
      window.addEventListener('DOMContentLoaded', function() {
        document.body.appendChild(studio);
        studio.setConfig({
          fetchOverride : fetchHandler // Override fetch behavior in the Studio 
        });
        function fetchHandler(url, options) {
          console.log('Override fetch called:', url, options);
          const newOptions = {
            ...options,
            headers: {
              ...options.headers,
              'X-From-Studio': 'true'
            }
          };
          if (url.startsWith('/template/')) {}
          if (url.startsWith('/templates/')) {}
          if (url.startsWith('/render/')) {}
          return fetch(url, newOptions);
        }
      });
    ```
    
-   **\[Studio\] New live reload behavior and new events for integrators embedding the Studio**
    
    When live reload is active and the user is editing a template, the Studio now sends ephemeral templates (technically, only `POST /render` is called, no `POST /template`).  
    When live reload is turned off, the user is prompted to save their changes.  
    They can view a list of their changes and switch between the previous and current template versions.  
    For integrators, a new event can be listened to in order to detect when the user clicks the `Save` button:  
    
    ```js
      // Listen for the `template:saved` event to get the new template Id
      studio.addEventListener('template:saved', handler);
      // Event object:
      // {
      //   detail: {
      //     templateId: 'af42af42af42af42af42af42af42af42af42af42af42af42'
      //     type      : 'docx'
      //   }
      // }
    
      // The `template:updated` event is still emitted, but it contains the template as a Base64 string (no template ID)
      studio.addEventListener('template:updated', handler);
      // Event object:
      // {
      //   detail: {
      //     dataURI : '',   // template in base64
      //     type    : 'docx'
      //   }
      // }
    ```
    
-   **\[Studio\] Customize Studio CSS theme**
    
    The component accepts a custom attribute where CSS variables can be passed to override default colors.
    
    -   Method 1: JavaScript
        
        ```js
          studio.setAttribute('carbone-theme', 'main { --primary: #000; }');
        ```
        
    -   Method 2: HTML
        
        ```html
          <carbone-studio carbone-theme="main { --primary: #000; }"></carbone-studio>
        ```
        
    
    Here is a quick overview of all available CSS variables:
    
    ```css
      /* Beer CSS main colors - Material Design */ 
      --primary:#a544c5;
      --on-primary:#ffffff;
      --primary-container:#eecafc; 
      --on-primary-container:#350040;
      --secondary:#6b586b;
      --on-secondary:#ffffff;
      --secondary-container:#cac5ca;
      --on-secondary-container:#251626;
      --tertiary:#9e9e9e;
      --on-tertiary:#ffffff;
      --tertiary-container:#ffdad2;
      --on-tertiary-container:#32110c;
      --error:#ba1b1b;
      --error-container:#ffdad4;
      --on-error:#ffffff;
      --on-error-container:#410001;
      --background:#fcfcfc;
      --on-background:#1e1a1d;
      --surface:#f5f5f5;  
      --on-surface:#1e1a1d;
      --surface-variant:#e8e5e9;
      --on-surface-variant:#1e1a1d;
      --outline:#a7a7a7;
      --inverse-surface:#323639;
      --inverse-on-surface:#f7eef3;
      --inverse-primary:#fbaaff;
      --inverse-on-primary: #371E73;
      --outline-variant: var(--outline);
      --surface-dim: #f4f4f4;
      --surface-bright: #fdf8fd;
      --surface-container-lowest: #ffffff;
      --surface-container-low: #f7f2f7;
      --surface-container: #fff;
      --surface-container-high: #ece7eb;
      --surface-container-highest: #e6e1e6;
      --active: rgba(0,0,0,.1);
      --overlay: rgba(0,0,0,.5);
      /* Studio tab colors */
      --tab-preview-border-color: #999;
      --tab-border-color: #c0aabf;
      --tab-text-color: #999;
      /* JSON Editor colors */
      --json-editor-active-line: rgb(235 204 255 / 27%);
      --json-editor-active-bracket: rgb(193 96 255 / 27%);
      --json-editor-search-match-selected: rgb(237 178 255 / 51%);
      --json-editor-search-match: rgb(255 211 0 / 35%);
    ```
    
-   **\[Studio\] New JavaScript API for interacting with the embedded Studio**
    
    Get or set the rendering options in the Studio using the `studio.setRenderOptions(object)` and `studio.getRenderOptions()` functions.  
    Calling `setRenderOptions()` updates the user interface but does not trigger rendering events. A message will indicate to the user that the preview must be refreshed manually. Example:
    
    ```js
      studio.setRenderOptions({
        data           : {},             // Object or Array
        complement     : {},             // Object or Array
        enum           : {},             // Object
        translations   : {},             // Object
        lang           : 'en-us',        // Lowercase Language Culture Code
        timezone       : 'Europe/Paris', // Timezone Identifier
        currencySource : 'EUR',          // Currency CODE
        currencyTarget : 'EUR'           // Currency CODE
      })
    ```
    
-   **\[Studio\] Miscellaneous User Experience Improvements**
    
    -   Improved drag-and-drop design: you can now also click the drop zone to upload a file
    -   Added support for dragging and dropping JSON directly into the JSON panel (automatically replaces the previously loaded JSON)
    -   Improved icon weight and colors
    -   Fixed a bug that caused double extensions when downloading the generated report
    -   Fixed various other bugs
    -   UX reworked with two clear actions, "New" button to create a new template, "Edit" button to update an existing template
    -   Warns users before leaving the Studio without saving their current work
    -   Fixed white page issue by respecting the `Accept-Encoding` header. Now supports Brotli, Gzip, and uncompressed requests
-   **\[Studio\] New HTML Editor + HTML Viewer**
    
    Modify HTML templates directly from the Studio instead of using an external tool, with live reload. The Studio includes a lightweight WYSIWYG HTML editor. Ideal for playground use or quick edits to existing HTML templates. More features (such as image support) will be added in the future.
    
-   **\[Studio\] New XML/TXT Viewer**
    
    A new viewer for previewing generated TXT and XML files directly in the Studio. The Studio now supports 3 viewers: `HTML`, `PDF`, and `XML/TXT`. It automatically selects the best viewer based on your template.
    
-   ⚡️ **\[Studio+Backend\] Template management embedded in the On-Premise solution**
    
    A new parameter `databaseName: "database.sqlite"` can be defined in the configuration (or using the environment variable `CARBONE_DATABASE_NAME`).
    
    If this database is set, it enables all features related to template management, including:
    
    -   Listing templates
    -   Storing metadata with templates
    -   Using both `templateId` (constant id) and `versionId`
    -   The full version of the studio
    
    In this version, the database is stored in the `config/` directory.  
    This will change in the final release: the database will be stored like a template and automatically synchronized across multiple nodes if needed.
    
-   **\[Backend\] New API for managing templates**
    
    👋 Available only for:
    
    -   On-Premise version (Cloud support coming soon)
    -   When "stateful" mode is enabled - technically, if a database name is defined in the configuration
    -   Experimental use only: all existing data may be deleted in the next stable release
    
    What problem does it solve?
    
    -   Allows keeping a "constant" template ID
    -   Lets you decide when a new version of a template is deployed to production
    -   Enables listing and managing all templates via the API
    -   Allows storing optional metadata (name, comment, etc.) and sample data alongside templates
    -   Unifies the user interface (Studio) between the On-Premise and Cloud versions
    
    What's new?
    
    All API endpoints now support two types of IDs when targeting a template:
    
    -   **Version ID**  
        A SHA-256 hash of the template file, automatically generated by Carbone.  
        This is the default behavior in Carbone v2, v3, and v4.  
        It matches the filename of the template stored on disk (or S3).  
        Formerly called `templateId` in our documentation.
        
    -   **Template ID** A short and constant 64-bit ID, automatically generated by Carbone, and optionally defined by the user.  
        Multiple template versions can share the same `template ID`.  
        When calling endpoints with a `template ID` (e.g., `POST /render/{ID}`), Carbone will use the latest deployed version (based on the `deployedAt` timestamp). The previous behavior is still available: you can call `POST /render` with the `versionId` to target a specific version.
        
    
    To summarize:
    
    To maintain backward compatibility, this new method for storing templates is only enabled if the boolean `versioning: true` is set when creating a template via `POST /template`. In that case, the response of `POST /template` is updated to avoid confusion:
    
    | Type | No Versioning | Versioning Enabled | Carbone Version |
    | --- | --- | --- | --- |
    | SHA-256 hash of the file | `templateId` | – | v5, v4, v3, v2 |
    | SHA-256 hash + random salt | – | `versionId` | v5 + `versioning: true` |
    | 64-bit constant ID | – | `id` | v5 + `versioning: true` |
    
    API updates summary
    
    ```bash
      # Updated endpoints:
      POST   /template                            # Create a new template or a new version of an existing template
      GET    /template/{templateId-or-versionId}  # Download the template file
      DELETE /template/{templateId-or-versionId}  # Delete a template
      POST   /render/{templateId-or-versionId}    # Generate reports using templateId or versionId
    
      # New endpoints:
      PATCH  /template/{templateId-or-versionId}  # Update metadata: name, comment, tags, expireAt, deployedAt
      GET    /templates                           # List all deployed templates and their versions
      GET    /templates/categories                # List all categories used in templates
      GET    /templates/tags                      # List all tags used in templates
    ```
    
    POST /template
    
    -   Adds the ability to store metadata along with the template.
    -   Allows attaching multiple template versions to the same `templateId`.
    -   Lets you specify which version is currently deployed using `deployedAt`. When a report is generated using the new template ID, Carbone selects the template version with the highest `deployedAt` timestamp that is not in the future.
    -   For backward compatibility, the new parameter `versioning: true` must be set in the request body to enable these features.
    
    _Request body:_
    
    ```js
    {
      // Required
      template   : base64 or multipart/form-data,
    
      // Optional
      versioning : true,   // Enables new versioning mode. Disabled if undefined or false, and if "id" is undefined
      id         : "4242", // Template ID. Generated if not provided and versioning = true ()
      name       : "",     // Template name
      comment    : "",     // Template comment
      tags       : [],     // List of tags
      samples    : [],     // Sample input data
      expireAt   : 0,      // UTC Unix timestamp; values ≥ 42000000000 (year 3300) are interpreted as "NOW". 0 means it never expires.
      deployedAt : 0       // UTC Unix timestamp; values ≥ 42000000000 (year 3300) are interpreted as "NOW". Value in the future are not allowed.
    }
    ```
    
    _Reponse body_
    
    The new response when `versioning = true` is used
    
    ```js
    {
      success    : true,
      data       : {
        id         : "4242"
        versionId  : "af42af42af42af42af42af42af42af42af42af42af42af42af42af42af42af42",
        type       : "docx",
        size       : 12012,
        createdAt  : 21545451
      }
    }
    ```
    
    For backward compatibility, when `versioning` is set to `false` or is undefined,  
    Carbone returns only the SHA-256 hash of the template file like in Carbone v4.
    
    ```js
    {
      success    : true,
      data       : {
        templateId : "af42af42af42af42af42af42af42af42af42af42af42af42af42af42af42af42"
      }
    }
    ```
    
    PATCH /template/{templateId-or-versionId}
    
    -   Same documentation as `POST /template`, except:
    -   Only the metadata fields `name`, `comment`, `tags`, `expireAt`, and `deployedAt` can be modified. All other fields are ignored.
    
    GET /template/{templateId-or-versionId}
    
    Accepts both the new `templateId` and the `versionId` (as in Carbone v4).
    
    -   `GET /template/{templateId}` downloads the latest deployed template file (64-bit number).
    -   `GET /template/{versionId}` downloads a specific version of the template (SHA-256 file hash).
    -   `GET /template/{templateId}_sample.json` downloads the data sample stored with this template (used in the Studio).
    -   `GET /template/{versionId}_sample.json` downloads the data sample stored with this specific version (used in the Studio).
    
    DELETE /template/{templateId-or-versionId}
    
    Accepts both the new `templateId` and the `versionId` (as in Carbone v4).
    
    -   `DELETE /template/{templateId}` deletes the latest deployed template and all its previous versions (64-bit number).
    -   `DELETE /template/{versionId}` deletes only the specified version (SHA-256 file hash). Technically, Carbone updates the `expireAt` field when this endpoint is called and garbage-collects the template after a delay (default: 24 hours). This has the same effect as calling `PATCH /template/{id}` with `expireAt = NOW`.
    
    GET /templates
    
    List all templates. By default, it returns all deployed template only, sorted by createdAt DESC, with expireAt > now
    
    _Reponse body_
    
    ```js
    {
      success    : true,
      hasMore    : false, // Whether or not there are more elements available after this set. If false, this set comprises the end of the list.
      nextCursor : "",
      data    : [
        {
          id         : "4242",
          versionId  : "af42af42af42af42af42af42af42af42af42af42af42af42af42af42af42af42",
          createdAt  : 1751385172,
          expireAt   : 0,
          deployedAt : 1751385172,
          size       : 12012,
          type       : "docx",
          name       : "template name",
          comment    : "comment"
          category   : "clientA"
          tags       : ["prod", "other"]  
        }
      ]
    }
    ```
    
    _Query parameters_
    
    -   `?id=number` filter by template id
    -   `?versionId=number` filter by version Id
    -   `?category=string` filter by category
    -   `?includeVersions=boolean` By default equals to false, Use true to list all versions for a specific template Id
    -   `?search=string` search in template name (fuzzy search), version Id (exact) or template id (exact)
    -   `?limit=number` limit the number of items (100 by default)
    -   `?cursor=string` A cursor to use in pagination. `nextCursor` is an object ID that defines your place in the list. For example, if you make a list request and receive 100 objects with `nextCursor=abcdef`, your subsequent call can include `cursor=abcdef` to fetch the next page of the list.

## v5.0.0-beta.13

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.13-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.13-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.13-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.13`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.13`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.13`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: June 30th, 2025
-   \[EE\] New features and improvements for the **:html** formatter available for ODT/DOCX/PDF:
    -   **CSS Style Attributes**: Added support for rendering inline CSS style attributes `color` and `background-color`, even when the HTML is in `inline` mode, for example: `<p style="color:green;background-color:#ff0000">OK</p>`. Styles defined within a `<style>` element, or those applied through classes and IDs, are not supported. If a color is already applied to the template paragraph, the CSS color style will override it. Supported color formats include:
        -   Hexa: The hexadecimal color syntax of an sRGB color. Example: `#FF00BB`.
        -   HSL: Expresses a color in the sRGB color space according to its hue, saturation, and lightness components. Examples: `hsl(120deg 75% 25%)`, `hsl(120 75 25)` or `hsl(120,75,25)`.
        -   RGB: Expresses a color in the sRGB color space according to its red, green, and blue components. Examples: `rgb(31 120 50)` or `rgb(31,120,50);`.
        -   Named Color: The name of a color. Example: `red`, `blue`, `black`, or `lightseagreen`.
    -   **Support for Optional End Tags**: Optional end tags "p" and "li" are now supported. An example structure: `<ol><li><p>text<li><p>text2</ol>`.
    -   **Support Tab Entities**: Include the character entities `&ensp;` or `&emsp;` to create a tab in an ODT/DOCX/PDF. Do not use `&#9;`, as HTML parsers will collapse it into a single space due to the whitespace collapse principle.
    -   **Bug Fix**: Fixed an issue with nested ordered/unordered list items mixed with empty paragraphs.

## v5.0.0-beta.12

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.12-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.12-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.12-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.12`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.12`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.12`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: June 27th, 2025
-   \[EE\] Improved support for filling PDF forms:
    -   Ignore errors when the PDF form contains buttons or undefined text fields
    -   Accept `/Text` and `/FreeText` annotations
    -   Remove annotations that contain Carbone tags with the `:checkField` and `:fillField` formatters  
        (previously, only tags with `:check` and `:fill` formatters were removed)

## v5.0.0-beta.11

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.11-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.11-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.11-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.11`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.11`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.11`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release June 17th 2025
    
-   \[EE\] Resolved an issue with the `:html` formatter when `ol/ul` lists are mixed with `br` tags.
    
-   \[EE\] 📄 PDF templates are supported to fill forms with your data. This is a low-level feature to update PDF forms. A more user-friendly solution will be available in the final version of the Studio. Three methods are available:
    
    -   **Place Carbone tags directly in the form fields**  
        Insert Carbone tags into the text fields of your PDF form. Carbone replaces them with data from your dataset. Loops are allowed in text fields.
        
    -   **Add annotations above the fields you want to update**, using formatters like `:fill`, `:check`, or `:uncheck`. Carbone will:
        
        -   Detect the form field below the annotation,
        -   Remove the annotation,
        -   Update the corresponding field. If the field is not found, an error is returned. In that case, move your annotation to make sure it overlaps the target field.
        
        Examples:
        
        -   `{d.myText:fill}` fills the text field behind the tag.
        -   `{d.myCondition:ifEQ(true):check}` checks the radio button or checkbox behind the tag.
    -   **Directly target form fields by name using formatters**  
        Place Carbone tags anywhere in a PDF annotation using formatters like `:fillField('fieldName')` or `:checkField('fieldName')`. Examples:
        
        -   `{d.text:fillField('fieldName')}` fills the text field with the provided value. It can also check a checkbox (any non-empty value will check it).
        -   `{d.genre:ifEQ('boy'):show(male):ifEQ('girl'):show(female):fillField('fieldName')}` selects the corresponding option in a radio group ('male' or 'female'). If the option does not exist, an error is returned.
        -   `{d.text:ifEQ(true):checkField('fieldName')}` checks the checkbox if the condition is true.
    -   **Known limitations:**
        
        -   In the Studio, the embedded PDF viewer cannot display filled forms. To preview results, uncheck the "Use embedded PDF viewer" option in the preview panel.
        -   Currently, Carbone supports only Text fields, Radio buttons, and Checkboxes.
        -   Warning: The native macOS PDF viewer can break PDF forms that include radio buttons.
-   ⚡️ Define **custom HTML templates for PDF headers and footers**, specifically for generated PDF with the **Chrome converter** (`converter: 'C'`). Templates must include the custom HTML elements `<carbone-pdf-header>` and `<carbone-pdf-footer>`, for example:
    
    ```html
      <carbone-pdf-header>
        <div style="font-size:12px; font-family:Arial; width:100%; text-align:center;">
          My Header text
        </div>
      </carbone-pdf-header>
    
      <carbone-pdf-footer>
        <div style="font-size:12px; font-family:Arial; width:100%; text-align:center;">
          My footer text
        </div>
      </carbone-pdf-footer>
    ```
    
    -   Special tags can be used to show the current page number and the total number of pages:
        -   Current page number: `<span class="pageNumber"></span>`
        -   Total number of pages: `<span class="totalPages"></span>`
    -   These sections can include Carbone tags, allowing your headers and footers to display dynamic content.
    -   They are processed correctly even if they are:
        -   Inside HTML comments (`<!-- -->`)
        -   Hidden using CSS (`display: none`)
    -   CSS styles must be inlined and placed directly inside the header and footer sections.
-   👌 Change the output page format when converting from HTML to PDF using the Chrome converter (`converter: 'C'`). Add a custom HTML element called `<carbone-pdf-options>` in your template:
    
    ```html
      <carbone-pdf-options  paper-size="A3"  landscape="true" margin-bottom="2.5" />
    ```
    
    -   This section can include Carbone tags
        
    -   They are processed correctly even if they are:
        
        -   Inside HTML comments (`<!-- -->`)
        -   Hidden using CSS (`display: none`)
    -   Below is a list of all available options:
        
        | Option | Type | Description |
        | --- | --- | --- |
        | `landscape` | boolean | Paper orientation. Defaults to `false`. |
        | `display-header-footer` | boolean | Display header and footer. Defaults to `false`, or `true` if header/footer is provided |
        | `print-background` | boolean | Print background graphics. Defaults to `true`. |
        | `scale` | number | Scale of the webpage rendering. Defaults to `1`. |
        | `paper-size` | string | Letter, Legal, Tabloid, Ledger, A0, A1, A2, A3, A4, A5, A6 |
        | `paper-width` | number | Overwrite Paper width in inches. Defaults to `8.27` inches (A4) |
        | `paper-height` | number | Overwrite Paper height in inches. Defaults to `11.7` inches (A4) |
        | `margin-top` | number | Overwrite Top margin in inches. Defaults to `0.5` inches. |
        | `margin-bottom` | number | Overwrite Bottom margin in inches. Defaults to `0.5` inches. |
        | `margin-left` | number | Overwrite Left margin in inches. Defaults to `0.5` inches. |
        | `margin-right` | number | Overwrite Right margin in inches. Defaults to `0.5` inches. |
        | `page-ranges` | string | Paper ranges to print, e.g., `1-5, 8, 11-13`. Pages are printed in document order. No page |
        |   |   | appears more than once. Empty string prints entire document. Invalid ranges are ignored. |
        |   |   | An error is thrown if start > end. |
        | `prefer-css-page-size` | boolean | Prefer CSS-defined page size. Defaults to `false`, |
        |   |   | in which case the content will be scaled to fit the paper size |
        

## v5.0.0-beta.10

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.10-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.10-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.10-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.10`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.10`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.10`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release May 16th 2025
-   Includes changes from v4.25.9

## v4.25.9

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.9-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.9-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.9-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.9`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.9`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.9`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release May 16th 2025
-   Fixed batch processing for On-Premise environments
-   Added support for base64 data-URI in `appendFile` and `attachFile`

## v5.0.0-beta.9

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.9-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.9-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.9-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.9`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.9`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.9`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release April 24th 2025
-   Fix: The `:appendFile(position)` formatter now inserts pages in the correct order, as in v4.25.8

## v4.25.8

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.8-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.8-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.8-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.8`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.8`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.8`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release April 24th 2025
-   The formatter `:appendFile(position)` now accepts a position parameter that determines where the external document is inserted in the generated output. Valid values for position are "start" (to insert at the beginning) and "end" (default, inserts at the end).

## v5.0.0-beta.8

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.8-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.8-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.8-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.8`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.8`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.8`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release: April 22nd, 2025
-   The formatter `:appendFile(position)` now accepts a position parameter that determines where the external document is inserted in the generated output. Valid values for position are "start" (to insert at the beginning) and "end" (default, inserts at the end).
-   Improved stability of signature position detection
-   Detecting multiple signatures in large documents is now about 100 times faster

## v5.0.0-beta.7

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.7-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.7-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.7-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.7`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.7`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.7`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release April 14th 2025
-   Includes v4.25.7
-   Print logs when Chrome fails to start.
-   Avoid generating a public/private key pair when a public key is already provided via the `CARBONE_AUTHENTICATION_PUBLIC_KEY` or `CARBONE_EE_AUTHENTICATION_PUBLIC_KEY` environment variable

## v4.25.7

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.7-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.7-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.7-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.7`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.7`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.7`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release April 14th 2025
-   Fix: Prevent a crash when a barcode is empty and the `svg: true` option is used.
-   Fix: LibreOffice changed the default value of `ExportFormFields`. It used to be `true`, but in the latest version, it is now `false`. This release restores the previous default value to avoid breaking changes when generating PDFs with forms.

## v5.0.0-beta.6

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.6-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.6-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.6-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.6`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.6`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.6`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release March 20th 2025
-   Improved support for HTML5 templates. Side effect: Carbone adds a trailing slash to void elements (e.g., `<br>` becomes `<br/>`).
-   Studio updates:
    -   Show metrics in logs: time spent on merging, converting, and downloading images/files, as well as the size of downloaded images/files.
    -   Added an option to switch between all converters and an option to display the preview as HTML instead of PDF.
-   ⚡️ New Document converters: **Chrome** for more robust HTML to PDF conversion, along with OnlyOffice and LibreOffice (default) for all other documents.  
    Now, you can choose from three different document converters, all managed directly by Carbone.  
    A new `converter` option is added in v5 to select the document converter in the studio or directly from the API:
    
    ```js
    {
      "converter": "L", // L: LibreOffice (default), O: OnlyOffice, C: Chrome
      "convertTo": "pdf",
      "data": {}   
    }
    ```
    
    Historically, when Carbone started, it automatically tried to detect a LibreOffice binary on the system for document conversion. Three new parameters have been added to control this behavior for LibreOffice, OnlyOffice, and Chrome. By defaults, Carbone starts with these values:
    
    ```js
      libreOfficePath : 'auto', // Auto-detects LibreOffice. Leave empty to disable, or set "sofficeExecPath, pythonExecPath".
      onlyOfficePath  : '',     // Disabled. Use "auto" or set "x2tPath, AllFontsPath, fontPath".
      chromePath      : '',     // Disabled. Use "auto" or set "pathToChrome".
    ```
    
    These parameters can also be set using the corresponding environment variables: `CARBONE_EE_LIBRE_OFFICE_PATH`, `CARBONE_EE_ONLY_OFFICE_PATH`, `CARBONE_EE_CHROME_PATH` More details will be available in the documentation. Carbone automatically manages multiple threads for each converter, ensures that all security barriers are active, manages timeouts, and more. Current Limitations for Chrome:
    -   JavaScript execution is disabled.
    -   Only A4 format output is supported (more formats, with custom margins, headers, and footers, will be available in future releases).
    -   All outgoing traffic is limited to GET requests for documents, stylesheets, images, media, and fonts.

## v5.0.0-beta.5

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.5-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.5-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.5-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.5`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.5`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.5`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release March 11th 2025
-   Includes v4.25.6
-   When the `:sign` formatter is used, the signatures array is accessible at the root of the object in the body response of `POST /render`.
    
    ```js
    {
      "renderId" : "random-string.pdf",
      "signatures": [
        {
          "data" : "Bob",
          "page" : 1,
          "x"    : 72.1,
          "y"    : 693.436
        }
      ]
    }
    ```
    

## v5.0.0-beta.4

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.4-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.4-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.4-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.4`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.4`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.4`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release February 18th 2025
-   \[EE\] Improve the position values returned by the `:sign` formatter:
    -   Return integers instead of floats. Since a point is 1/72 inch, integer precision is sufficient.
    -   Set the origin `(x = 0, y = 0)` at the top-left corner of the page to simplify integration with third-party solutions.
    -   Define the x-axis as extending to the right and the y-axis as extending downward.
    -   Enhance the precision of the X/Y position by ensuring the returned position corresponds to the top-left corner of the tag.
-   \[EE\] For DOCX and ODT templates, two new HTML formatter options are available:
    -   **inline**: Render HTML within the current DOCX paragraph, at the same location, without moving or adding paragraphs. This option will only render the following HTML tags: `a`, `b`, `strong`, `em`, `i`, `s`, `del`, `u`. Other HTML tags are skipped and not rendered. Example usage: `{d.value:html(inline)}`
    -   **nospace**: Render HTML without adding extra DOCX paragraphs at the end of each `<p>` tags.
-   \[EE\] For DOCX templates, the HTML formatter has been updated with the following improvements:
    -   Hyperlinks (a `a` tags) are now rendered in headers and footers.
    -   Images (a `img` tags) are now rendered in headers and footers.
    -   If the HTML contains ordered (`ol`) or unordered (`ul`) lists, there is no need to pre-create a list in the template using your text editor. Carbone will render the list directly in the DOCX format without any manual intervention.
    -   When injecting multiple HTML lists using the HTML formatter, numbered lists now maintain consistent ordering. Previously, numbering might continue across multiple different lists.
-   \[EE\] For ODT templates, the HTML formatter is now supported in headers and footers.

## v5.0.0-beta.3

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.3-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.3-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.3-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.3`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.3`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.3`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release February 3rd 2025
-   The new templating engine preserves line breaks in templates! Now, you can create CSV or TXT templates. It fixes line breaks in XLSX files.
-   \[EE\] Added the `batchOutput` option to the `POST /render` endpoint, to allow returning a single assembled PDF file instead of a ZIP file during batch processing. Accepted values: `pdf` or `zip` (default).
-   \[EE\] New formatter `:sign`. This can be used with PDF generation to place signatures at specific positions in a document. The `POST /render` endpoint returns additional details indicating where each signature should be placed in the final PDF, along with its associated data. This information can be shared with any third-party tool to manage the signature process. For example, if the template contains the tags `{d.owner:sign}` and `{d.buyer:sign}`, the API returns the following information:
    
    ```js
    {
      "debug": {
        "signatures": [
          {
            "data" : "Bob", // Content of {d.owner}. Can be a string, number, object, or array
            "page" : 1,
            "x"    : 72.1,
            "y"    : 693.436
          },
          {
            "data" : "Alice", // Content of {d.buyer}
            "page" : 1,
            "x"    : 72.1,
            "y"    : 693.436
          }
        ]
      }
    }
    ```
    
    In a standard PDF coordinate system, the origin `(x = 0, y = 0)` is at the bottom-left corner of the page. The x-axis extends to the right, and the y-axis extends upward. The API returns an error, and the report is not generated in the following cases:
    -   If the number of injected signatures exceeds 999.
    -   If a signature position cannot be determined. The `:sign` formatter prints a text in the final document in the format "ʕ010". Our recommendation is to set the text color to white in the template to make it invisible in the generated PDF.

## v5.0.0-beta.2

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.2-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.2-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.2-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.2`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.2`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.2`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release January 30th 2025
-   👋 This is a minor release. A major update is coming soon with exciting features such as Signatures, PDF Merging, a Chrome converter, and Markdown/HTML templates in just a few days.
-   Fixed a crash that occurred during a graceful exit when the systemd watchdog was activated.
-   Includes all fixes from v4 up to v4.25.3.
-   Show an error message if the studio is not running in a secure context.
-   Improved Studio:
    -   Added text search functionality with a search button and shortcuts:
        -   `Ctrl+F` (open search)
        -   `Ctrl+G` (next occurrence)
        -   `Shift+Ctrl+G` (previous occurrence)
    -   Fixed inconsistent icon widths.
    -   Added functionality to switch between data/complement/enum/translations.
    -   Replaced the save button with a refresh button.
    -   Scroll position in the JSON editor/viewer is now preserved.
    -   Optimized JSON parsing between JSON editors for better performance.
    -   Modifications are now preserved when switching between JSON editor and viewer modes.
    -   Fixed language icon display issues on Windows.
    -   Prevent leaving the JSON editor when an error occurs.
    -   Updated PDF.js from version 4.7.76 to 4.10.38.
    -   Reduced gaps between icons for better alignment.
    -   Improved the design of the page input field in preview mode.

## v5.0.0-beta.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 17th 2024
-   Includes v4.25.0

## v5.0.0-beta.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-5.0.0-beta.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-5.0.0-beta.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-5.0.0-beta.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-5.0.0-beta.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release October 29th 2024
-   Check out the full [release notes is here](https://carbone.io/carbone-v5.md)

## v4.25.6

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.6-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.6-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.6-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.6`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.6`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.6`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release March 11th 2025
-   It is no longer necessary to repeat array filters on all tags to filter a loop. Now, if the filter is defined only on the `i+1` tag, it is applied globally to the entire loop. This change is activated only when the prerelease tag `{o.preReleaseFeatureIn=4024000}` is set (by default in v5). To maintain backward compatibility, if at least one filter is defined on the `i-th` part, the previous rule still applies.
    -   Before:
        
        ```text
        {d.myArray[i, i>0].id}
        {d.myArray[i, i>0].name}
        {d.myArray[i+1, i>0]}
        ```
        
    -   After:
        
        ```text
        {d.myArray[i].id}
        {d.myArray[i].name}
        {d.myArray[i+1, i>0]}
        ```
        

## v4.25.5

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.5-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.5-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.5-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.5`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.5`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.5`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release February 8th 2025
-   Fix: Carbone did not escape some forbidden characters in XML when an array was printed in the template without using the `arrayJoin` formatter. This fix is activated only when the prerelease tag `{o.preReleaseFeatureIn=4024000}` is set.

## v4.25.4

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.4-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.4-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.4-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.4`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.4`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.4`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release February 6th 2025
-   Fix: Carbone tags in sheet names were not updated since v4.25.3

## v4.25.3

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.3-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.3-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.3-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.3`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.3`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.3`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release January 28th 2025
-   Fixed an issue with corrupted XLSX files caused by defined range names.
-   Accepts array filters with colons and `&`, such as `{d.myArray[filter='string&with:colons'].id}`, when `{o.preReleaseFeatureIn=4022011}` is activated. Note: Array filters with commas are still not supported in v4. This will be addressed in v5.
-   Formatters containing '&' do not print '&' in the generated document, when `{o.preReleaseFeatureIn=4022011}` is activated.

## v4.25.2

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.2-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.2-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.2-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.2`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.2`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.2`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release January 20th 2025
-   \[EE\] Fixed some issues with the `:set` formatter when `{o.preReleaseFeatureIn=4022011}` is activated, especially in combination with array filters and conditions. The fix resolves the following cases for `:set`:
    -   `{d.myArray[filter=2].val:set(d.result)}`: Stores the first value `val` found in the array that matches the array filter `filter=2` (Now the behavior is the same with or without `:set`).
    -   `{d.myArray[filter=2].val:ifEM:show(10):set(d.result)}`: Stores the first value `val` found that matches the filter `filter=2`, otherwise stores "10".
    -   `{d.myArray[filter=2].val:ifEM:show(10):set(.newAttribute)}`: Adds a new attribute in `myArray` (copy of `.val`), setting its value to "10" for all items in `myArray` that do not match the filter `filter=2`.
-   The `:convCRLF` option is now supported in ODP templates.
-   \[EE\] For ODT/ODS templates, you can now create dynamic bookmarks. To add a dynamic bookmark to a template, right-click on the selected text, navigate to the 'Insert' menu, select 'Bookmark,' and then write the Carbone tag. The value can be a single tag `{d.bookmark}` or a loop expression `{d.list[i].bookmark}`. Please note that the following characters are not allowed in a bookmark: `/@*?",#`.
-   Fixed invalid metrics for `fetchImageTime`, `fetchFileTime`, `fetchImageBytes`

## v4.25.1

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.1-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.1-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.1-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.1`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.1`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.1`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 19th 2024
-   \[EE\] Fixed a random crash occurring when multiple documents fail to download while using `:appendFile`.
-   \[EE\] Fixed crash when using an invalid image URL in injected HTML

## v4.25.0

Show download links

**Binaries** [Getting started](/documentation/developer/on-premise-installation/install-on-linux.md)

-   Linux: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.0-linux-x64), [arm64](https://bin.carbone.io/carbone/carbone-ee-4.25.0-linux-arm64)
-   Mac: [x64](https://bin.carbone.io/carbone/carbone-ee-4.25.0-macos-x64)

**Docker** [Getting started](/documentation/developer/self-hosted-deployment/deploy-with-docker.md)

-   Ready to use: `carbone/carbone-ee:full-4.25.0`
-   Includes 2GB of fonts : `carbone/carbone-ee:full-fonts-4.25.0`
-   Only Carbone (without document converters) : `carbone/carbone-ee:slim-4.25.0`

[Contact us](https://carboneio.pipedrive.com/scheduler/5Rzzbxu6/carbone-on-premiseaws-presentation) to enable all Enterprise Features \[EE\]

* * *

-   Release December 9th 2024
-   Add a new option to the API endpoint `POST /render/:idTemplate`. The query parameter `?download=true` can be used to download the rendered report directly.
    -   When this option is used, the file is not stored on our servers. A single API call is enough to download the file. There is no need to call `GET /render`.
    -   **Important:** The `Content-Disposition` header changes based on the HTTP status:
        -   If the status is 200 (OK):
            
            ```text
            Content-Disposition: 'attachment; filename="report.pdf"'
            Content-Type: 'application/pdf'
            ```
            
        -   For all other statuses: The response remains in `application/json` format as before.

## v4.24.2

-   Release November 7th 2024
-   \[EE\] Fix: Accept array filters with commas enclosed in quotes when using the `:set()` formatter with the prerelease tag `{o.preReleaseFeatureIn=4022011}` in ODT templates (enabled by default in Carbone v5).
-   Fix: Prevent generating corrupted documents when a custom iterator contains a `null` or `undefined` value in a loop (e.g., `{d[sort].id} -> {d[sort+1].id}`). This fix is activated only if `{o.preReleaseFeatureIn=4024000}` (enabled by default in Carbone v5).

## v4.24.1

-   Release November 6th 2024
-   \[EE\] Fix: the `:html` formatter in DOCX templates where the default template style might not have been applied.
-   \[EE\] Fix: Accept array filters with commas enclosed in quotes when using the `:set()` formatter with the prerelease tag `{o.preReleaseFeatureIn=4022011}`.

## v4.24.0

-   Release October 25th 2024
-   Accept `xls` (Excel 2003) template files only for document conversion.
-   \[EE\] Fix the `:html` formatter in ODT templates where ordered and unordered lists contain mixed line break tags.
-   \[EE\] Generate a fully compliant Factur-X PDF when the attached XML file is named 'factur-x.xml' (`:attachFile('factur-x.xml')`). It automatically detects the Conformance Level from the attached XML ('MINIMUM', 'BASIC WL', 'BASIC', 'EXTENDED', 'EN 16931') and adjusts the PDF metadata accordingly. Additionally, it sets `SelectPdfVersion = 3` (PDF Version 3B) by default if not specified and if the output file is a PDF.
-   \[EE\] Add a `type` parameter to the `attachFile(filename, type)` formatter to specify the PDF AFRelationship. Options for `type` include: "Source", "Data" (default), "Alternative", "Supplement", "Unspecified", "FormData", and "Schema".
-   Close all pending TCP connections on exit to prevent indefinite waiting times.
-   Fix: Allow `:convCRLF` to be used after `:aggStrD` and `:aggStr`.
-   New formatter `:preserveCharRef` to preserve character references. By default, Carbone removes all forbidden characters before injecting data into XML (e.g., `&`, `>`, `<`, , etc.). As a result, injected character references like `&#xa7;` ( = `§` ) are transformed into `&amp;#xa7;` in XML. This formatter prevents this transformation, preserving the original character reference. This feature is useful in specific XML generation scenarios where direct characters cannot be used (e.g., non-UTF-8 charsets) and the character reference must be retained. It accepts both numeric (e.g., `&#100;`) and hexadecimal formats (e.g., `&#xa10ef;`), in either lowercase or uppercase.

## v4.23.7

-   Release October 8th 2024
-   \[EE\] Fixed a crash that occurred when the URL passed to `appendFile` or `attachFile` was not a string.

## v4.23.6

-   Release October 1st 2024
-   \[EE\] Added support for `bindColor` in PPTX templates (for text, background color, and shapes). This feature is enabled when the flag `{o.preReleaseFeatureIn=4022011}` is included in the template.
-   \[EE\] Fixed incorrect CSS attributes in charts created using Apache ECharts@v5a.
-   Added `en-be` locale support for dates and numbers: `DD/MM/YYYY`, `100.000,80`

## v4.23.5

-   Release September 19th 2024
-   \[EE\] Fix escape characters `&`, `>`, and `<` for the aggregators `:aggStr` and `:aggStrD`.

## v4.23.4

-   Release September 17th 2024
-   \[EE\] Support dynamic hyperlinks in headers and footers of DOCX templates
-   \[EE\] Fix new `:set()` formatter when `{o.preReleaseFeatureIn=4022011}` is activated

## v4.23.3

-   Release cancelled

## v4.23.2

-   Release September 12th 2024
-   New `:t()` formatter to translate text from JSON data. When the report is rendered, all text passed to the `:t` formatter is replaced with its corresponding translation found in a separate localization dictionary. Carbone automatically selects the localization dictionary that matches the `lang` attribute (`en-us`, `en-gb`, etc.). If a translation key is not found, Carbone prints the original text from the data in the final report (without translation).
-   \[EE\] `:attachFile` formatter accepts URL with `text/xml` mimetype
-   \[EE\] Fixes the `:transform` formatter in ODT/ODP when LibreOffice uses a different method to update the X/Y position of an item.
-   \[EE\] `:transform` formatter support to move images in ODT/ODP/PPTX (only if `{o.preReleaseFeatureIn=4022011}` is activated)
-   \[EE\] Optional flags `{o.preReleaseFeatureIn=4022011}` and `{o.useHighPrecisionArithmetic=true}` are removed from the generated document.
-   \[EE\] Fix: The optional flag `{o.preReleaseFeatureIn=4022011}` is now detected before processing `:set` formatters.

## v4.23.1

-   Release September 2nd 2024
-   Fixed `:drop(shape)` regression in PPTX templates when using native charts.

## v4.23.0

-   Release August 30th 2024
    
-   New formatter `:printJSON` to print the content of an object/array. Example: `{d:printJSON}` prints the entire data object in the document.
    
-   \[EE\] When using asynchronous jobs with `carbone-webhook-url`, optional headers `carbone-webhook-header-X` can be specified to customize the webhook headers sent. The `X` can be any key name. For example, if `carbone-webhook-header-authorization: my-secret` is included during report generation, the header `authorization: my-secret` will be added when Carbone calls the webhook.
    
-   \[EE\] New formatter `{d.pdf_or_xml_url:attachFile(filename)}` to add one or multiple attachments to the generated PDF (e.g., Factur-X). This formatter accepts a single URL, can be positioned anywhere within a template, and does not produce any text output by itself.
    
    Carbone will return an error and will not generate the report in the following scenarios:
    
    -   If the provided URL returns an error (with 2 retries for Carbone Cloud).
    -   If the downloaded document is not a PDF or XML.
    -   If more than 20 files are to be downloaded (On-Premise parameter: `maxDownloadFileCount`).
    -   If the total size of all downloaded files exceeds 10 MB (On-Premise parameter: `maxDownloadFileSizeTotal`).
    -   If the same document is included more than 5 times.
    
    Carbone will ignore the formatter and proceed to generate the report in the following cases:
    
    -   If the provided URL is null, undefined, or an empty string.
    -   If the final report is not in PDF format.
-   \[EE\] Fix: The `:color` formatter did not apply the style correctly in HTML.
    
-   ODS template supports `:drop(sheet)` and `:keep(sheet)` to show or hide a sheet
    
-   XLSX template supports `:drop(row)` and `:keep(row)`
    
-   Accept whitespace in attribute names using single quotes: `{d.'new param'.'second level yes'[1].'sub obj'}` if `{o.preReleaseFeatureIn=4022011}` is added in the template. Known limitation: not accepted inside formatters, array filters and aliases.
    
-   Fix: Conditional blocks (show, hide) and smart conditional blocks (drop, keep) were not executed when combined with an array filter. In this example `{d.arr[i, filter=3].id:ifEM:hideBegin} AAAA {d.arr[i, filter=3].id:hideEnd}`, `AAAA` was printed if no rows matched the condition `filter=3`. This fix is available only when the tag `{o.preReleaseFeatureIn=4022011}` is activated.
    
-   ⚡️ Transform your JSON without limits with `:set()`. This formatter, introduced in v4.5.2, was previously limited. Now it can be used to convert a flat JSON to a new hierarchical JSON with unlimited array depth, or the other way around. This feature is activated by adding the tag `{o.preReleaseFeatureIn=4022011}` and will be enabled by default in the upcoming Carbone v5.
    
    -   `:set(.attribute.id)`: Accepts a relative path to modify or add new attributes/objects inside an existing object.
        
    -   `:set(c.new[x=.y])`: Creates or updates new arrays of objects.
        
        -   `c.new` is the newly created array in `c.`. It can then be used with `{c.new}` as usual.
        -   `[x=.y]` is an inner join expression. Only the `=` operator is accepted, and only exactly one expression is allowed between `[]` inside `:set`.
        -   `x` is a relative path to the newly created object inside `c.new`. This expression cannot contain dots or square brackets.
        -   `.y` is a relative path in the currently visited array (the tag before the `:set` expression). Use two or more dots to go up in the hierarchy if needed.
        
        How does it work? Before creating a new object inside `c.new`, Carbone checks if there is an existing object that matches the condition `new.x = currentlyVisitedItem.y`. If an object exists, it overwrites the existing object; otherwise, it inserts the new object inside the new array.
        
        This join expression works only on newly created arrays by Carbone, not on existing ones in the original JSON data passed when calling Carbone.
        
    -   `:set(c.new[x=.y].z)`: Creates or updates new arrays of objects and stores the result of the expression before `:set` in the child attribute `z`.
        
    -   `:set(c.new[x=.y].other[n=..m].o)`: Creates any nested array inside arrays with multiple join expressions.. Here Carbone creates two nested arrays `new` and `other`.
        
    -   `:set(c.new[x=.y].all[])`: An empty join expression is accepted only for the last array in `:set`. In that case, all items are kept (including duplicated rows).
        
    
    Data:
    
    ```json
      [
        { "country" : "A", "city" : "1A" },
        { "country" : "A", "city" : "2A" },
        { "country" : "A", "city" : "3A" },
        { "country" : "B", "city" : "1B" },
        { "country" : "B", "city" : "2B" }
      ]
    ```
    
    Result in `{c.}` with `{d[].city:set(c.countries[id=.country].cities[].name)}`:
    
    ```json
      {
        "countries" : [
          {
            "id"     : "A",
            "cities" : [ 
              { "name" : "1A" },
              { "name" : "2A" },
              { "name" : "3A" }
            ]
          },
          {
            "id"     : "B" ,
            "cities" : [
              { "name" : "1B" },
              { "name" : "2B" }
            ]
          }
        ]
      }
    ```
    
    Result in `{c.}` with `{d[]:set(c.countries[title=.country].cities[])}`:
    
    ```json
      {
        "countries" : [
          {
            "title"  : "A",
            "cities" : [ 
              { "country" : "A", "city" : "1A" },
              { "country" : "A", "city" : "2A" },
              { "country" : "A", "city" : "3A" }
            ]
          },
          {
            "title"  : "B" ,
            "cities" : [
              { "country" : "B", "city" : "1B" },
              { "country" : "B", "city" : "2B" }
            ]
          }
        ]
      }
    ```
    
    Result in `{c.}` with `{d[].city:set(c.countries[title=.country].cities[])}`:
    
    ```json
      {
        "countries" : [
          {
            "title"  : "A",
            "cities" : [ "1A", "2A", "3A" ]
          },
          {
            "title"  : "B" ,
            "cities" : [ "1B", "2B" ]
          }
        ]
      }
    ```
    

## v4.22.14

-   Release August 23rd 2024
-   Fix asynchronous rendering: allow multiple reports to be generated at the same millisecond

## v4.22.13

-   Release July 22nd 2024
-   If `config.factories = 0` (starting without the LibreOffice converter), the `hardRefresh` option is ignored.

## v4.22.12

-   Release July 22nd 2024
-   \[EE\] Fix: `:transform(axis, unit)` for PPTX template did not work in certain cases
-   \[EE\] Fixes studio hang when the template has no Carbone tags and adds an XHTML export option to get embedded images in HTML output

## v4.22.11

-   Release July 17th 2024
    
-   \[EE\] The embedded stateless studio supports XML templates if the following conditions are met: Chromium-based browsers, output file type must be XML. The generated XML is indented and stored locally. It supports live reloads. If the template/data is updated, the generated XML is updated accordingly. VSCode, Sublime Text, or any editing tool can be used to update the XML template and see the result.
    
-   \[EE\] Fixed `:imageFit` formatter for resizing image in ODS templates.
    
-   \[EE\] Fix: Do not escape the character `&` two times in injected hyperlinks if `{o.preReleaseFeatureIn=4022011}` is active
    
-   \[EE\] New `:transform(axis, unit)` formatter to move a shape on the X or Y axis:
    
    -   `axis` can be `x` or `y` to move the item horizontally or vertically from its current position. Positive numbers = move to the right or bottom.
    -   `unit` can be `cm`, `mm`, `inch`, or `pt`.
    
    The tag must be positioned inside the item to be transformed (alternative text or inside the shape itself). This tag prints nothing. Supported in ODP, PPTX and ODT templates. The feature is available only if the tag `{o.preReleaseFeatureIn=4022011}` is used. Be careful, if a loop is created between two shapes, the `[i+1]` tag must be in the shape that is higher in the layer order than the shape with the `[i]` tag.
    

## v4.22.10

-   Release July 4th 2024
-   PPTX template support `:drop` and `:keep` formatters to control the visibility of elements:
    -   Paragraphs `p`: insert the tag in a paragraph to show/hide: `Text before {d.value:ifEM:drop(p)}`. To delete multiple paragraphs simultaneously, specify the number of elements as a second argument: `:drop(p, number)`.
    -   Images `img`: use the tag in an image's alternative text or title to manage visibility: `{d.url:ifEM:drop(img)}`.
    -   Shapes `shape`: place the tag in a text box or shape's alternative text to show or hide the shape: `{d.showShape:ifEQ(false):drop(shape)}`.
    -   Tables `table`: insert the tag in a table cell to control the display of the table: `{d.list:ifEM:drop(table)}`.
    -   Rows `row`: embed the tag in a table row to manage its visibility: `{d.value:ifNE(20):drop(row)}`. To delete multiple rows simultaneously, specify the number of elements as a second argument: `:drop(row, number)`.
    -   Charts `chart`: use the tag in the chart's alternative text to show or hide the chart: `{d.list:ifEM:drop(chart)}`.
-   Fixed `:html` formatter: duplicating Bold or Italic tags is now supported

## v4.22.9

-   Release June 27th 2024
-   Fix: When the tag `{o.preReleaseFeatureIn=4022008}` is used
    -   ODS templates supports Carbone tags on the sheet name.
    -   Accepts conditions on the `i+1` part of a loop for backward compatibility.
    -   Accepts XLSX with empty rows

## v4.22.8

-   Release June 21th 2024
-   \[EE\] The formatter `:color(part)` accepts the new option `part` to color only a part of a paragraph (word, group of words, ...). The text or highlight color is applied within the same styled element. This feature is available only for ODT templates. Other template types will be supported on demand.
-   New formatters:
    -   `:ceil(number)` rounds towards closest higher integer number `3.5 -> 4` and `-3.5 -> -3`
    -   `:floor(number)` rounds towards closest lower integer number `3.5 -> 3` and `-3.5 -> -4`
-   Fix: A new engine now supports a wider range of use cases for conditional blocks and loops, thanks to an advanced algorithm from the upcoming Carbone v5. This example below, which combines filters, aggregators, and a conditional block on the same array, was not supported without this new algorithm: Also, it is not necessary to repeat the full tag at the end of a conditional block: `{d:showEnd}` or `{d:hideEnd}` is sufficient.
    
    ```text
      {d.arr[sort>1].id:aggCount:ifGT(0):showBegin}
        {d.arr[i].id}
        {d.arr[i+1].id}
      {d:showEnd}
    ```
    
    ⚠️ This algorithm is enabled when the template contains the tag `{o.preReleaseFeatureIn=4022008}` or if the configuration / API contains `preReleaseFeatureIn : 4022008`. This tag means: "enable all pre-release features added up to v4.22.8".
-   Fix: When the tag `{o.preReleaseFeatureIn=4022008}` is activated, Carbone improves the support of XLSX templates (no need to add empty cell)

## v4.22.7

-   Release June 14th 2024
-   Update dependencies
-   Improve Libreoffice detection on Arch Linux
-   Fix: removed the possibility of prototype pollution in formatters
-   Fix: `showBegin/showEnd` or `hideBegin/hideEnd` conditions in some rare cases when `{o.preReleaseFeatureIn=4015000}` is enabled.
    -   When one condition ends exactly where a new condition starts and the XML does not contain other text
    -   When conditions are used on text without XML, but there is some XML afterward
-   Revert the `:html` evolution of `v4.22.6` (`v4.22.6` was not deployed in production)

## v4.22.6

-   Release June 7th 2024
-   \[EE\] New feature for the `:HTML` formatter: the HTML is now supported in headers and footers of DOCX/ODT/PDF. **Temporary exception for DOCX templates:** if the HTML contains `<img>` tags, a image must be pre-inserted into the header/footer of the template, otherwise the image won't be displayed.
-   \[EE\] Fix: more text editor styles applied to Carbone tags with the `:html` formatter are also applied to the injected HTML for DOCX/ODT templates. This fix addresses numerous spacing issues between paragraphs, before or after the injected HTML. List of new supported styles:
    -   DOCX: Spacing between paragraphs, left indent, small caps, all caps, hidden text, double strikethrough.
    -   ODT: Spacing between paragraphs, left indent, top/bottom margin, and text justify property

## v4.22.5

-   Release May 7th 2024
-   Accepts filters on attributes of objects as if they were arrays:
    
    ```js
    {
      myObject : {
        paul : '10',
        jack : '20',
        bob  : '30'
      }
    }
    ```
    
    In the report:
    
    ```js
      {d.myObject[.att = jack].val} // 20
      {d.myObject[.val = 20].att}   // jack
    ```
    
    -   use .att to access the attribute (paul, jack, bob)
    -   use .val to print the value

## v4.22.4

-   Release April 18th 2024
-   A new option `{o.useHighPrecisionArithmetic=true}` can be used within a template to activate arbitrary-precision decimal arithmetic for mathematical operations. When this tag is included in the template, the formatters `:add`, `:sub`, `:mul`, `:div`, `:formatC`, `:formatN` will maintain full decimal precision (Max 20). By default, and for all other formatters (such as aggregators, `:abs`, `:mod`, as well as mathematical expressions inside formatters and conditions), calculations uses double-precision floating-point numbers based on the 64-bit IEEE-754 standard.
-   \[EE\] Fix bad CSS attributes in charts created with Apache ECharts@v5a

## v4.22.3

-   Release April 15th 2024
-   Accept Microsoft Visio templates (.vsdx) with conversion to PDFs
-   \[EE\] Fix `drop(table)` for ODP templates
-   \[EE\] Add support of `drop(item)` for ODP and ODT templates to delete an item inside a list
-   \[EE\] Fix crash when `null` values are passed in Apache Echarts options.
-   \[EE\] Previously, charts created with Apache ECharts did not support setting custom font styles (size, family, weight). We have now resolved this issue with our own modified version of ECharts, optimized for SVG compatibility with our main document converter, LibreOffice. To ensure compatibility and prevent any impact on existing charts, please specify the ECharts version `echarts@v5a` instead of `echarts@v5` when configuring your JSON. This `@v5a` version will become the default in Carbone v5.
    
    ```json
    {
      "chartOptions" : {
        "type" : "echarts@v5a",
        "option" : {}
      }
    }
    ```
    

## v4.22.2

-   Release April 9th 2024
-   Fix corrupted Excel file when `aggSum:formatN` is used since 4.22.0

## v4.22.1

-   Release April 8th 2024
-   Fix: Aggregators may return incorrect results when used in combination with :set formatters (bug introduced by v4.22.0).

## v4.22.0

-   Release April 5th 2024
    
-   The formatter `convCRLF` supports PPTX templates
    
-   \[EE\] new formatter `{d.pdf_url:appendFile}` to append one or several PDFs at the end of the generated document. This formatter accepts either a single URL. It can be positioned anywhere within a template and does not produce any text output by itself. Carbone will return an error and will not generate the report in the following scenarios:
    
    -   If the provided URL returns an error (with 2 retries for Carbone Cloud).
    -   If the downloaded document is not recognized as a valid PDF.
    -   If more than 20 files are to be downloaded (On-Premise parameter: `maxDownloadFileCount`).
    -   If the total size of all downloaded files exceeds 10 MB (On-Premise parameter: `maxDownloadFileSizeTotal`).
    -   If the same PDF document is included more than 5 times.
    
    Carbone will ignore the formatter and proceed to generate the report in the following cases:
    
    -   If the provided URL is null, undefined, or an empty string.
    -   If the final report is not in PDF format
-   Improve file type detection when inserting images or PDF coming from external URL. It can read file extension in `Content-Disposition` if Carbone cannot find it `Content-Type` and URL.
    
-   The execution order of multiple Carbone tags using the `:set` formatter is guaranteed within the same part of a document (body, header, footer, text box). As a result, you can create new variables that depend on previously created ones. When an existing set expression is used to create another set expression, the new expression must be define after or bellow the existing expression. Example:
    
    ```text
      {d.price:add(10):set(d.total1)}
      {d.total1:add(20):set(d.total2)}
      {d.total2} = 30
    ```
    
-   Supports variables with absolute JSON paths starting with `d.` or `c.` in mathematical formatters: `add`, `sub`, `div`, `mul`. For example: `{d.total:add(d.val)}`.
    
-   Fix: Reduced the probability of generating corrupted XLSX files when using XLSX templates with `:formatN` to transform a JSON number into a native Excel number. Previously, if at least one injected value was a string, the generated XLSX file would become corrupted.
    
-   \[On-premise\] Load custom formatters as Javascript in your Carbone instance:
    
    -   Create a file named `formatters.js` under the `plugin` folder.
    -   Write `module.exports = { }`, then insert your Javascript function between curly brackets: One function is equal to one formatter.
    -   Here is the minimum code of a formatter:
        
        ```js
        function addText (d, text) {
          return d + text;
        }
        /**
         * Details:
         * "d" the tag value
         * "text" the first argument of the formatter
         * A value must be returned otherwise it will print nothing in the document.
         * Example usage: {d.value:addText(' euro')}
         */ 
        ```
        
        Find formatters examples on the following page: [https://github.com/carboneio/carbone/blob/master/formatters/string.js](https://github.com/carboneio/carbone/blob/master/formatters/string.js)
-   Accept to send a volatile template when calling the API `POST /render/template`. This template is never stored and it does not trigger the middleware `readTemplate`
    
    ```text
      {
        data      : {},
        template  : "base64-encoded-file",
        convertTo : "pdf"
      }
    ```
    
-   If `options.isDebugActive = true`. `POST /render` returns internal metrics information in `debug` sub-object. All `Time` values are in microsecond.
    
    ```js
    {
      debug    : {
        metrics : {
          preProcessTime  : 0,
          planTime        : 0,
          mergeTime       : 0,
          concatTime      : 0,
          fetchImageTime  : 0,
          fetchImageBytes : 0,
          fetchFileTime   : 0,
          fetchFileBytes  : 0,
          postProcessTime : 0,
          convertTime     : 0,
          renderTime      : 0,
          batchSize       : 1
        }
      }
    }
    ```
    

## v4.21.0

-   Release Mars 16th 2024
-   \[On-premise\] Studio Light: Added button to copy the Template ID of the previewed template.
-   \[EE\] Fixes support for SVG image replacement in DOCX templates, especially when using LibreOffice 24 for document conversion.
-   Fixes broken DOCX template with bi-directional loops when the template is created with Google Docs
-   Fixes the row height in spreadsheets. It forces LibreOffice to calculate the optimal row height if the row style in ODS templates has the `style:use-optimal-row-height='true'` parameter.

## v4.20.0

-   Release February 26th 2024
-   \[EE\] Support batch processing of multiple documents (max 5000) with one API call. The result is a zip file of documents. This feature is temporarily limited to some customers. Please contact us if you need to use it. Rate-limit : one batch processing at a time by tenant.

## v4.19.0

-   Release February 22th 2024
-   \[EE\] The `:color` formatter supports updating the background color of a page with `:color(page, background)` options in DOCX templates.
-   \[EE\] New aggregator formatters:
    -   `:aggCountD` : Count the number of distinct values. Null or undefined values are ignored.
    -   `:aggStrD` : Aggregate distinct values. Null or undefined values are ignored.
-   The `:formatC(precision, currency)' formatter accepts an optional second parameter to force the target currency. It overrides the global`currencyTarget\` option.
-   If the global option `currencySource` is undefined, no conversion is done when using the formatters `convCurr` and `formatC`.
-   Fixes locales `fr-CH` and `rm-CH`. Thousand separator is `'` and decimal separator is `.` like `de-CH` and `it-CH`.
-   The maximum number of repetitions when using this syntax `{d[i+1*qty]` can be set globally with the `maxRepetitionFactor` parameter (400 by default).
-   \[EE\] Update to latest Node v18

## v4.18.0

-   Release February 14th 2024
-   \[EE\] Support dynamic pictures into Shapes for DOCX template only. Create images with rounded corners, or images with special shapes.
-   Fixes formatter `substr(begin, end, wordMode)` when word mode is active. If `wordMode=true`, it never cuts words. It can be used to print successive lines of text of constant width. The previous algorithm of v4.12.0 could create some gaps (missing words) when doing successive calls of `substr`. Here is the problem:
    -   Each call to `substr` in the template is calculated independently.
    -   But the line of text we want to print depends on all the lines of text that have been printed before. To solve this, each subsequent call to `substr` must obey these constraints:
        -   A constant line width (`end` - `begin`) must be used between successive calls of `substr` to print all the words of the text without gaps. For example:
    -   `{d.text(0 , 50 , true)}` -> line 1 of 50 characters
    -   `{d.text(50 , 100, true)}` -> line 2 of 50 characters
    -   `{d.text(100, 150, true)}` -> line 3 of 50 characters
    -   `{d.text(150, 200, last)}` -> line 4 of infinite characters
        -   `last` can be used instead of `true` to print the rest of the text, even if it is longer than the defined line width.
        -   A word can only be truncated if it does not fit in the line. In this case, the word always starts at the beginning of a new line.
-   ⚡️ Carbone On-Premise starts with Community Edition features if no valid license is provided. It collects some statistics at startup (version, subscription). These statistics can be deactivated.
-   Improve the stability of reports based on ODT templates that include native charts.

## v4.17.0

-   Release January 30th 2024
-   To include a single-quote character in formatter parameter, write two adjacent single quotes, e.g., 'David''s Car'. Note that this is not the same as a double-quote character (").
-   `carbone.renderXML` accepts html templates if `option.extension` is `html`
-   Support `drop` in ODS (img, row) and HTML (table, p, row) templates.
-   ⚡️ Support `keep`, the opposite of `drop`
-   \[EE\] 🤩 New features and new supported templates for the new `:color(scope, type)` formatter
    -   Supported in ODT, ODP, HTML and DOCX templates
    -   `scope` can be `p` (by default), `cell`, `row`, `shape` to apply color to the current paragraph, cell, row or shape
    -   `type` can be `text` (by default), `highlight` for text, `background` for cells, rows and shapes, `border` for shapes only
    -   accepts only 6-digit hex color notation with or without hashtag, lowercase or uppercase: `#FF0000` or `FF0000`. Carbone replaces wrong color values with light gray (#888888)
    -   for HTML, the color is applied with the style attribute only to the selected HTML tag (tr, td and p)
    -   This new method is better than the old method with `bindColor`:
        -   It is much easier to use. The color is only applied to the targeted scope where the carbone tag is (like `:drop` or `:keep`).
        -   It does not break other styles of the targeted element. New colors are merged with existing style (e.g. cell border, ...).
        -   Supports different conditions on text and highlight at the same time for ODT/ODP. For example: `{d.col:color(p)} {d.nb:ifEQ(true):show(FF0000):color(p, highlight)}` is possible.
        -   Manages priority between overlapping areas. A color applied to the current paragraph has a higher priority than a color applied to the current shape, cell and row.
    -   WARNING: There are known limitations in this version:
        -   in ODP (text, table, and shapes) and ODT (shapes only), the `:color` formatter requires that a non-default style is already applied to the target element in the template (for example, a custom text color).
        -   complex nested tables with colors on sub-tables are not fully supported.
        -   `highlight` is not managed in docx template
        -   Cannot be used with aliases
    -   Fixed `:color(scope, type)` bug for DOCX templates when the Carbone tag `:color` tag is quite long with many conditions for example (v4.16.0)
-   🌈 New `:aggStr(separator)` formatter, a more powerful version of `:arrayMap`. By default the separator is ', '.
    -   `d.user.phones[]:aggStr()` -> `+331112345678, +331112345678, +331112345678`
    -   `d.cars[electric=true].brand:aggStr(' - ')` -> `Tesla - BYD - Kia`

## v4.16.2

-   Release January 3rd 2024
-   Increase glyphs cache size of Libreoffice at startup to speed up the PDF conversion of documents with 50 pages of table/text (potential gain: x10)

## v4.16.1

-   Release December 28th 2023
-   Fix array of string access in a loop of another array
-   The formatter `:set(c.value)` accepts to store values in complement object `c.`

## v4.16.0

-   Release December 19th 2023
-   Fix: accept undefined `formatOptions` when `convertTo` is an object
-   \[EE\] New `:color(scope, type)` formatter only for DOCX template: `{d.myHexColor:color(p)}`
    -   scope can be `p` (by default), `cell`, `row` for applying color on the current paragraph, cell and row.
    -   type can be `text` (by default), `background` for cells and rows.
    -   accepts only 6-digit hex color notation with or without hashtag, lower case or upper case: `#FF0000` or `FF0000`. Carbone replaces incorrect color values with white (#FFFFFF)

## v4.15.7

-   Release December 14th 2023
-   New aggregator `:cumCountD` to count the number of distinct values

## v4.15.6

-   Release November 16th 2023
-   \[EE\] Fix `:html` formatter did not remove forbidden characters such as `` in DOCX, ..., XLSX, ODT
-   Fix weird behavior when a tag with direct array access is placed on the same row as the loop:
    
    ```text
       {d.list[0].name} {d.list[i].name}
                        {d.list[i+1].name}
    ```
    
-   \[EE\] On-Premise: new feature to remove macro of ODS/ODT templates
-   \[EE\] Update echarts to 5.4.3

## v4.15.5

-   Release October 18th 2023
-   \[EE\] Before v4.15.5, Carbone executed the job which deletes unused reports (= not downloaded) every 60 minutes. The default retention time was also 60 minutes. Carbone could keep a generated report during 1 hour and 59 minutes 59 seconds instead of 1 hour (time announced in our documentation). Now, Carbone executes the cleaning process every 10 minutes, and the retention time is 50 min. As a result, a generated report is available for download for 50 minutes to a maximum of one hour.
-   \[EE\] On-premise: accept both Basic authentication and JWT when basic authentication is enabled
-   \[EE\] On-premise: add the possibility to set the scheduled job time interval for cleaning unused templates and unused generated reports. Set the environment variable `CARBONE_EE_CLEANINTERVALTIME`, or `--cleanIntervalTime` CLI options, or set `cleanIntervalTime` on the configuration file. The value must be in minutes (minimum : 1, maximum : 35791). The default value is "every 10 minutes".

## v4.15.4

-   Release October 13th 2023
-   \[EE\] Fix the `:html` formatter: the default font size from a DOCX template is always applied on the rendered HTML.
-   \[EE\] Accept charts in PPTX without style/color description
-   \[EE\] Fix a minor PPTX generation issue when using chart

## v4.15.3

-   Release October 6th 2023
-   \[EE\] On-Premise: `GET /` returns the same response as `GET /status` when the embedded studio is disabled

## v4.15.2

-   Release October 3rd 2023
-   \[EE\] Fix Basic authentication regression for On-premise version

## v4.15.1

-   Release September 26th 2023
-   Fix: Accepts to access adjacent array with `..`. Example: `{d.array[i]..otherArray[condition=other].id}`
-   \[EE\] Improve embedded v5 engine (see v4.15.0) when the formatter `drop` is used on `i+1` part of an array
-   \[EE\] Dynamic colors are supported into ODP documents. Only the text and background colors can be changed dynamically. Changing shapes and cell background are not supported.

## v4.15.0

-   Release September 20th 2023
-   \[EE\] Includes a part of the new highly reliable engine of Carbone v5. It supports more use cases and reduces virtually to 0% the probability to have "Could not open document" error. The new engine accepts syntaxes that are not logical for a computer but acceptable for a human, especially in a document. For example, writing tags in a document can generates such an algorithm sometimes:
    
    ```sh
      IF
        START LOOP
          END IF
        END LOOP
      # END IF should be here for a computer. Carbone fixes it automatically
    ```
    
    This v5 engine is only enabled if the template contains the tag `{o.preReleaseFeatureIn=4015000}` or if the configuration / API contains `preReleaseFeatureIn : 4015000`. This tag means: "enable all pre-release features added up to v4.15.0".

## v4.14.4

-   Release September 12th 2023
-   \[EE\] The `:imageFit` formatter is now supported for PPTX documents.

## v4.14.3

-   Release August 28th 2023
-   \[EE\] Fix dynamic images mixed with dynamic hyperlinks for DOCX documents
-   \[EE\] On-premise: change the message "Unknown parameter" to "Additional plugin parameters detected" when Carbone starts.
-   \[EE\] Fix corrupted PPTX files when the template uses multiple charts on many slides
-   \[EE\] When converting ODT/DOCX to HTML, embed images in the HTML instead of creating external links (works only with xhtml export)

## v4.14.2

-   Release August 4th 2023
-   \[EE\] Fix corrupted documents when ODP/ODT templates contain charts in some rare cases.

## v4.14.1

-   Release August 1st 2023
-   \[EE\] Fix charts bug in Docx templates since 4.14.0

## v4.14.0

-   Release July 26th 2023
-   \[EE\] Support two new template formats:
    -   `XML Word 2003` can be used to generate: `pdf`, `txt`, `docx`, `odt`, `doc`, `jpeg`, `png`
    -   `XML Excel 2003` can be used to generate: `pdf`, `csv`, `ods`, `xlsx`, `xls`, `jpeg`, `png`
    -   Known limitations: enterprise features are not supported for the moment (images, barcode, colors, html, etc...)
-   \[EE\] Fix `POST /render/:templateId`: when a body request is larger than the `maxDataSize` (Carbone CLoud API limit is 60MB), a `413` code is returned instead of `500`, and the error message is `Content too large, the JSON size limit is X MB` instead of `PayloadTooLargeError`.
-   \[EE\] Fix `:html` formatter for ODT/DOCX/PDF documents:
    -   Empty paragraphs on the generated document are now keeping the style applied on the template.
    -   HTML entities: Support unicode values for all currency symbols and most used punctuation. For instance `&#39;` will print `'`.
    -   Support the rendering of nested ordered/unordered lists with mixed paragraphs and anchors tags.
-   \[EE\] Support charts in ODP and PPTX templates (same chart types as DOCX/ODT)
-   Fix wrong template format detection when a PPTX contains a chart which an embbedded XLSX file

## v4.13.0

-   Release July 7th 2023
-   \[EE\] Carbone API status codes fixes:
    -   For all endpoints, if the API key is missing or not correct, a `401` code is returned instead of `500`.
    -   `POST /template`: if the `template` attribute is missing, a `422` code is returned instead of `400`.
    -   `POST /template`: if the template format is not supported, a `415` code is returned instead of `200`.
    -   `POST /render/:templateId`: if the `data` attribute is missing, a `422` code is returned instead of `400`.
    -   `GET /render/:renderId`: if the generated document does not exist, a `404` code is returned instead of `200`.
    -   `DELETE /render/:templateId`: if the template does not exist, a `404` code is returned instead of `400`.
-   Fix condition `ifNIN` when the data is `null` or `undefined`
-   Fix corrupted document when `html` formatter is used and the text contains `&D;`

## v4.12.2

-   Release July 3rd 2023
-   Fix chained formatters `:split():arrayJoin('', 2, 3)`
-   Fix formatter `substr`
-   Array filter: accept to filter `null` or `undefined` values

## v4.12.1

-   Release June 28th 2023
-   Fix `ellispis` -> `ellipsis` formatter

## v4.12.0

-   Release June 28th 2023
-   \[EE\] Carbone On-Premise: add parameter `maxTemplateSize` (bytes) to change default limit (20MB)
-   \[EE\] Fix `GET /template`: If the template doesn't exist, the statusCode `404` is returned instead of `400`.
-   \[EE\] Fix `POST /template`: If the template is too large, the statusCode `413` is returned instead of `400`
-   Add new fomatters:
    -   `ellipsis(maxLength)`: add three dots `...` if the text is longer than `maxLength`
    -   `substr(begin, end, wordMode)`: add a third option to cut the text without cutting a word if wordMode = true (false by default)
    -   `abs()`: get the absolute value of a number
    -   `replace(oldText, newText)`: replace a text by another
    -   `split(delimiter)`: split a text using a delimiter and generate an array
    -   `prepend(text)`: add a prefix
    -   `append(text)`: add a suffix
    -   `arrayJoin(separator, index, count)`: add two options to cut the array and select only a part of it

## v4.11.2

-   Release June 14th 2023
-   \[EE\] On-Premise: New option to enable more security controls, following ANSSI (France) and BSI (Germany) recommendations. Contact us for more information.
-   \[EE\] All APIs returns `400 Bad request` instead of `404 Not Found` when `idTemplate` is not valid

## v4.11.1

-   Release June 2nd 2023
-   Accept image from dropbox with mime type `application/binary` and image extension in capital letters

## v4.11.0

-   Release June 1st 2023
-   Support `drop` formatter in headers and footers of DOCX and ODT documents.
-   `:drop(h)` can be used to delete heading elements for ODT templates only. On LibreOffice, it relates to heading style 1, 2, 3, 4 and custom styles. For DOCX templates, `:drop(p)` must be used to delete heading elements.
-   Fix: using `:html` or `:drop` with an empty value inside a table cell no longer creates a corrupted document with DOCX templates.
-   Fix: sometimes `drop` formatter was not found and not executed by Carbone
-   Fix HTML formatter: The style of `<ul>` or `<ol>` lists are now correctly rendered into DOCX documents.
-   Fix a random dynamic chart issue with some DOCX templates
-   Fix chart distortion issue when converting DOCX to PDF if the document contains more than 20 charts
-   Fix hyperlink error when the value is not a string

## v4.10.6

-   Release May 12th 2023
-   \[EE\] Fix: accepts whitespace in image URL like before v4.10.2 even if it is not recommended

## v4.10.5

-   Release May 8th 2023
-   \[EE\] set default webhook timeout to 16 seconds (it was 3s since 4.10.0)

## v4.10.4

-   Release May 4th 2023
-   \[EE\] Egress traffic: When a request retry is attempted, do not use the egress proxy again if the primary egress proxy is configured and the secondary egress proxy is undefined

## v4.10.3

-   Release May 3rd 2023
-   \[EE\] Improve automatic HTTP request retry of images with the last version of [rock-req](https://github.com/carboneio/rock-req)

## v4.10.2

-   Release May 3rd 2023
-   \[EE\] Fix `options.isDebugActive = true`: do not return internal (not visible by user) tags
-   \[EE\] Fix crash when dynamic image URL contains forbidden characters
-   \[EE\] Fix crash when the socket is broken while the stream is still in progress for `GET /template/:templateId` and `GET /render/:reportId`
-   \[EE\] Fix `HEAD /render/:renderId`: The request don't delete the generated document anymore.
-   \[EE\] Fix `GET /template/:templateId`: If the template doesn't exist, the statusCode `404` is returned instead of `400`.

## v4.10.1

-   Release April 17th 2023
-   \[EE\] Disable egress proxy by default

## v4.10.0

-   Release April 17th 2023
-   \[EE\] Support vector barcodes with the new `svg` option to improve print quality: `{d.number:barcode(qrcode, svg:true)}`

## v4.9.2

-   Release April 14th 2023
-   \[EE\] Fix dynamic hyperlinks when `d` is an array for DOCX templates

## v4.9.1

-   Release April 12th 2023
-   \[EE\] with XLSX/ODS templates: `formatN` converts values to native Excel number even if `d` is an array. `formatN` without parenthesis is also accepted.
-   \[EE\] On-Premise: Add new options to use a proxy for egress traffic
-   Fix dynamic hyperlinks error URL and add slash to URLs

## v4.9.0

-   Release March 3rd 2023
    
-   Accept absolute path which starts by `d.` or `c.` without quotes in formatters like this : `{d.id:print(d.other)}` or `{d.id:print(c.other[0].test)}`
    
-   \[EE\] Force download of the rendered report when the query parameter `?download=true` is set
    
-   \[EE\] Increase request timeout from 5 to 6 seconds to download images from URLs
    
-   Accept loops on array of arrays (unlimited number of nested array) like this:
    
    ```text
      {d.myArray[i][i].val}
      {d.myArray[i][i+1].val}
      {d.myArray[i+1].val}
    ```
    
-   Support aggregators on array of numbers. For example:`{d.table[]:aggSum}` = 63 if `table` contains `[10, 20, 33]`. Known limitation: Array filters on array of strings/numbers are still not supported.
    
-   ⚡️ Support loops on array of string/numbers. Example:
    
    Data:
    
    ```json
      {
        "myArray" : ["yellow", 125, "blue"],
      }
    ```
    
    Template:
    
    ```text
      Direct access: {d.myArray[0]:upperCase()}
      Loop:
        - {d.myArray[i]}
        - {d.myArray[i+1]}
    ```
    
    Result:
    
    ```text
      Direct access: YELLOW
      Loop:
        - yellow
        - 125
        - blue
    ```
    
    To maintain backward compatibility with existing templates, if the template contains at least one attribute access on `myArray` (Example: `{d.myArray[i].subObjectAttribue}`), Carbone considers `myArray` is an array of objects and it disables this feature. In this case, `{d.myArray[i]}` prints nothing and is neutral for array filters even if the array contains a printable type like a string or a number, as it was before v4.9.0.
    
    Data:
    
    ```json
      {
        "otherArray" : [
          {"id" : 10},
          {"id" : 20},
          125,
          "blue"
        ]
      }
    ```
    
    Template:
    
    ```text
      Without filters:
        - {d.myArray[i]} {d.myArray[i].id}
        - {d.myArray[i+1]}
      With filters:
        - {d.myArray[i]} {d.myArray[i, id>9].id}
        - {d.myArray[i+1]}
    ```
    
    Result:
    
    ```text
      Without filters:
        -  10
        -  20
        -
        -
      With filters:
        -  10
        -  20
    ```
    
    Known limitation: Array filters on array of strings/numbers are still not supported.
    
-   \[EE\] Includes a part of the new v5 engine that supports more use cases in some complex templates. This v5 engine is only enabled if the template contains the tag `{o.preReleaseFeatureIn=4009000}`. This tag means: "enable all pre-release features added up to v4.9.0". Please only use this tag if we tell you to use it on our live chat.
    

## v4.8.3

-   Release February 15th 2023
-   \[EE\] Experimental: increase the limit to 400 repetitions maximum when using the repetition feature `{d[i+1*qty]`

## v4.8.2

-   Release February 7rd 2023
-   Fix dynamic image injection in some XLSX files

## v4.8.1

-   Release February 3rd 2023
-   Fix regular hyperlinks in DOCX (bug introduced by v4.6.3)

## v4.8.0

-   Release February 1st 2023
-   \[EE\] BREAKING CHANGE in Carbone On-Premise plugins: the callback of `getPublicKey` must take two arguments `(err, publicKeys)`. If the first argument contains an error, the bad token is kept in quarantine area for 60s instead of infinitely.
-   \[EE\] Update Echarts to 5.4.1, dayjs to 1.11.7
-   Fix horizontal loops in DOCX tables
-   Ignore `hardRefresh : true` if the output file type is the same as the template type, and the file type is unknown by LibreOffice (example: XML to XML)
-   Fix: The parameter of a formatter should not be considered as a dynamic variable if it starts with a dot and is surrounded by quotes as in v3.x

## v4.7.0

-   Release January 26th 2023
-   Improve error message when there is a missing \[show|hide\]Begin/End
-   Fix: Accept PDF password with integers
-   \[EE\] Support Bubble charts in Docx templates

## v4.6.8

-   Release December 7th 2022
-   Fix array filters when the same filter is used with different operators in multiple tags. Ex `{d[type=ok].id} {d[type!=ok].id}`

## v4.6.7

-   Release December 5th 2022
-   Fix regression of v4.6.6 when multiple loops are used on the same table.

## v4.6.6

-   Release November 30th 2022
-   Fix bugs when using two Carbone tags which are using similar paths in some complex situation (d > obj > arr > obj > \[arr|obj\] > att). Very hard to explain here!
-   Increase max downloaded image in parallel from 5 to 15.

## v4.6.5

-   Release November 25th 2022
-   Accept parentheses in formatters between single quotes

## v4.6.4

-   Release November 17th 2022
-   Fix aspect ratio of images if the same image is used twice in a second section of a document

## v4.6.3

-   Release November 10th 2022
-   Full support of table of content and bookmarks (internal hyperlinks) in DOCX templates

## v4.6.2

-   Release November 4th 2022
-   Fix: Encode HTML special characters when generating SVG with Echarts

## v4.6.1

-   Release October 28th 2022
-   Fixed `:drop(row, nbrToDrop)` for DOCX documents: bookmarked table rows can be deleted.
-   negative numbers can by used when filtering with the iterator `i`
    -   `{d.arr[i, i<-2].id} {d.arr[i+1, i<-2].id}` print all elements except the last 2 items
    -   `{d.arr[i, i<-1].id} {d.arr[i+1, i<-1].id}` print all elements except the last item

## v4.6.0

-   Release October 18th 2022
-   Added the option `table` for the `:drop(element)` formatter to delete table conditionally. Available for DOCX, ODT and ODP templates. Usage: `{d.value:ifEM:drop(table)}`. The tag must be located within a table cell.
-   ⚡️ Added for **PPTX** templates:
    -   Dynamic images are supported. Set the Carbone tag into the image alternative text. It is not possible to create a loop of images.
    -   All barcodes are supported. Set the Carbone tag into the image alternative text and chain the `:barcode(type)`, such as creating a QR Code: `{d.productCode:barcode(qrcode)}`.
-   Add user-agent `Carbone` when webhook is called. Print HTTP status webhook response in logs.
-   Added types for the `ifTE(type)` formatter: `boolean`, `binary`, `array`, `object`, `number`, `integer`. Usage: `{d.value:ifTE(number):show('It is a number!')}`, the conditional formatter checks if the type of the value is a number.

## v4.5.2

-   Release October 9th 2022
-   ⭐️ Add the possibility to store values in data with new formatter `:set(d.value)`. Known limits:
    -   accepts only to store values at the root level of `d`, and only in `d`.
    -   cannot be used in aliases
-   Fix aggregators `aggSum`, `aggAvg`, `aggMin`, `aggMax`, `aggCount` when used with filters (without iterators) like `{d.cars[id=1].wheels[size=100].makers[].qty:aggSum}`
-   New Formatters `mod()` to compute modulo
    -   Example: `{d.val:mod(2)}` returns 0 if `d.val` = 4

## v4.5.1

-   Release October 7th 2022
-   Added for the `:drop(element)` formatter:
    -   ODP templates are supported
    -   A new argument `slide` is available for ODP template only to delete slides. Usage: `{d.value:ifEM:drop(slide)}`.
    -   `drop(p, nbrParagraphs)` accepts a second parameter `nbrParagraphs` to delete multiple paragraphs at once. For instance `{d.data:ifEM:drop(p, 3)}`, meaning the current and next two paragraph will be removed if the condition is validated. By default, the formatter `:drop(p)` hides only the current paragraph.
-   aggregators (`aggSum`, `aggAvg`, ...) convert string to floats. `null` or `undefined` values are converted to
    -   aggSum : 0
    -   aggMin : +infinity
    -   aggMax : -infinity
    -   aggAvg : 0

## v4.5.0

-   Release October 5th 2022
-   Dynamic parameters passed in formatters with a dot `.` accepts dynamic array access between brackets `[.i]`: It can be used to select the corresponding element of another array: `{d.myArray[i]:myFormatter(..otherParentArray[.i].id)}`. `[.i]` matches with the index of `myArray[i]`. Multiple dots (`[..i]`, `[...i]`) can be used to access other parents arrays. If the index goes above `otherParentArray` length, it will return an empty string
-   Fix: HTML comment tags are not rendered and skipped by `:html` formatter
-   Fix: barcodes accepts integer values
-   On-Premise:
    -   Improve logs messages for webhooks
-   Performance: huge gain from x10 to x20 when Carbone builds the final result of the report before the conversion

## v4.4.1

-   Release September 26st 2022
-   On-Premise:
    -   add options `xlsmEnabled` to accept export to `xlsm` format (false by default)

## v4.4.0

-   Release September 21st 2022
-   Add new formatter `ifTE(string)` to test if a value is a string. Only "string" is supported for now.
-   Fix: In docx templates, array filters could be ignored when the loop includes images (bug introduced in v4.1.0 to fix broken docx)
-   On-Premise version:
    -   Improve error message of HTTP API /template /render
    -   Support execution of on Windows (beta)
-   New: Compute the difference between two dates with formatter: `d.fromDate:diffD(toDate, unit, patternFrom, patternTo)`.
    -   `fromDate` and `toDate` can be ISO 8601 format or any format defined with `patternFrom` and `patternTo`
    -   `unit` can be `millisecond(s)` or `ms`, `second(s)` or `s`, `minute(s)` or `m`, `hour(s)` or `h`,`year(s)` or `y`, `month(s)` or `M`, `week(s)` or `w`, `day(s)` or `d`, `quarter(s)` or `Q`. Here are examples with `d.fromDate = 20101001`:
    -   `{d.fromDate:diffD(20101201, days)}` => `61`
    -   `{d.fromDate:diffD(20101201, hours)}` => `1465`
-   Fix: `formatD` ignores the timezone if only a date is parsed without the time (without hour, minute, second). Example: when the timezone is `america/guayaquil` in `options.timezone`
    -   `'2010-12-01':formatD(LL)` returns `December 1, 2010`. Before this version Carbone returned `November 30, 2010`
    -   `'2010-12-01T01:00:00Z':formatD(LL)` returns `November 30, 2010 8:00 PM`

## v4.3.0

-   Release September 12st 2022
-   `hide` formatter becomes `drop` to avoid confusion with `hideBegin/hideEnd/show`. `hide` was introduced in 4.2 and is still not offically documented.
-   `drop(row, nbrRows)` accepts a second parameter to select the number of row to remove
-   `drop` formatter can't be used into Carbone aliases.

## v4.2.0

-   Release September 8st 2022
-   Fixed parsing of Carbone tags when empty string are used between two single quotes. Ex. `{d.text:print(''):print('HIGK LMN')}` prints `HIGK LMN` instead of `HIGKLMN`
-   Improved error messages if a square bracket is used in array accessor `[...]`
-   Added: Accepts dynamic parameters in array filters, with infinite path depth. Example: _Data_
    
    ```js
        {
          parent : {
            qty : 5,
            arr : [{
              id : 1
            }]
          },
          subArray : [{
            text : 1000,
            sub : {
              b : {
                c : 1
              }
            }
          }]
        }
    ```
    
    -   `{d.subArray[.sub.b.c = 1].text}`: filter using infinite object path depth. Alternative syntax without a dot is also accepted (`{d.subArray[sub.b.c = 1]}`) for backward compatibility
    -   `{d.subArray[i = .sub.b.c].text}`: filter using dynamic values on the right operand
    -   `{d.subArray[i = ..parent.qty].text}`: filter using dynamic values from parent objects on the right operand
    -   `{d.subArray[.sub.b.c = ..parent.qty].text}`: filter using complex path for the left and right operand in the same time This feature is really powerful but some syntax are not supported yet:
    -   `{d.subArray[i = .i].text}`: using `.i` to join two arrays is not supported
    -   `{d.subArray[i = ..parent.arr[0].id].text}`: accessing a specific array element is not supported
    -   `{d.subArray[i = ..parent.arr[.i].id]text}`: accessing a specific array element according to the current iterator is not supported
-   \[EE\] Added `hide` conditional formatter for DOCX/ODT/PDF to hide document elements: **images**, **paragraphs**, table **rows**, **shapes** and **charts**. The rendering is always accurate and simpler to use compared to `hideBegin/hideEnd` or `showBegin/showEnd`. The first argument passed to `:hide(argument1)` is the element to hide, it can be:
    -   `p` to hide paragraphs, usage: `{d.text:ifEM:hide(p)}`. The tag must be inside a paragraph. Every elements inside the paragraph are also removed if the condition is validated.
    -   `row` to hide a table row, usage: `{d.data:ifEM:hide(row)}`. The tag must be inside a table row. Every element inside the row are also removed if the condition is validated.
        -   Option `nbrRowsToHide`: Set the number of rows to hide as a second argument `{d.data:ifEM:hide(row, nbrRowsToHide)}`, such as: `{d.data:ifEM:hide(row, 3)}`, meaning the current and next two rows will be removed if the condition is validated. By default, the formatter `:hide(row)` hides only the current row.
    -   `img` to hide pictures, usage: `{d.img:ifEM:hide(img)}`. The tag must be included within the image' title, description or alternative text.
    -   `chart` to hide charts, usage: `{d.dataset:ifEM:hide(chart)}`. The tag must be included within the chart' alternative text.
    -   `shape` to hide shape (square, circle, arrows, etc...), usage: `{d.dataset:ifEM:hide(shape)}`. The tag must be included within the shape' title, description or alternative text.
-   \[EE\] Improved: ODS templates support loops of dynamic images. Setting the image anchor "To cell" is required.

## v4.1.0

-   Release August 22st 2022
-   \[EE\] New: `convCRLF` prints `\n` and `\r\n` as new lines in ODS template instead of strings
-   \[EE\] New: On-Premise Embedded Studio features:
    -   Drag and drop a JSON file and the studio automatically updates current left panel (data, complement, enum or translation)
    -   Drag and drop a template file and the studio automatically uploads the template and updates the preview
    -   Add HTML export
-   New: interval/duration formatters: `d.duration:formatI(patternOut, patternIn)`. It accepts duration in milliseconds (by default), or ISO format (ex. P1Y2M3DT4H5M6S).
    -   `patternOut` and `patternIn` can be `millisecond(s)` or `ms`, `second(s)` or `s`, `minute(s)` or `m`, `hour(s)` or `h`,`year(s)` or `y`, `month(s)` or `M`, `week(s)` or `w`, `day(s)` or `d`.
    -   `patternOut` can be human and human+. Here are examples with `d.duration = 3600000`:
    -   `{d.duration:formatI(ms)}` => `3600000`
    -   `{d.duration:formatI(s)}` => `3600`
    -   `{d.duration:formatI(minute)}` => `60`
    -   `{d.duration:formatI(hour)}` => `1`
    -   `{d.duration:formatI(human)}` => `an hour`
    -   `{d.duration:formatI(human+)}` => `in an hour`
    -   `{d.duration:formatI(hour, second)}` => `1000`
-   \[EE\] `:html` formatter updates:
    -   New: the image tag `<img>` is supported and rendered into DOCX/ODT/PDF documents.
        -   The image source attribute can be an URL or Data-URL, such as `<img src=""/>`
        -   The image size is rendered based on `width` and `height` attributes provided by the HTML tag, such as `<img src="" width="300" height="100"/>`. Values must be pixels. If `width` or `height` attributes are missing, the size of 5cm (1.96in) is applied by default while retaining the image aspect ratio.
    -   New: The HTML content can now be rendered into "heading" styled text on your text editor.
    -   Fixed: Paragraph spacing are now rendering correctly (e.g. `<p> <ul> <li>content </li> </ul>`, `<p><p> <p>content`)
    -   Fixed for ODT templates: Hyperlinks tags inside lists are now rendered without errors.
    -   Fixed for DOCX templates: ordered and unordered lists size the same as the text
-   \[EE\] Fixed dynamic hyperlinks with query parameters for ODT templates
-   \[EE\] Fixed broken Docx files when shapes were duplicated by Carbone

## v4.0.0

-   Release June 25st 2022
-   \[EE\] ⚡️ Main features summary (see v4.0.0-alpha.0 for details)
    -   Support dynamic charts in LibreOffice and Word + echarts
    -   Improved debug message output
    -   New aggregator formatters: `aggSum`, `aggAvg`, `aggMin`, `aggMax`, `aggCount`
    -   Accept more complex parameters in formatters: expression with arrays, Mathematical formulas (v3.5.0)
    -   Improved On-Premise Embedded Studio: multi-language, change export file format, automatic JSON generation from template
    -   Accept formatters after conditional formatters (v4.0.0-beta.1). For example, `bindColor` can be used with conditions
-   \[EE\] Fix chart in DOCX when there is no loops (filtered array)
-   \[EE\] Fix stateless studio crash when template does not contain any Carbone tags
-   \[EE\] 🌈 `bindColor` formatter replaces background and line colors of shapes in DOCX only.
    -   The `bindColor` tag must be written in the document (NOT in alt text of the shape)
    -   The replaced color in the template must be RGB. Select "RGB sliders" tool to defined the color in MS Word.
-   \[EE\] Use lossless image compression by default to speed up PDF rendering and improve image quality
-   \[EE\] Remove experimental support of images in HTML with `:html` formatter for ODT template added in v4.0.0-beta.3 (postpone in 4.1)
-   \[EE\] Barcode improvements (dependency update):
    -   The horizontal alignment of text in matrix symbols was fixed.
    -   Various fixes were made for the encoding of Data Matrix, DotCode and Micro QR Code symbols.
    -   The encoding of QR Code symbols was optimized.
    -   The encoding of Rectangular Micro QR Code symbols was aligned with the final release of the specification.
    -   The linear render now uses filled polygons rather than stroked lines.
    -   Code 93 Extended was amended to not shift encode "$%+/" symbols.
    -   Support was added for USPS FIM E marks.
    -   Support for AI (715) was added to the GS1 linter.
    -   Ultracode tile colours are now defined as RGB rather than CMYK. New tile colour patterns are defined for the upcoming revision.
    -   A bug in the encoding of certain Aztec Code symbols was fixed.
    -   A bug in the encoding of certain Dotcode symbols was fixed.
    -   A bug in the encoding of QR Code symbols containing Kanji compression was fixed.
    -   The rMQR encoding was optimised, potentially resulting in smaller symbols.
    -   The colours for Ultracode symbols were changed to RGB values rather than CMYK.
    -   The metrics for Ultracode symbols was updated and a raw mode was added.

## v4.0.0-beta.2

-   Release June 1st 2022
-   Fix crash with very complex JSON map

## v4.0.0-beta.1

-   Release May 25th 2022
-   \[EE\] Accept formatters after conditional formatters. It solves many issues, such as dynamic colors with conditions:
    -   `{d.value:ifLT(10):show(0):formatN}` : `formatN` works even if the condition `ifLT(10)` is true
    -   `{bindColor(fde9a9, hexa) = d.value:ifLT(10):show(FF00FF):ifLT(20):show(005FCF):elseShow(FFDD00)}`: conditional colors works!
-   Fix multiple reDoS and optimize parsing of some templates
-   \[EE\] Include 3.5.2
-   \[EE\] Dynamic chart:
    -   Fix crash when DOCX/ODT templates contain empty files
    -   Fix bad behavior when ODT template contains images with dynamic charts
    -   Fix chart binding when values contain white spaces
    -   Fix ODT charts when images are used for background

## v4.0.0-alpha.1

-   \[EE\] BREAKING CHANGE: the specific tag `{bind` becomes `{bindChart`. Example: `{bindChart(91) = d[i].valCol1}`
-   \[EE\] DOCX Charts improvements
    -   Manage loops to repeat multiple charts in DOCX template made by MS Office
    -   Update embedded spreadsheet
    -   Supports only Column, Line, Pie charts
    -   Carbone tags must be written with all `i` and `i+1` rows and columns in related Excel spreadsheet.
    -   Using the specific tag `{bindChart` is not mandatory for DOCX because MS Word accepts Carbone tags in chart values
-   Fix crash when a condition is used just before a filtered loop

## v4.0.0-alpha.0

WARNING: Native charts in LibreOffice and Word still need a lot of work before being stable for production

-   \[EE\] ⚡️ Carbone supports dynamic charts with two methods:
    
    -   1 - using native charts of MS Word or LibreOffice
    -   2 - or using [Apache ECharts 5.3.3](https://echarts.apache.org/examples/en/index.html) object descriptors to generate advanced cha2
    
    ### Method n°1, how to inject your data in native charts?
    
    -   Insert a chart with native tools of LibreOffice or MS Word in your document
    -   Use traditional Carbone tags to create loops in chart's data to inject your JSON data
    -   If necessary, use the special tag `bind` to tell Carbone that the value `X` in the chart must be replaced by the tag `Y`
    
    ### Method n°2, how to do advanced charts with Apache ECharts objects?
    
    -   Insert a sample image in your template.
        
    -   Place a tag in alt text , like a dynamic image : `{d.chartObj:chart}` with the formatter `:chart`. The formatter `:chart` is optional if the `chartObj` object contains the attribute `"type" : "echarts@v5"`. In that case, Carbone automatically considers it is a chart object instead of a dynamic image.
        
    -   `chartObj` must contains a compatible [Echarts option](https://echarts.apache.org/en/option.html). Here is an example to draw [this chart](https://echarts.apache.org/examples/en/editor.html?c=line-simple):
        
        ```json
        {
          "myChart" : {
            "type"    : "echarts@v5", // default
            "width"   : 600,          // default
            "height"  : 400,          // default
            "theme"   : null,         // default or object `theme` generated by https://echarts.apache.org/en/theme-builder.html
            "option"  : {
              "xAxis": {
                "type": "category",
                "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
              },
              "yAxis": {
                "type": "value"
              },
              "series": [{
                "data": [150, 230, 224, 218, 135, 147, 260],
                "type": "line"
              }]
            }
          }
        }
        ```
        
    
    Currently, Carbone supports only "echarts@v5" but we may support newer versions and other libraries in the future. By default, Carbone considers "echarts@v5".
    
    Some charts have some translation: Locales supported : cs, de, en, es, fi, fr, it, ja, ko, pl, pt-br, ro, ru, si, th, zh
    
    Rendering charts with Apache Echarts is extremely powerful and works well if all these conditions are met
    
    -   ECharts supports what you ask
    -   The template supports the rendered SVG (docx/xslx/pptx does not support SVG images)
    -   Your chart configuration does not need external dependencies (maps, js code, themes), which are not available in Carbone
    
    If you meet some limitation, please feel free to contact us on our chat to solve the issue.
    

-   \[EE\] If `options.isDebugActive = true`. `POST /render` returns additional information in `debug` sub-object:
    
    ```js
    {
      "renderId" : "file.pdf",
      "debug"    : {
        "markers" : ["{d.id}", "{d.tab[i].id}"] // all tags found in template
        "sample" : {         // EXPERIMENTAL
          "data"       : {}, // fake data generated from tags found in tags
          "complement" : {}  // fake complement generated from tags found in tags
        }
      }
    }
    ```
    
-   Improve syntax error message:
    
    -   when a tag tries to access an array and a object in the same time
    -   when there is a missing `[i]` tag fo one `[i+1]` tag
    -   when Carbone cannot find the section to repeat
    -   when there is a dot `.` before `[]`
-   Fix crash when repetition does not contain XML tags. For example: `<w:t>{d[i].id}, {d[i+1].id}</w:t>`
    
-   Fix crash when the section i+1 is duplicated like the i-th section with nested repetition and other tags
    
-   Fix crash when repetition uses direct access of sub-arrays `{d.test.others[i].wheels[0].size} {d.test.others[i+1].wheels[0].size}`
    
-   \[EE\] On-Premise Embedded Studio has new features and fixes:
    
    -   \[EXPERIMENTAL\]: sample `Data` and `Complement` are automatically generated using tags found in template if these field contain empty objects
    -   export to other formats than PDF
    -   change report language
    -   fix firefox template upload
    -   fix memory leak
    -   Now it works on Safari, without hot-reloading of the template
-   Formatters managements has been completely rewritten, to make it faster and more reliable. Here are acceptable syntax for formatters. For backward-compatibility: text containing single quotes are accepted if it does not contain a comma `,` before or after the single quote: `anyFormatter(' text ,containing ' sin,gle ' quote ')`
    
-   Dynamic parameters passed in formatters with the dot `.` syntax has been improved:
    
    -   Add the possibility to access sub arrays with positive integers: `.sort[12].id`
    -   Add a syntax checker, which returns an understandable error when the syntax is not correct. Ex: `.sort.[sd`, `.sor]t.[sd`
    -   Improved access performance by a factor of 10
    -   Add the possibility to access array iterators of currently visited arrays. The number of dots equals the number of previous `i`. Example: In `{d[i].cars[i].other.wheels[i].tire.subObject:add(.i):add(..i):add(...i)}`
        -   `.i` matches with the index of `wheels[i]`
        -   `..i` matches with the index of `cars[i]`
        -   `...i` matches with the index of `d[i]`
-   \[EE\] ⚡️ New aggregator formatters : `aggSum`, `aggAvg`, `aggMin`, `aggMax`, `aggCount`
    
    _Data_
    
    ```js
        { brand : 'Lu' , qty : 1  , sort : 1 },
        { brand : 'Fa' , qty : 4  , sort : 4 },
        { brand : 'Vi' , qty : 3  , sort : 3 },
        { brand : 'Fa' , qty : 2  , sort : 2 },
        { brand : 'To' , qty : 1  , sort : 1 },
        { brand : 'Vi' , qty : 10 , sort : 5 }
    ```
    
    _Template => Result_
    
    Global aggregation, without iterator  
    
    -   `{d.cars[].qty:aggSum}` => 21
    -   `{d.cars[].qty:aggAvg}` => 3.5
    -   `{d.cars[].qty:aggMin}` => 1
    -   `{d.cars[].qty:aggMax}` => 10
    -   `{d.cars[].qty:aggCount}` => 6
    
    Global aggregation, with array filters  
    
    -   `{d.cars[sort>1].qty:aggSum}` => 19
    -   `{d.cars[sort>1].qty:aggAvg}` => 4.75
    -   `{d.cars[sort>1].qty:aggMin}` => 2
    -   `{d.cars[sort>1].qty:aggMax}` => 10
    -   `{d.cars[sort>1].qty:aggCount}` => 4
    
    Global aggregation, with array filters, with other formatters  
    
    -   `{d.cars[sort>1].qty:mul(.sort):aggSum:formatC}` => 81.00 €
    -   `{d.cars[sort>1].qty:mul(.sort):aggAvg:formatC}` => 13.50 €
    -   `{d.cars[sort>1].qty:mul(.sort):aggMin:formatC}` => 1.00 €
    -   `{d.cars[sort>1].qty:mul(.sort):aggMax:formatC}` => 50.00 €
    -   `{d.cars[sort>1].qty:mul(.sort):aggCount:formatC}` => 6.00 €

```text
- [EE] 🤩 Aggregators can also be used in a loop to compute sub-totals and cumulative totals (or "running totals"), with custom grouping clause (partition)
  - By default if not grouping clause is defined:
    - Sum by departments of all people's salary:
      - `{d.departments[i].people[].salary:aggSum}`
      - `{d.departments[i].people[].salary:aggSum(.i)}` (alternative)
    - Global sum of all departments, all people's salary
      - `{d.departments[i].people[i].salary:aggSum}`
      - `{d.departments[i].people[i].salary:aggSum(0)}` (alternative)
    - Cumulative total (or "running total") by departments of all people's salary:
      - `{d.departments[i].people[].salary:cumSum}`
    - Cumulative total (or "running total") of all departments, all people's salary
      - `{d.departments[i].people[i].salary:cumSum}`

  - You can change the partition with dynamic parameters like that
    - Sum by people by age, regardless of departments
      - `{d.departments[i].people[i].salary:aggSum(.age)}`
    - Sum by people by age and gender, regardless of departments
      - `{d.departments[i].people[i].salary:aggSum(.age, .gender)}`
```

## v3.7.2

-   Release June 13th 2024
-   Update dependencies for security
-   Improve Libreoffice detection on Arch Linux (Thank you @jan-san)
-   Fix: removed the possibility of prototype pollution in formatters

## v3.7.1

-   Release December 19th 2023
-   \[EE\] Fix crash when dynamic image URL contains forbidden characters

## v3.7.0

-   Release June 15th 2023
-   \[EE\] All APIs returns "400 Bad request" instead of "404 Not Found" when `idTemplate` is not valid
-   \[EE\] Fixed `HEAD /render/:renderId` : The request don't delete the generated document anymore.
-   \[EE\] Fixed `GET /template/:templateId` : If the template doesn't exist, the statusCode 404 is returned instead of 400.
-   \[EE\] Force download of the rendered report when the query parameter ?download=true is set, such as: `POST /render/:renderId?download=true`
-   \[EE\] On-Premise: New option to enable more security controls, following ANSSI (France) and BSI (Germany) recommendations. Contact us for more information.
-   \[EE\] Updated `DELETE /template/:templateId`: If there isn't a template, Carbone does not remove any template but will still respond that the command was successful with a code `200`.

## v3.6.0

-   Release April 17th 2023
-   Support vector barcodes with the new `svg` option to improve print quality: `{d.number:barcode(qrcode, svg:true)}`

## v3.5.6 \[EE\]

-   Release February 16th 2023
-   \[EE\] BREAKING CHANGE in Carbone On-Premise plugins: the callback of `getPublicKey` must take two arguments `(err, publicKeys)`. If the first argument contains an error, the bad token is kept in quarantine area for 60s instead of infinitely.

## v3.5.6

-   Release June 12th 2024
-   Fix: removed the possibility of prototype pollution in formatters. This can only occur if the parent NodeJS application has the same security issue. CVSS:3.0/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H.
-   Update some dependencies

## v3.5.5

-   Release December 7th 2022
-   Add user-agent `Carbone` when webhook is called.

## v3.5.4

-   Release June 15th 2022
-   \[EE\] Do not return an error when `DEL /template` is called and the template is already deleted on local storage. It may be already deleted by the plugin.

## v3.5.3

-   Release May 25th 2022
-   \[EE\] Accept `convCRLF` before `:html` formatter to convert to `<br>`

## v3.5.2

-   Release May 6th 2022
-   \[EE\] Add file verification on template upload

## v3.5.1

-   Release May 4th 2022
-   Rollback fix in v3.4.9

## v3.5.0

-   Release May 4st 2022
-   Formatters `add()`, `mul()`, `sub()` and `div()` accept simple mathematical expressions inside parenthesis.
    -   Example: `{d.val:add(.otherQty + .vat * .price - 10 / 2)`
    -   Only mathematical operators `+, *, -, /` are allowed, without parenthesis
    -   Multiplication and division operators (`*`, `/`) has higher precedence than the addition/substration operator (`+`, `-`) and thus will be evaluated first.

## v3.4.9

-   Release April 27st 2022
-   Fix crash with very complex JSON map

## v3.4.8

-   Release March 15st 2022
-   \[EE\] Fix: avoid crash when a tag is used on a shape instead of a sample image (v3.2.2-1)
-   \[EE\] Fix graceful exit on SIGTERM, keep the converter alive to finish remaining renders!
    -   As soon as Carbone has finished all renders, it exits after 15 seconds instead of 10 seconds
-   \[EE\] Fix DOCX documents that are including dynamic images and static charts

## v3.4.7

-   Release March 1st 2022
-   \[EE\] Carbone-EE On-Premise accepts to read the license from environment variable `CARBONE_EE_LICENSE`, or `--license` CLI options

## v3.4.6

-   Release February 18th 2022
-   \[EE\] The HTTP server starts as soon as possible, before LibreOffice.
-   \[EE\] Gracefully exits on SIGTERM. When the signal is received
    -   GET /status returns 503. The reverse-proxy should stop sending new requests
    -   As soon as Carbone has finished all renders, it exits after 10 seconds
    -   Whatever happens, it exists after 300 seconds.
-   \[EE\] Add barcode options: pass to the formatter `:barcode` options as second argument. It should keep the format "key:value", such as: `{d.number:barcode(qrcode, width:300, height:100, includetext:false)}`. Options available:
    -   `width` Width a number as millimeters. Example: `{d.number:barcode(qrcode, width:300)}`
    -   `height` Height a number as millimeters. Example: `{d.number:barcode(qrcode, height:10)}`
    -   `scale` Quality of the barcode as a number between `1` to `10`. The default value is `3`. Example: `{d.number:barcode(qrcode, scale:3)}`
    -   `includetext` Show the text and takes a Boolean as value, `true` or `false`. Example: `{d.number:barcode(qrcode, includetext:false)}`.
    -   `textsize` Number to change the size of the text. Example: `{d.number:barcode(qrcode, textsize:20)}`
    -   `textxalign` Change the alignment of the text horizontally. Takes only 4 values: `left`, `center`, `right`, or `justify`. The default value is center. Example: `{d.number:barcode(qrcode, textxalign:right)}`
    -   `textyalign` Change the alignment of the text vertically. Takes only 3 values: `below`, `center`, or `above`. The default value is below. Example: `{d.number:barcode(qrcode, textyalign:above)}`.
    -   `rotate` Rotate the barcode and the text. Takes only 4 values (case insensitive): `N` for not rotated, `R` for 90 degree right rotation, `L` for 90 degree left rotation, `I` of 180 degree rotation. Example: `{d.number:barcode(qrcode, rotate:R)}` or `{d.number:barcode(qrcode, rotate:l)}`.
    -   `barcolor` Color of bars as hexadecimal `#RRGGBB`. Example: `{d.number:barcode(qrcode, barcolor:#1FDE25)}`. Note: 6 characters required, and case insensitive.
    -   `textcolor` Color of the text as hexadecimal `#RRGGBB`. Example: `{d.number:barcode(qrcode, textcolor:#1FDE25)}`. Note: 6 characters required, and case insensitive.
    -   `backgroundcolor` Color of the background as hexadecimal `#RRGGBB`. Example: `{d.number:barcode(qrcode, backgroundcolor:#1FDE25)}`. Note: 6 characters required, and case insensitive.
    -   `eclevel` Specify the error correction level: `L` for Low, `M` for Medium (default), `Q` for Quality and `H` for High. Option ONLY FOR QRCODES, Micro QR Code, GS1 QR Code, HIBC QR Code, or Swiss QR Code.
-   \[EE\] Dynamic HTML improvement - the following styles applied on the `:html` formatter are kept on the generated document: Right-to-left text, and text/background colors.
-   \[EE\] Dynamic HTML Fix - When creating a ordered or unordered list, the font-size, and font-family applied on the template are now kept in the generated document.

## v3.4.5

-   Release February 9th 2022
-   Now the parameter `converterFactoryTimeout` updates also the HTTP socket timeout accordingly

## v3.4.4

-   Release February 7th 2022
-   \[EE\] Experimental: increase the limit to 200 repetitions maximum when using the repetition feature `{d[i+1*qty]`

## v3.4.3

-   Release January 31th 2022
-   \[EE\] Bump dependencies to latest version
-   \[EE\] Add `options.isDebugActive`. If true, `POST /render` returns additional information in `debug` sub-object:
    
    ```js
    {
      "renderId" : "file.pdf",
      "debug"    : {
        "markers" : ["{d.id}", "{d.tab[i].id}"] // all tags found in template
      }
    }
    ```
    

## v3.4.2

-   Release January 10th 2022
-   \[EE\] Fix do not crash if content passed to `:html` formatter is not a string

## v3.4.1

-   Release December 9th 2021
-   Accepts "OpenDocument Text Flat XML" (.fodt) template files
-   Includes v3.3.3: fix timezone conversion with latest IANA database to manage correctly Daylight Saving Time
-   \[EE\] Fix dynamic colors for DOCX cells background

## v3.4.0

-   Release November 17th 2021
-   Remove compatibility with NodeJS 10.x. V8 uses timsort since NodeJS 11. So we can remove timsort dependency. NodeJS 12+ required.
-   Bump DayJS to 1.10.7 and debug to 4.3.2
-   Improve thread management of LibreOffice on Linux:
    -   The system, which auto-restarts LibreOffice when it crashes or if there is a conversion timeout, could hang indefinitely on Linux. On the Enterprise Edition, the global watchdog system was able to fix this bad behavior but it was slow. Now, the LibreOffice is correctly killed. No zombie processes remaining.
    -   Avoid launching the parent process "oosplash" of LibreOffice
    -   Improve auto-restart mechanism
    -   Add debug logs
    -   All tests passed on Linux 😅
-   \[EE\] Bump all dependencies
-   \[EE\] Fix random image display in LibreOffice documents. Sometimes, LibreOffice hides one image when two or more images share the same name.
    
    ```text
     Now, Carbone generates a unique name for each image with the format "carbone-image-<counter>".
    ```
    
-   \[EE\] Experimental: Deffered rendering with a webhook, it is dedicated to render huge reports:
    1.  Render a document as usual with the request `POST /render/:templateID` with the JSON dataset into the body request AND you have to insert the header `carbone-webhook-url` as a callback URL. It is an endpoint of your server listening when a document is rendered.
    2.  Carbone will generate your document and it will notify your webhook with a renderID
    3.  Retrieve the generated document with a `GET /render/:renderID` and voilà!
-   \[EE\] Experimental: add the possibility to duplicate rows using an attribute of an object _Data_:
    
    ```json
      [
        { "id" : "A", "qty" : 2 },
        { "id" : "B", "qty" : 3 },
        { "id" : "C", "qty" : 0 },
        { "id" : "D", "qty" : 1 }
      ]
    ```
    
    _Template_: `{d[i].id} - {d[i+1*qty].id}` _Result_: `A - A - B - B - B - D`
-   \[EE\] ⚡️ **Carbone supports 107 barcodes** in DOCX/ODT/XLSX/ODS templates:
    -   Barcodes are inserted as a dynamic image to support more types
    -   In your template, barcodes tags must be inserted inside the title or description field of a temporary image, and then it must be followed with the barcode formatter, such as `{d.value:barcode(type)}`.
    -   You must pass one of the following types to the `:barcode` formatter as a first argument: `ean5`, `ean2`, `ean13`, `ean8`, `upca`, `upce`, `isbn`, `ismn`, `issn`, `code128`, `gs1-128`, `ean14`, `sscc18`, `code39`, `code39ext`, `code32`, `pzn`, `code93`, `code93ext`, `interleaved2of5`, `itf14`, `identcode`, `leitcode`, `databaromni`, `databarstacked`, `databarstackedomni`, `databartruncated`, `databarlimited`, `databarexpanded`, `databarexpandedstacked`, `gs1northamericancoupon`, `pharmacode`, `pharmacode2`, `code2of5`, `industrial2of5`, `iata2of5`, `matrix2of5`, `coop2of5`, `datalogic2of5`, `code11`, `bc412`, `rationalizedCodabar`, `onecode`, `postnet`, `planet`, `royalmail`, `auspost`, `kix`, `japanpost`, `msi`, `plessey`, `telepen`, `telepennumeric`, `posicode`, `codablockf`, `code16k`, `code49`, `channelcode`, `flattermarken`, `raw`, `daft`, `symbol`, `pdf417`, `pdf417compact`, `micropdf417`, `datamatrix`, `datamatrixrectangular`, `datamatrixrectangularextension`, `mailmark`, `qrcode`, `swissqrcode`, `microqrcode`, `rectangularmicroqrcode`, `maxicode`, `azteccode`, `azteccodecompact`, `aztecrune`, `codeone`, `hanxin`, `dotcode`, `ultracode`, `gs1-cc`, `ean13composite`, `ean8composite`, `upcacomposite`, `upcecomposite`, `databaromnicomposite`, `databarstackedcomposite`, `databarstackedomnicomposite`, `databartruncatedcomposite`, `databarlimitedcomposite`, `databarexpandedcomposite`, `databarexpandedstackedcomposite`, `gs1-128composite`, `gs1datamatrix`, `gs1datamatrixrectangular`, `gs1qrcode`, `gs1dotcode`, `hibccode39`, `hibccode128`, `hibcdatamatrix`, `hibcdatamatrixrectangular`, `hibcpdf417`, `hibcmicropdf417`, `hibcqrcode`, `hibccodablockf`, `hibcazteccode`
    -   The previous system, which uses a special font, is still available but is limited to `ean8`, `ean13`, `ean128`, `code39`.

## v3.3.2

-   Release October 11th 2021
-   \[EE\] Dynamic Image fix: image types verification support uppercase and lower case formats

## v3.3.1

-   Release September 9th 2021
-   \[EE\] New Carbone On-premise: Pass the option "maxDataSize" to change the maximum JSON data size when rendering a report. The value must be **bytes**. The default value is 60MB.

## v3.3.3

-   Release November 26th 2021
-   Fix timezone conversion with latest IANA database to manage correctly Daylight Saving Time `2021-11-18T08:05+0000` -> `Europe/London` -> `Thursday, November 18, 2021 8:05 AM`

## v3.3.0

-   Release August 30th 2021
-   \[EE\] HTML Formatter:
    -   Fix: The HTML content is rendered without adding an empty line above it.
    -   Fix: The HTML content and static content are rendered in the expected order.
    -   New: If static content and Carbone tags are mixed with an HTML formatter in the same paragraph, the html is isolated into a new paragraph and each element are seperated above or below. For example, the following template on a text editor `<paragraph>A rocket is made of {d.data:html} {d.details}, this is cool!</paragraph>` will be transform into 3 paragraphs on the generated report `<paragraph>A rocket is made of </paragraph><paragraph>{d.data:html}</paragraph><paragraph> {d.details}, this is cool!</paragraph>`.
    -   Improved HTML rendering stability when it is mixed with lists, tables, and images.
-   \[EE\] Dynamic Checkbox are supported only for ODT file. A tag should be inserted into the checkbox property "name" and it is used to set the value of the checkbox on the generated report. The checkbox is ticked (checked) when the value is a Boolean with the value "true", a non empty string, a non empty array or a non empty object. If the exported file type is a PDF, the checkbox can be edited on the generated document. An ODT document created from MS Word that include checkboxes does not work. It is also not possible to create a list of checkboxes with the expressions `[i] / [i+1]`.
-   Accept `null` for the attribute `complement` in `options`

## v3.2.7

-   Release July 21th 2021
-   Fix corrupted document when accessing a sub-object in an array `{d.surrounding[i].subArray[0].subObject.id}`, within a surrounding loop

## v3.2.6

-   Release June 15th 2021
-   \[EE\] Fix the generation of ODP document that includes table lists.

## v3.2.5

-   Release June 10th 2021
-   \[EE\] Accept URLs with weird Content-Type such as `image/png; charset=utf-8` for dynamic image replacement

## v3.2.4

-   Release May 25th 2021
-   \[EE\] Add the possibility to upload templates in base64. The content-type must be `application/json` and the template must be sent in base64 in the body `{ "template" : "pure base64 or data-URI scheme in base64"}`
-   \[EE\] Accepts loops with dynamic image replacement across slides/pages in ODP templates

## v3.2.3

-   Release May 21th 2021
-   Accepts letter `W` to get the week number in `formatD` formatter

## v3.2.2-1

-   Release March 11th 2022
-   Fix: avoid crash when a tag is used on a shape instead of a sample image

## v3.2.2

-   Release May 10th 2021
    
-   Fix broken Excel files. It removes the alert which appears sometime when opening the file with MS Excel.
    
-   Update DayJS dependency from 1.9.6 to 1.10.4.
    
-   Fix date formatters (`formatD`...) and number formatters (`formatN`...) when the country code is used in `options.lang`. It accepts lower case or upper case for the locale. Example:
    
    _Data_:
    
    ```js
      {
        date  : '20140131 23:45:00',
        price : 1000.1234
      }
    ```
    
    _Template_: `{d.date:formatD(dddd)} {d.price:formatN()}`
    
    _Result_:
    
    -   `de-DE` => `Friday 1.000,123` (before) `Freitag 1.000,123` (after)
    -   `fr-fr` => `Friday 1 000,123` (before) `vendredi 1 000,123` (after)
-   Fix number formatting for these locales: nl-be, am, ar, ar-dz, ar-bh, ar-eg, ar-iq, ar-jo, ar-kw, ar-lb, ar-ly, ar-ma, ar-om, ar-qa, ar-sa, ar-sy, ar-tn, ar-ae, ar-ye, az-az, bn, bs, zh-cn, zh-hk, zh-mo, zh-sg, zh-tw, hr, da, en-au, en-bz, en-ca, en-cb, en-in, en-ie, en-jm, en-nz, en-ph, en-tt, fa, fr-lu, de-li, de-lu, de-ch, el, he, hi, id, it-it, it-ch, ja, kn, ko, ms-bn, ms-my, ml, mr, ro-mo, ro, ru-mo, sr-sp, sl, es-ar, es-bo, es-cl, es-co, es-do, es-ec, es-sv, es-gt, es-hn, es-mx, es-ni, es-pa, es-py, es-pe, es-pr, es-es, es-uy, es-ve, sw, ta, te, th, tr, uz-uz, vi, de, es, it
    
    Example:
    
    -   `de` => `Freitag 1,000.123` (before) `Freitag 1.000,123` (after)

## v3.2.1

-   Release May 4th 2021
-   Fix locale de-de
-   \[EE\] Fix dynamic HTML: null or undefined values return an empty string instead of an error.

## v3.2.0

-   Release April 13th 2021
-   \[EE\] Fix dynamic image resize when using the `:imageFit` formatter with the `contain` property.
-   \[EE\] Add the option `:imageFit(fillWidth)` to fill the full width of the template image while keeping aspect ratio of the inserted image. Before fixing the bug with `contain` property, it was more or less the default behaviour of Carbone before this version. So, `fillWidth` becomes the default option to avoid changing the style of existing reports.
-   \[EE\] Improve performance to download images. Building a report with a lot of dynamic images is almost 5 times faster than before.
-   \[EE\] When the dynamic image cannot be inserted (fetch failed, image type not supported),
    -   the aspect ratio of the replacement image keep the aspect ratio of the template
    -   this replacement image more beautiful (vectorial) and does not contain any text for internationalisation
-   \[EE\] Fix corrupted XLSX files when inserting new type of image which were not previously present

## v3.1.7

-   Release April 12th 2021
-   \[EE\] Fix Dynamic HTML: paragraph and break lines inside nested lists or anchor tags were creating corrupted DOCX/ODT documents.

## v3.1.6

-   Release April 12th 2021
-   \[EE\] New formatter `:defaultURL()`: if a **dynamic hyperlink** or a **HTML anchor tag** is injected into a report and the URL verification fails, the formatter is used to replace the default error URL. Example to use it with and HTML formatter: `{d.content:defaultURL(https:url.of.your.choice):html}`. The `:defaultURL` should be placed before the `:html` formatter.
-   \[EE\] Fix: return 404 error when the template does not exist on rendering

## v3.1.5

-   Release April 8th 2021
-   \[EE\] Fix hyperlinks verification which could lead to crash.

## v3.1.4

-   Release April 1st 2021
-   \[EE\] Improve `:html` formatter stability when using special characters such as "'<>& for ODT and DOCX reports.

## v3.1.3

-   Release March 29th 2021
-   Fix: Do not break documents if the `i+1` row contains some tags coming from parent object or condition blocks (rare)
-   \[EE\] if a font family and font size is applied to an HTML formatter `{d.content:html}`, the font & size will be applied to the whole rendered HTML
-   \[EE\] return an error message when image anchor is not correct in the template

## v3.1.2

-   Release March 4rd 2021
-   Fix: v3.1.0 introduced a backward compatibility issue with reports made with v1/v2. Now, filter with boolean works like this (same behavior as numbers)
    -   data => template => condition result in array
    -   `data.myBoolean = true` => `d.array[i, myBoolean=true]` => true
    -   `data.myBoolean = "true"` => `d.array[i, myBoolean=true]` => true
    -   `data.myBoolean = "false"` => `d.array[i, myBoolean=true]` => false
    -   `data.myBoolean = false` => `d.array[i, myBoolean=true]` => false
    -   `data.myBoolean = "true"` => `d.array[i, myBoolean='true']` => true
    -   `data.myBoolean = true` => `d.array[i, myBoolean='true']` => false

## v3.1.1

-   Release March 4rd 2021
-   \[EE\] Fix: remove html entities not supported by XML format when using `:html` formatter

## v3.1.0

-   Release March 3rd 2021
-   Accepts boolean in array filters `d.array[i, myBoolean=true]`
-   \[EE\] Improve hyperlinks validation
-   \[EE\] Improved HTML conversion with formatter `:html` for DOCX / ODT templates:
    -   Support `ol`, `ul`, `p`, `ul`, `ol`, `li` and `a` tags
    -   Fixed spacing management between list / paragraph / multi elements.
    -   All HTML entities are supported (Full List: [https://www.w3schools.com/charsets/ref\_html\_entities\_4.asp](https://www.w3schools.com/charsets/ref_html_entities_4.asp))
    -   Improved break-lines support
    -   Fixed hyperlinks when exporting DOCX to PDF
    -   Possible to include hyperlinks, break-lines, and style tags into any level of lists
    -   Improved overall stability

## v3.0.4

-   \[EE\] Restore old `convert` formatter for some clients

## v3.0.3

-   \[EE\] Fix: add the "https://" protocol if it is missing for dynamic hyperlinks

## v3.0.2

-   \[EE\] Fix: accepts hyperlinks with "&", add the "https://" protocol if it missing, add URL validation. If the URL is invalid, it is replaced by a valid URL refering to the carbone documentation.
-   \[EE\] Fix: do not crash if hyperlink is undefined
-   \[EE\] Fix: support random way of managing hyperlinks in MS Word
-   \[EE\] Fix: set Content-Type when downloading the report

## v3.0.1

-   Fix: aliases beginning with same prefix names are properly rendered in the generated reports instead of not being skip.
-   \[EE\] Accepts a new local filename in the On-Premise plugin `writeTemplate(err, newFilename)`
-   \[EE\] Fix: license detection in Docker
-   \[EE\] Fix dynamic hyperlinks for DOCX reports
-   Improve documentation

## v3.0.0

-   👋🏻 NOTE: This version contains breaking changes of undocumented features. So if you use only documented features so far, you should not be concerned by these breaking changes.
    
-   ⚡️ **Manage timezone + new date formatters + switch from MomentJS to DayJS**
    
    -   If not defined by you in `options.complement`, `{c.now}` returns the current date in UTC.
        
    -   \[BREAKING CHANGE\]: remove old date formatter which were not documented: `format`, `parse`, `addDays` and `convert`. You should use `formatD` instead and new formatters below. They were very old formatters, the chance you use them is low because you had to look into the source code to know their existence.
        
    -   New formatters:
        
        -   `addD(amount, unit [, patternIn])` : add days, month to a date. `formatD` can be used after without specifying patternIn
        -   `subD(amount, unit [, patternIn])` : subtract days, month to a date. `formatD` can be used after without specifying patternIn
        -   `startOfD(amount, unit [, patternIn])` : Set a date to the start of a unit of time. `formatD` can be used after without specifying patternIn
        -   `endOfD(amount, unit [, patternIn])` : Set a date to the end of a unit of time. `formatD` can be used after without specifying patternIn
    -   \[BREAKING CHANGE\]: We try to stay as close as possible as the previous parsing algorithm. But `1997-12-17 07:37:16-08` is not accepted anymore without specifying an input pattern or writing `1997-12-17 07:37:16-08:00`
        
    -   Accept a new options to set the `timezone` of `formatD`. Examples:
        
        _Data_
        
        ```js
          {
            date     : '2020-11-28T21:54:00.000Z',  // ISO 8601 UTC
            dateWTZ  : '2020-11-28T21:54:00',       // without timezone
            dateTZ   : '2020-11-28T21:54:00-04:00', // with America/New_York timezone offset
            dateUnix : 1606600440                   // UNIX timestamp in seconds UTC of 2020-11-28T21:54:00.000Z
          }
        ```
        
        _Template => Result_
        
        if `options.timezone = 'Europe/Paris'` (default)
        
        -   `{d.date:formatD(LLLL)}` => `Saturday, November 28, 2020 10:54 PM`
        -   `{d.dateWTZ:formatD(LLLL)}` => `Saturday, November 28, 2020 9:54 PM`
        -   `{d.dateTZ:formatD(LLLL)}` => `Sunday , November 29, 2020 2:54 AM`
        -   `{d.dateUnix:formatD(LLLL, X)}` => `Saturday, November 28, 2020 10:54 PM`
        
        if `options.timezone = 'America/New_York'`
        
        -   `{d.date:formatD(LLLL)}` => `Saturday, November 28, 2020 4:54 PM`
        -   `{d.dateWTZ:formatD(LLLL)}` => `Saturday, November 28, 2020 3:54 PM`
        -   `{d.dateTZ:formatD(LLLL)}` => `Saturday, November 28, 2020 8:54 PM`
        -   `{d.dateUnix:formatD(LLLL, X)}` => `Saturday, November 28, 2020 4:54 PM`
        
        List of timezone: [https://en.wikipedia.org/wiki/List\_of\_tz\_database\_time\_zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
        

-   Fix: if a path does not exist inside a formatter argument, it returns an empty string instead of the error "\[\[C\_ERROR\]\] attribute\_name not defined". It fixes some weird behaviour with ifEM formatters
    
-   \[EE\] Feature: cells colors on ODT/DOCX report can be changed dynamically with the "bindColor" tag.
    
-   \[EE\] ODT Improvement: the "bindColor" tag will not remove other styles than colors.
    
-   Accepts to convert the first page of docx or odt templates into a JPEG file with `converTo : 'jpg'`
    
-   Improve HTML type detection. Accepts html5 without doctype.
    
-   \[EE\] Fix Carbone tag inside ODT text box
    
-   Adding `padl` and `padr` string formatter.
    
-   Fix doc issue on carbone website
    
-   Accepts Adobe Indesign IDML file as a template
    
-   \[EE\] Dynamic hyperlinks: it is possible to insert hyperlinks into elements (text, image, list, tables, ...). Right click an element, select "hyperlinks", insert the tag and validate. It is working with ODS, ODT, and DOCX reports. The compatibility is limited for XLSX documents: It is not possible to create a list of hyperlinks and the tag should not be written with curly braces, example: a typical `{d.url}` should be only `d.url`. If `http://` appears before `d.url`, it is also valid.
    
-   Improve the parsing processing by moving the function "removeXMLInsideMarkers" before the building stage.
    
-   Support officially to embed translations tags inside other tags: `{d.id:ifEq(2):show( {t(Tuesday)} ) }`
    
-   Performance: reduce disk IO when converting document
    
-   Performance: deactivate image compression by default to speed up PDF conversion
    
-   \[BREAKING CHANGE\]: remove the possibility to use `convertTo.formatOptionsRaw` for CSV export. This feature was not documented and can lead to security issues. Use `convertTo.formatOptions` instead.
    
-   new paramater in `Carbone.set`
    
    -   `renderPath` : `Carbone.set` can changes the default path where rendered files are temporary saved.
        
        ```text
                     By default, it creates the directory `carbone_render` in Operating System temp directory.
                     It creates the path automatically
        ```
        
-   new paramater in `Carbone.render`
    
    -   `renderPrefix` : If defined in `options` object. `Carbone.render` returns a file path instead of a buffer, and it adds this prefix in the rendered filename
        
        ```text
                     The generated filename contains three parts:
                       - the prefix
                       - a secure Pseudo-Random part of 22 characters
                       - the report name, encoded in specific base64 to generate safe POSIX compatible filename on disk
                     `/renderpath/<prefix><22-random-chars><encodedReportName.extension>`
                     This filename can be decoded with the function `Carbone.decodeOuputFilename(pathOrFilename)`.
                     It is the user responsability to delete the file or not.
        ```
        
-   New function `decodeOuputFilename()`: when `renderPrefix` is used, the returned filename can be parsed with this function.
    
    ````text
                    It decodes filename an returns an object with two parameters
                    ```js
                    {
                      extension  : 'pdf',                // output file extension
                      reportName : 'decoded report name' // reportName
                    }
                    ```
    ````
    
-   \[BREAKING CHANGE\]: `Carbone.convert` function signature has changed. Now, it accepts the same `options` as Carbone.renders: You must use `Carbone.convert(fileBuffer, options, callback)` instead of `Carbone.convert(fileBuffer, convertTo, options, callback)`
    
-   \[EE\] Returns errors when Carbone cannot dynamically replaces images (ex. images with absolute positions) instead of generating a bad report
    
-   \[EE\] Fix some PDF options. Integer values were not taken into account.
    
-   \[EE\] Add the possibilty to generate JPG or PNG of the first page of a document Available options for `jpg/png`:
    
    ```js
        convertTo : {
          formatName    : 'jpg', // or png
          formatOptions : {
            Quality     : 90,  // [JPG ONLY] From 1 (low quality, high compression, low size) to 100 (high quality, low compression, high size
            PixelWidth  : 100, // Image width as pixels
            PixelHeight : 100, // Image height as pixels
            Compression : 90,  // [PNG ONLY] From 0 (compression disabled) to 9 (high compression, low size)
            Interlaced  : 0,   // [PNG ONLY] 0 not interlaced, 1 enterlaced (higher size)
            ColorMode   : 0    // 0 Colors, 1 Greyscale
          }
        }
    ```
    
-   🎁 \[EE\] DOCX/ODT New feature: Support HTML rich content, by adding the `:html` formatter, it is possible to render the following HTML tag: `<br>`/`<b>`/`<strong>`/`<i>`/`<em>`/`<u>`/`<s>`/`<del>`. Unsupported tags and tags attributes are skipped and not rendered. HTML entities are accepted.
    
-   \[EE\] New feature: Dynamic pictures are supported on ODG and ODP files. It is not possible to create loops.
    
-   \[EE\] New Carbone Render On-Premise
    
    -   Carbone can be safely deployed on your own servers. Contact us for further information

## v2.1.1

-   Release September 23rd 2020
-   Fixes `arrayJoin( ):convCRLF`. Now it works in carbone v2.x.x like in v1.x.x.
-   Removes 'zipfile' dev dependency. Tests use unzip from the system instead.
-   8.1.3 mocha upgrade
-   \[EE\] Fixes crash when images field in data contain an object instead of a string

## v2.1.0

-   Release September 1st, 2020
-   Performance: huge gain from x11 to x30 for the compression of reports. Now, some huge reports takes 0.1s to render instead of 4s. It reduces also the blocking of Node's event loop.
-   New rendering option `hardRefresh`: The content of the report is refreshed at the end of the Carbone process. For example, it can be used to refresh the table of content or update calculations. The option `convertTo` has to be defined.
-   \[EE\] fix dynamic images in DOCX files that were making the report invalid in Word
-   \[EE\] fix dynamic images in header & footers of docx templates
-   \[EE\] Injecting dynamic colors received a lot of improvements and stability:
    -   ODT, DOCX, and ODS reports are fully supported. XLSX can't be supported by design for now.
    -   Text and background colors in footers and headers are supported for ODT and DOCX templates.
    -   Better error management, it throws errors when:
        -   bindColor is not correctly formatted
        -   2 bindColor tags try to edit the same color
        -   the background color format on DOCX documents is different than "color"
        -   the color format does not exist
        -   2 different lists of colors are used to edit the same element

## v2.0.2

-   Release August 10th, 2020
-   Fix locales de-ch and pt-br
-   Fix direct access in a nested array `{d.array[i].nestedArray[i=0].id}`
-   \[EE\] : fix server exit on "Ctrl+C"

## v2.0.1

-   Release July 8th, 2020
-   Add regression tests
-   \[EE\] : fix crash when an array was printed directly without formatters `{d.myArray}`

## v2.0.0

-   Release June 28th, 2020
    
-   🚀 **Accepts dynamic variables in all formatters!**
    
    Carbone passes data to formatters if parameters start with a dot `.` and is not surrounded by quotes. Here is an example:
    
    _Data_
    
    ```js
        {
          id : 10,
          qtyA : 20,
          subObject : {
            qtyB : 5,
            qtyC : 3
          },
          subArray : [{
            id : 1000,
            qtyE : 3
          }]
        }
    ```
    
    _Template => Result_
    
    do mathematical operations:  
    `{d.subObject.qtyB:add(.qtyC)}` => 8 (5+3)
    
    read parent attributes if you use two dots, grandparents if you use three dots, etc...  
    `{d.subObject.qtyB:add(.qtyC):add(..qtyA)}` => 28 (5+3+20)
    
    read parent objects and their children attributes (no limit in depth)  
    `{d.subArray[i].qtyE:add(..subObject.qtyC)` => 6 (3+3)
    
    It returns an error if the attribute does not exist  
    `{d.subArray[i].qtyE:add(..badAttr)` => \[\[C\_ERROR\]\] badAttr not defined
    
    You cannot access arrays  
    `{d.subObject.qtyB:add(..subArray[0].qtyE)}` => \[\[C\_ERROR\]\] subArray\[0\] not defined
    
-   ⚡️ **New conditional formatters, and a new IF-block system to hide/show a part of the document**
    
    -   `ifEQ (value)` : Matches values that are equal to a specified value, it replaces `ifEqual`
    -   `ifNE (value)` : Matches all values that are not equal to a specified value
    -   `ifGT (value)` : Matches values that are greater than a specified value.
    -   `ifGTE (value)` : Matches values that are greater than or equal to a specified value.
    -   `ifLT (value)` : Matches values that are less than a specified value.
    -   `ifLTE (value)` : Matches values that are less than or equal to a specified value.
    -   `ifIN (value)` : Matches any of the values specified in an array or string, it replaces `ifContain`
    -   `ifNIN (value)` : Matches none of the values specified in an array or string
    -   `ifEM (value)` : Matches empty values, string, arrays or objects, it replaces `ifEmpty`
    -   `ifNEM (value)` : Matches not empty values, string, arrays or objects
    -   `and (value)` : AND operator between two consecutive conditional formatters
    -   `or (value)` : (default) OR operator between two consecutive conditional formatters
    -   `hideBegin` and `hideEnd` : hide text block between hideBegin and hideEnd if condition is true
    -   `showBegin` and `showEnd` : show a text block between showBegin and showEnd if condition is true
    -   `show (message)` : print a message if condition is true
    -   `elseShow (message)` : print a message if condition is false
    -   `len()` : returns the length of a string or array.
    
    No formatters can be chained after `hideBegin`, `hideEnd`, `showBegin`, `showEnd`.
    
    These new formatters replace the old ones `ifEqual`, `ifEmpty` and `ifContain`. We keep these old formatters for backwards compatibility. You should avoid using them in new templates.
    
    _Data_
    
    ```js
        {
          id : 10,
          qtyA : 20
        }
    ```
    
    _Template => Result_
    
    print simple message according to the result of a condition  
    `{d.id:ifEQ(10):show('hey')}` => hey
    
    print simple message according to the result of multiple conditions, combining with dynamic variables! 🤩  
    `{d.id:ifEQ(10):and(.qtyA):ifEQ(20):show('hey'):elseShow('hide')}` => hey
    
    hide or show a block of text in the document ⚡️  
    `{d.id:ifEQ(10):showBegin}` block of text `{d.id:showEnd}` => block of text  
    `{d.id:ifEQ(12):showBegin}` block of text `{d.id:showEnd}` =>
    
    A smart and generic algorithm detects automatically pattern (paragraph, bullet-list, etc) to remove in document even if the conditional block is not placed correctly in XML. For example: `BEGIN<p> blabla END</p>` becomes `BEGIN<p> blabla </p>END`. It improves the final result by removing empty spaces in document.
    
-   ☀️ **Accepts to iterate on attributes of objects as is if it was an array**
    
    ```js
    {
      myObject : {
        paul : '10',
        jack : '20',
        bob  : '30'
      }
    }
    ```
    
    In the report:
    
    ```text
      {d.myObject[i].att} {d.myObject[i].val}
      {d.myObject[i+1].att} {d.myObject[i+1].val}
    ```
    
    -   use .att to print the attribute
    -   use .val to print the value
    
    You can even access nested objects and nested arrays inside `val`: `{d.myObject[i].val.myArray[i].id}`
    
-   Fix: avoid crashing when a static image was inserted in a loop in MS Word templates
    
-   Update totals in ODS and XSLX files
    
-   `formatC` supports many crypto currencies
    
-   Fix: Accepts comma in formatter parameters such as `{d.sentenceExist:ifEqual(1, 'Some sentence, some more sentences.')}`
    
-   Fix: nested array in XML (but not in JSON) was not printed correctly
    
    ```text
      {d.countries[i].name}
        {d.movies[i].subObject.name}
        {d.movies[i+1].subObject.name}
      {d.countries[i+1].name}
    ```
    
-   Fix: avoid crashing when a sub-object is null or undefined in data
    
-   Fix: avoid crashing when the parent object of an array is null or undefined in data
    
-   Eslint code + add eslint tools
    
-   Fix: accepts dashes characters in JSON data. Before, Carbone crashes when using `{d.my-att-with-dash}`
    
-   Fix: avoid crashing when a XLSX template contains charts
    
-   Beta: supports dynamic charts rendering in XLSX if these conditions are met:
    
    -   first, draw a chart in MS Excel and replace your data with Carbone tags
    -   datas of the chart should be placed at the top-left corner of the spreadsheet
    -   all numbers are formatted with formatN() formatter
-   Fix: accepts white-space in array filters with simple quote and double quotes Example: `{d.cars[i, type='Tesla car'].name}`
    
    ```text
         `{d.cars[i, type="Tesla car"].name}`
    ```
    
-   Fix LibreOffice detection on Windows
    
-   Remove compatibility with older NodeJS versions (lower than 10.15.0)
    
-   Upgrade some dependencies (moment, debug, yauzl) and remove useless ones (should)
    
-   Accepts non-alphanumeric characters in variables names, values, ... For example, `{d.i💎d}` is allowed
    
-   Fix many security issues and reduce memory consumption
    
-   Fix crash when tags are next to each over `{d.id}{d.other}` in many situations:
    
    -   with or without conditional blocks
    -   with or without loops
-   Fix crash when some documents like DOCX contain images in repetition section
    
-   Accept direct access in arrays such as `{d.myArray[2].val}` instead of `{d.myArray[i=2].val}`
    
-   Fix crash when two consecutive arrays, nested in object, were used
    
-   Remove useless soft-page-break in ODT documents as suggested by the OpenDocument specification
    
-   LibreOffice 6+ has a memory leak. So Carbone automatically restarts LibreOffice after a certain amount of document conversion. The number of conversions depends on new parameters `factoryMemoryFileSize` and `factoryMemoryThreshold`
    
-   Add conversion timeout parameter `converterFactoryTimeout` (60s by default). It kills LibreOffice if the conversion is too long and returns an error
    
-   Remove deprecated NodeJS "new Buffer"
    
-   Fix: avoid crashing if a object/array is null or undefined. Print empty text instead.
    
-   Fix: variables, which begin by the same characters, were not detected correctly since NodeJS 11
    
-   \[EE\] Image processing completely rewritten
    
-   \[EE\] Dynamic images improvements: it is possible to insert images into `ODT`, `ODS`, `XLSX` and `DOCX` by passing a public URL or a Data URLs. For the 2 solutions, you have to insert a temporary picture in your template and write the tag as an alternative text. Finally, during rendering, Carbone replaces the temporary picture by the correct picture provided by the tag.
    
    The place to insert the tag on the temporary picture may change depends on the file format:
    
    -   ODS file: set the tag on the image title
    -   ODT file: set the tag on the image alternative text
    -   DOCX file: set the tag either on the image title, image description, or alternative text
    -   XLSX file: set the tag either on the image title, image description, or alternative text
    
    The accepted images type are: `png`, `jpeg`/`jpg`, `gif`, `svg`
    
    If an error occurs for some reason (fetch failed, image type not supported), a replacement image is used with the message "invalid image".
    
-   \[EE\] dynamic images: new formatter `:imageFit()` only available for `DOCX` and `ODT` files. It sets how the image should be resized to fit its container. An argument has to be passed to the formatter: `contain` or `fill`. If the formatter is not defined, the image is resized as `contain` by default.
    
    -   `contain`: The replaced image is scaled to maintain its aspect ratio while fitting within the element’s content-box (the temporary image).
    -   `fill`: The replaced image is sized to fill the element’s content-box (the temporary image). The entire image will fill the box of the previous image. If the object's aspect ratio does not match the aspect ratio of its box, then the object will be stretched to fit.
    
    example: `{d.myImage:imageFit(contain)}` or `{d.myImage:imageFit(fill)}`
    
-   \[EE\] Added Libreoffice export filters for PDF rendering. To apply filters to a PDF, it is possible to assign an object to `convertTo` with `formatName:'pdf'` and `formatOptions` an object with the specified filters. The filter list is available on the documentation. Here is an example of a PDF with a password and a watermark:
    
    ```js
      options = {
        convertTo: {
          formatName: 'pdf',
          formatOptions: {
            EncryptFile          : true,
            DocumentOpenPassword : 'QWERTY1234',
            Watermark            : 'Watermark Carbone'
          }
        }
      }
    ```
    

## v1.2.1

-   Release June 11, 2019
-   Fix `arrayMap()` if used with an array of strings or integer

## v1.2.0

-   Release March 13, 2019
-   Add new formatters
    -   `convCurr(targetCurrency, sourceCurrency)` to convert from one currency to another
    -   `formatN()` format number according to the locale (lang). Examples:
        -   old `toFixed(2):toFR` can be replaced by `formatN(2)`
    -   `formatC()` format currency according to the locale and the currency
        -   old `toFixed(2)} {t(currency)}` can be replaced by `formatC(2)`
    -   `formatD()` format date according to the locale. Same as `convDate`, but consider parameters are swapped for consistency with formatN. Moreover, `patternIn` is ISO8601 by default.
    -   `convDate()` is deprecated
    -   `add(valueToAdd)`, `mul(valueToMultiply)`, `sub(valueToSubstract)`,`div(value)` : mathematical operations
    -   `substr(start, end)` : slice strings
-   `carbone.set` and `carbone.render` have new options
    -   `currencySource` : default currency of source data. Ex 'EUR'
    -   `currencyTarget` : default target currency when the formatter `convCurr` is used without target
    -   `currencyRates` : rates, based on EUR { EUR : 1, USD : 1.14 }
-   Fix memory leaks: one file descriptor remains opened
-   Fix crash when template is not correct
-   Now `option.lang` must use the i18n format 'fr-fr' instead of just 'fr'
-   Add fallback to basic sorting when timsort crashes
-   Bump debug and moment to fix vulnerabilities
-   Remove Support of NodeJS 4

## v1.1.1

-   Release October 11, 2018
-   Better Windows support by improving path detection for `soffice` and `python` across all operating platforms. Done by Robert Kawecki (@rkaw92).

## v1.1.0

-   Release February 26, 2018
-   Fix: should find tags even if there is a opening bracket `{` before the tags
-   Fix: accept to nest arrays in XML whereas these arrays are not nested in JSON
-   Fix: tags were not parsed if formatters were used directly on `d` or `c` like this `{d:ifEmpty('yeah')}` ...
-   Fix: keep the first element of the array if the custom iterator is constant
-   Fix a lot of strange bugs when using a filter without iterators in arrays (ex. `{d.cities[i=0].temperature}`)
-   Optimization: gain x10 when sorting 1 Million of rows
-   Add formatter `unaccent` to remove accent from string
-   `carbone.set` does not overwrite user-defined translations
-   Accepts iteration on non-XML. Example: `{d[i].brand} , {d[i+1].brand}`
-   Add new formatters
    -   `unaccent()` to remove accent from string
    -   `count()` to print a counter in loops. Usage: `{d[i].name:count()}`
    -   `convCRLF()` to convert text, which contains or , into "real" carriage return in odt or docx document
-   Formatters which have the property `canInjectXML = true` can inject XML in documents
-   Return an error in render callback when LibreOffice is not detected
-   Get the last object of an array using negative values when filtering with `i` iterator
    -   `{d.cities[i=-1].temperature}` shows the temperature (if the array is not empty) of the last city
    -   `{d.cities[i=-2].temperature}` shows the temperature of the city before the last
    -   ...

## V1.0.1

-   Release October 13, 2017
-   Automatically remove XML-incompatible control codes (U+0000 to U+0008 and U+000B to U+000C and U+000E to U+001F) before inserting data in templates
-   Fix: ifEqual did not work correctly with boolean values

## V1.0.0

-   Release June 7, 2017 - First Public Release, First Public Demo on the [Web2day](https://web2day.co) event!
-   It loads all lang at startup, and it is able to change the lang at runtime
-   Avoid unnecessary synchronous code in `carbone.set`
-   Improve documentation
-   Default template path is working directory by default
-   Return the list of supported format when an unknown `options.convertTo` is used
-   Accept more input type
-   Remove deprecated formatters
-   `carbone.set` takes into account changes on `factories` and `startFactory` parameters
-   Fix: a report without tags, except lang ones, is translated
-   Fix: avoid creating LibreOffice zombies when node crashes
-   Fix: avoid using LibreOffice if `options.convertTo` equals input file extension
-   Fix: improve tags detection to avoid removing some XML variable like `{DSDSD-232D}` used in DOCX
-   Fix: now compatible with node v4.5.0+, v6+, v8+

## v0.13.1

-   Release February 22, 2017
-   Access properties of the parent object with two (or more) points `..` and then access children properties as usual: `{d.cities[i, temp=20]..country.history.sport.value}`
-   Do not crash when there is a javascript error during building process
-   Improve error outputs: detect when an unknown formatter is used, and propose a correction

## v0.13.0

-   Release February 20, 2017
-   Access properties of the parent object with two points `..` or more. Use case: conditional printing of properties using filters in nested arrays:
    -   `{d.cities[i, temp=20]..countryName}` prints `d.countryName` only when the temperature of cities equals 20
-   Built-in conditional formatters, which starts by `if`, stop propagation to next formatters if the condition is true
-   New formatters:
    -   `convEnum(d, type)`: convert enums to human readable values
    -   `ifEqual(d, value, messageIfTrue, continueOnSuccess)`: show message if `d == value`, and stop propagation to next formatters unless `continueOnSuccess` is true
    -   `ifContain(d, value, messageIfTrue, continueOnSuccess)`: show message if `d contains value`, and stop propagation to next formatters unless `continueOnSuccess` is true
    -   `print(d, message)`: print message
-   New function `carbone.renderXML(xmlString, data, options, callback)` to render XML directly
-   Change the lang dynamically in `carbone.render` and `carbone.renderXML` with `options.lang = 'fr'`. The date formatter is automatically propagated on formatters such as `convDate`
-   Replace module zipfile by yauzl: faster, lighter, asynchrone
-   XLSX templates are accepted (beta)
-   Parse embedded XLSX and DOCX documents
-   Add a tool to search a text within a tag in all reports `carbone find :formatterName`

## v0.12.5

-   Release December 1, 2016
-   Bump moment.js to 2.17.0
-   Add some powerful and tested formatters: `ifEmpty`, `arrayJoin`, `arrayMap`, `convDate`, `lowerCase`, `upperCase`, `ucFirst`, `ucWords`
-   Fix: in formatters `convert`, `format`, `addDays`, `parse`: if the date is null or undefined these formatters return null or undefined instead of "Invalid Date"

## v0.12.4

-   Fix: `carbone.render` crash if `options` contains `formatName` without `formatOptionsRaw` and `formatOptions`

## v0.12.3

-   Fix: on OSX, the LibreOffice 5.2 path has changed
-   Possibility to add the source file extension in `options` when using `convert(data, convertTo, options, callback)` function. It is mandatory for CSV files otherwise LibreOffice does not understand the file type.
    
    ```text
    {
      fieldSeparator  : ',',
      textDelimiter   : '"',
      characterSet    : '76',
      sourceExtension : '.csv'
    }
    ```
    

## v0.12.2

-   Fixed crash when a document cannot be parsed. It returns an error instead of crashing

## v0.12.1

-   Fixed crash when a document cannot be converted (ods -> doc for example). It returns an error instead of crashing
-   Update documentation to install LibreOffice 5.1 on Ubuntu Server
-   Fix: crashed when using a nested undefined object inside a template

## v0.12.0

-   Upgrade Zipfile, improve some tests for Node.js 4.x compatibility

## v0.11.3

-   Fixed crash when data contains a lot of nested arrays

## v0.11.2

-   Fix a performance issue when a template isn't using iterators at all, this issue caused the array of data to become really big in some cases even though only a small portion of the data was really used

## v0.11.1

-   CarboneJS Server can be used on a remote server. CarboneJS send the document by socket instead of writing a file locally (only when a document conversion occurs)
-   CarboneJS Server 0.11 is still compatible with CarboneJS v0.10 clients
-   Add two benchmarks tests
-   Fix a random failure in a test

## v0.10.1

-   Allow the comparison operator `!=` in your template: `{d.cars[engine.power != 3].name}`
    
-   Add a newline at the end of the lang file
    
-   Fix: Translation, upper and lower case order does not depend on user's language anymore
    
-   Do not restart LibreOffice if the document is corrupted (restart it only after 10 consecutive attemps)
    
-   Return an error when the document cannot be converted
    
-   Improve stability in general
    
-   Socket connections have been improved:
    
    -   it manages TLS communications
    -   it increases the delay between two connection attempts exponentially until it reaches a maximum delay of 20sec
-   Fix bugs in tests
    
-   Compatible with Node v0.12
    
-   Update zipfile dependency
    
-   Now, the repetition algorithm can flatten an array of objects!!
    
    -   it accepts to increment multiple arrays in the same time
    -   it repeats automatically all tags that are on the same row of all nested arrays
    
    Example:
    

**Datas:**

````text
```
  [
    {
      'site' : {'label':'site_A'},
      'cars' : [
        {
          'name': 'prius',
          'spec': {'weight': 1},
          'wheels':[
            {'brand':'mich'},
            {'brand':'cont'}
          ]
        },
        {
          'name': 'civic',
          'spec': {'weight': 2},
          'wheels':[
            {'brand':'mich'}
          ]
        },
      ],
    },{
      'site' : {'label':'site_B'},
      'cars' : [{
          'name': 'modelS',
          'spec': {'weight': 1},
          'wheels':[
            {'brand':'mich'},
            {'brand':'uni' },
            {'brand':'cont'}
          ]
        }
      ],
    }
  ];
```
````

**Template:**

| site | car name | weight | brand |
| --- | --- | --- | --- |
| {d\[i\].site.label} | d\[i\].cars\[i\].name} | {d\[i\].cars\[i\].spec.weight} | {d\[i\].cars\[i\].wheels\[i\].brand} |
| {d\[i+1\].site.label} | d\[i+1\].cars\[i+1\].name} | {d\[i+1\].cars\[i+1\].spec.weight} | {d\[i+1\].cars\[i+1\].wheels\[i+1\].brand} |

**Result:**

| site | car name | weight | brand |
| --- | --- | --- | --- |
| site\_A | prius | 1 | mich |
| site\_A | prius | 1 | cont |
| site\_A | civic | 2 | mich |
| site\_B | modelS | 1 | mich |
| site\_B | modelS | 1 | uni |
| site\_B | modelS | 1 | cont |

-   Warning: cannot use moxie-zip 0.0.4 because this commit ([https://github.com/spocke/moxie-zip/commit/cbc6af14dc2318bbcfcfa82ebaf183c525346ae2](https://github.com/spocke/moxie-zip/commit/cbc6af14dc2318bbcfcfa82ebaf183c525346ae2)) creates wrong \*.ods files. The empty directory Bitmap is replaced by a executable file.

## v0.10.0

-   Add new conversion options for CSV export
    
    Now it is possible to pass conversion options to LibreOffice. The attribute `convertTo` can be an object instead of a string:
    
    ```text
    var _options = {
      'convertTo' : {
        'formatName' : 'csv',
        'formatOptions' : {
          'fieldSeparator'    : '+',
          'textDelimiter'     : '"',
          'characterSet'      : '0'
        }
      }
    };
    carbone.render(_filePath, data, _options, function(err, result){
      ...
    });
    ```
    
-   Add the possibility to pass raw conversion options to LibreOffice. See documentation: [https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter\_Options](https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options)
    
    ```text
    var _options = {
      'convertTo' : {
        'formatName' : 'csv',
        'formatOptionsRaw' : '124,34,0'
      }
    };
    carbone.render(_filePath, data, _options, function(err, result){
      ...
    });
    ```
    
-   Improve LibreOffice detection algorithm for Linux. Now, it supports any version of LibreOffice
    
-   BUG fix: When two nested arrays were incremented in the same time `{d.tab[i+1].subtab[i+1]}`, it could generate bad XML in certain cases
