- Fix: Deleting a workspace no longer revokes the application user's privileges on the system database. The revoke statements applied to the connected database rather than to the workspace being deleted, so afterwards authentication failed with
permission denied for table users(superuser deployments, the default, were unaffected). Workspace databases are now removed with a singleDROP DATABASE ... WITH (FORCE)and the system-database cleanup runs in one transaction. To repair an already-affected install, connect to the system database and runGRANT ALL ON ALL TABLES IN SCHEMA public TO <db_user>;plus the same forALL SEQUENCES(#396) - Fix:
templates.createandtemplates.updateno longer crash the request when theemailobject omitsvisual_editor_tree. Validation called a method on the missing tree and panicked, so the connection was dropped and API clients behind a reverse proxy saw a bodyless502 Bad Gateway; such payloads now return400naming the missing field and pointing to the code-mode alternative (editor_mode: "code"withmjml_source). Also applies to per-languagetranslationsentries (#401) - Fix: Applying preview text to a template whose MJML already contains a self-closing
<mj-preview />, or anmj-previewcarrying attributes, no longer injects a second preview element. Only the plain<mj-preview>form was recognised, so the other two shapes were treated as "no preview present" — the attribute form shipped two preheader blocks with the stale text still in the first, and a bare<mj-preview />(which anmj-liquidblock can emit) was duplicated instead of filled. Both shapes are now matched, attributes are preserved, and a self-closing tag is expanded in place (#394) - Fix: Preview text containing Liquid no longer breaks sends for code-mode templates, and preview or title text that renders to a value containing
<or>no longer fails compilation. Code-mode templates escaped the preview text before rendering it, so a feed value containing&(e.g. a "News & Updates" subject) aborted the whole send with an XML parse error, and Liquid comparisons such as{% if a > b %}silently evaluated the wrong branch because the operator had been entity-encoded. Separately,<and>were escaped with named entities that the MJML parser decodes back into markup before parsing, so anmj-previewormj-titleblock whose Liquid resolved to a value containing angle brackets failed to compile (#394) - Fix: Liquid in a template's Preview Text is rendered again at send time for visual-editor templates whose body has no
mj-previewblock — the common case for console-built templates. The preview text was spliced into the MJML after Liquid processing had already run, so expressions like{{ global_feed.subject }}reached recipients literally in the inbox preview text; the injected value is now rendered through Liquid first, and malformed Liquid in preview text surfaces as a compile error instead of being sent raw. Rendered preview values containing<,>or&no longer break the send either: the injected text is escaped with numeric character references, which survive MJML parsing where the named</>entities are decoded back into markup (#394)