Skip to main content
A render is not one engine. The worker inspects the published version’s content and dispatches to one of three pipelines. They are not interchangeable: loops and dynamic images only work on some. Choose the pipeline when you author the template, because it determines what your data can actually produce.

How the pipeline is chosen

PipelineSelected whenEngine
PDF overlaythe template’s templateType is pdf-overlaypdfme fields on an uploaded base PDF
Document modethe content is a block layout (a pages array)@react-pdf/renderer
Canvas (Handlebars)otherwise (canvas/section content)Handlebars → HTML → Puppeteer
templateType is surfaced on GET /v1/templates/:slug. The split between document mode and canvas is decided by the stored content shape, which depends on how the template was authored.

Capability matrix

CapabilityDocument modeCanvas (Handlebars)PDF overlay
Scalar variables
Loops / arrays (repeating table)❌ none❌ fixed fields only
Dynamic images from data❌ static src only✅ data-bound✅ data-bound (image field)
Signature image❌ (signature block is text-only)✅ via an image variable✅ via an image field
Variable-length tables
Best fordesigned block documentsdata-heavy docs with repeating rowsfilling a fixed PDF form
Document mode has no loop primitive and no data-bound images. A loop declared in the manifest binds at the API but renders nothing in document mode, and an image variable has no data-bound block to render it. The builder’s repeatable / table toggles are authoring hints only — they do not iterate at render time.

Choosing a pipeline

You need a repeating table (e.g. line items, inspection areas)

Author on the Canvas (Handlebars) pipeline. It is the only pipeline that iterates a loop into repeated rows. See Variables & loops.

You need a dynamic / signature image

Use Canvas (bind an image variable) or PDF overlay (an image field). See Images & signatures.

You are filling a fixed, pre-designed PDF form

Use PDF overlay — upload the base PDF and stamp typed fields (text, image, QR) onto it.

It is a designed block document, no arrays

Document mode is the simplest and the default of the modern builder.
Migrating a template from canvas content to a document-mode block layout removes loop and dynamic-image support. If a template relies on either, keep it on the canvas pipeline.