Skip to content

Changelog - June, 2026

New Features

DigitalOcean Spaces Storage

You can now connect DigitalOcean Spaces as your own storage provider, alongside the existing AWS S3, Google Cloud Storage, and Cloudflare R2 options. Because Spaces is S3-compatible, uploaded images and cropped files are stored in your own bucket and served from your own endpoint.

Why It Matters

Custom storage keeps your users' assets inside infrastructure you control, which supports data residency, cost, and vendor-consolidation requirements. Adding DigitalOcean Spaces means you can use it directly instead of introducing a separate provider to back the editor's file storage.

How To Enable

Follow the step-by-step DigitalOcean Spaces tutorial, which walks you through creating the bucket, collecting your region, Origin Endpoint, and access keys, and wiring them into your Plugin settings.

Grammar & Spelling Check

A new Check grammar action uses AI to fix spelling, grammar, and punctuation in a text block without changing its meaning, tone, structure, or formatting. It's available from the AI context menu on a selected text block. The check works in whatever language the text is written in: the template does not need to be multilingual, and corrections are always made in the text's own language.

Why It Matters

Unlike Improve or Rephrase, which can rewrite your copy, Check grammar is a conservative pass that only corrects mistakes and leaves the wording intact. It provides a quick proofreading step directly in the editor.

How To Enable

The action uses the same OpenAI integration as the AI Assistant, so no additional setup is required if you already have the AI Assistant configured.

Merge Tag Names in the Canvas

When using the Tiptap text editor, the new showMergeTagText option lets Merge Tags display their human-readable name in the editor canvas instead of their raw value. For example, it shows First name rather than *|FIRST_NAME|*. The name is resolved from your existing merge tag catalog at display time, so it works no matter how the tag was inserted and always reflects the current catalog.

Why It Matters

Raw merge tag syntax is precise but hard to read at a glance, especially in a template full of placeholders. Showing the human-readable name makes the canvas easier to scan. The exported HTML is unchanged, since the tag still serializes to its raw value.

How To Enable

This is opt-in and defaults to false. It requires the Tiptap text editor, so set textEditor: "tiptap" and enable it inside the tiptapConfig object in your TOPOL_OPTIONS:

ts
textEditor: "tiptap",
tiptapConfig: {
  showMergeTagText: true,
},

For full details, please refer to the documentation.

Product Feed Translation

Translation now covers the Product block in static mode. Until now, translating a multilingual template left hand-picked product content in the source language. Each language mutation can now carry its own version of a product feed, so the content chosen for each language is the content that renders.

Why It Matters

Product-driven emails were previously the one place where multilingual templates fell short, since product content stayed in the source language regardless of the mutation. Each language now gets its own product content, resolved per product: keep the same product and translate its text, or replace it with a different product for that language. The two are never mixed, so a translated slot never pulls stray data from another product.

How To Enable

Nothing new to configure. As long as Multilingual Templates and the Product block are set up, static product feeds are translated along with the rest of the template.

Improvements

Custom Editor Font

You can now change the font used across the editor interface with the new font option in your theme. By default the interface uses Inter; you can point it at any font family and, if needed, load the font from a stylesheet URL. This affects only the editor's own UI, not the fonts available inside your templates.

Why It Matters

Setting the interface font lets the editor match your application's typography, so the embedded Plugin looks consistent with the product around it rather than using a separate typeface.

How To Enable

Add the font object to your theme configuration. Both keys are optional and work independently:

ts
theme: {
  font: {
    family: "Georgia",
    url: "https://fonts.googleapis.com/css2?family=Georgia&display=swap",
  },
},

If you pass a single family without a fallback, sans-serif is appended automatically. For full details, please refer to the documentation.

Border Radius Theming

The theme now exposes a borderRadius object for adjusting how rounded the editor's interface corners are. Each key is optional and accepts any valid CSS border-radius value as a string, from soft rounding down to "0" for fully sharp corners.

Why It Matters

Corner rounding is a small but visible part of a design language. Being able to set it lets you align the editor's appearance with the rest of your application, from soft rounded corners to fully squared-off ones.

How To Enable

Add the borderRadius object to your theme configuration:

ts
theme: {
  borderRadius: {
    default: "4px",
  },
},

For full details, please refer to the documentation.

Granular Role Permissions

Roles and permissions can now be fine-tuned with a new permissions object. Each role still ships with its own sensible defaults, but you can override individual capabilities on top of them. For example, you can keep everything an editor can do but prevent them from deleting files. The supported overrides are canLockBlocks, canLockSections, canEditLockedSections, canEditLockedBlocks, and canRemoveFiles.

Why It Matters

Previously, each role was a fixed bundle of capabilities, so adjusting a single one meant switching to a more restrictive role and giving up its other permissions. Per-permission overrides let you adjust individual capabilities on top of a role without changing the rest.

How To Enable

Add the permissions object alongside the role in your TOPOL_OPTIONS. Any key you omit keeps the role's default:

ts
role: "editor",
permissions: {
  canRemoveFiles: false,
},

For full details, please refer to the documentation.

onImageDelete Callback

A new onImageDelete callback fires when a user removes files or folders from the image picker. It receives an array of the deleted items, each describing its name, type (file or folder), path, and key, so your host application can react, for instance by cleaning up the same assets in your own media library.

How To Enable

Add the handler to the callbacks object in your TOPOL_OPTIONS:

ts
callbacks: {
  onImageDelete(items) {
    // items: { name, type, path, url?, key }[]
  },
},

The callback is purely additive; deletion works exactly as before when no handler is registered.

Improved Multilingual Template Translation

Template Translation received several related improvements for multilingual templates:

  • Choose the source language. Previously, translating a mutation always re-used that mutation's own content and never picked up edits made in the primary. Each mutation's translate button now has a source picker, so you can translate from the primary language or from any other mutation. Translating from the primary stays a single click.
  • Translate every language at once. A new Translate all button in the language settings translates all mutations from the primary language in one action, instead of triggering each one by hand. It's available by default, with a confirmation step before existing translations are overwritten.
  • Reliable on large templates. Translation now processes content in chunks, so even big multilingual templates translate without hitting request limits.

Why It Matters

Choosing the source language means edits made in any mutation, not just the primary, can be used as the basis for translating the others. Bulk translation removes the need to trigger each language separately, which is especially useful for templates with many language mutations.

How To Enable

No configuration beyond the existing Template Translation setup is required. The source picker appears next to each language mutation's translate action, and the Translate all button appears in the language settings, both by default.

Bugfixes

  • Fixed an issue where template typography styles (for headings, paragraphs, links, and lists) were not applied to HTML inserted through Merge Tags, because those styles were only added inline to markup that existed at render time.
  • Fixed text selection and caret placement in button blocks when using the Tiptap text editor: drag-selecting a button's text no longer deselects on release, and clicking into the middle of the text no longer jumps the caret to the end.
  • Fixed a bug where typing into the Tiptap toolbar inputs (the text color, background color, and font-size fields) lost focus after the first character, sending the rest of your keystrokes back into the text block.
  • Fixed a 500 error from get-html when a multilingual template contained a language entry without a translations object, which surfaced in the editor as "Error occurred while generating preview."