White labelling
Two layers can be white-labelled independently: the documents your users produce and the editor they use.
Documents
Give each customer a theme. Store one template; render it with the customer's theme:
await renderPdf({ template: quarterlyReview, data, theme: themesByTenant[tenantId] });Everything that should vary per customer belongs in the theme: colours, fonts, logo, and meta (company name, regulatory strings, addresses, phone numbers) which templates read as {{ theme.meta.company }}. Nothing tenant-specific needs to live in the template.
The editor
features.whiteLabel = true hides the BroadPaper mark in the toolbar. The editor's chrome is themed through CSS custom properties on the .bpe root, so you can restyle it to match your product:
.bpe { --bpe-accent: #7c5cff; --bpe-font: "Your Sans", system-ui, sans-serif; --bpe-radius: 4px; }appearance: "dark" | "light" | "system" switches the built-in palettes.
Other feature flags let you shape the experience per plan or per role:
| Flag | Hides / disables |
|---|---|
pdfExport | Export menu |
themes | Theme switcher |
customBlocks | Custom blocks in the palette |
library | Reusable content panel |
styleOverrides | Per-block style overrides (keeps everything on-brand) |
pageSettings, documentStyles, headerFooter | Document-level settings |
layers, dataPanel, validation, jsonView, expressions | Individual panels and power features |
Locked nodes (locked: true) cannot be moved or deleted, which lets a template owner fix a disclaimer or header in place while others edit the body.