Hello Apostrophe Community!
Apostrophe 4.30.0 is a focused maintenance release: bug fixes, accessibility improvements, and security patches with no new features. It is also the first release under our new release model.
A New Release Cadence
Starting with this release, ApostropheCMS ships on a predictable two-track schedule designed to make upgrades safer and more manageable, particularly for teams running production sites with multiple stakeholders.
Monthly maintenance releases focus on bug fixes, security patches, and accessibility improvements. As a strong default, they will not introduce UI changes or new features — so they are generally safe to apply without workflow disruption. Occasionally, when a missing capability constitutes a significant enough gap in the UX that we consider it a bug, we may include a targeted correction. We'll flag those clearly when they occur.
Quarterly feature releases will group related work into coherent, themed sets with advance communication before they ship. The next quarterly release is scheduled for June 10, 2026, with a theme of Developer Activation.
And starting with our June release, the new two-track release plan will allow teams to decide whether to follow our latest releases in production, or receive those one quarter later while continuing to get bug fixes and security fixes in the meantime. This will allow dev teams to more fully evaluate “latest” while production remains on “stable.” We are still finalizing the technical approach for how teams will manage which track they are on, and will share that guidance ahead of the June release. In the meantime, npm update continues to work as it always has.
This model came directly out of feedback from enterprise teams who need to be able to apply a security patch without absorbing an unannounced UI change, and who need enough advance visibility into upcoming features to plan their own work. We think it will benefit teams of all sizes.
A new roadmap
As part of our new release cadence, we’ve also shared a clearer roadmap to upcoming quarterly feature releases. As always you can also submit and upvote possible features. Let us know what you think.
Layout Widget: Editor Control Over Gap
Previously, the spacing between items in a layout widget grid could only be set by a developer in module code. Editors can now control it themselves through the styles system, either site-wide via a global layoutGap preset, or per widget via a gap styles field. A new className option also allows developers to attach additional CSS class names to the widget's grid container for more flexible styling. This improvement applies to both standard Nunjucks-based projects and projects using the Astro integration. Note that, as always, developers must explicitly add this feature to their sites if they want it.
Accessibility Improvements
This release includes a focused round of fixes to bring the admin UI into closer compliance with accessibility guidelines, covering ARIA semantics, screen reader support, and labeling across the navigation bar, locale switcher, and admin bar controls. The @apostrophecms-pro/doc-template-library and @apostrophecms-pro/section-template-library modules also received improved tooltip labels.
Security Updates
This release includes six security fixes across apostrophe core, sanitize-html, launder, and @apostrophecms/cli. We encourage all users to upgrade promptly.
This release addresses:
- XSS vulnerabilities via the
xmptag insanitize-html, which could pass forbidden markup through the sanitizer even whenxmpwas not explicitly permitted; via a malicious full name containing HTML executed in the page title tooltip, exposing other users to XSS; and viajavascript:URLs in the image widget link field, exploitable by any user with editing privileges including contributors — a database migration is included to strip any such URLs already present - Server-side request forgery in the rich text widget's HTML import feature, which could be used to probe internal networks or exfiltrate images from internal hosts. Image imports from external hosts are now opt-in via the new
imageImportAllowedHostnamesoption on@apostrophecms/rich-text-widget. Note that this means you must configure these new options if you are using the API-based HTML import feature withimgelements. - An email phishing vector in the password reset feature, which could be used to send emails containing links to arbitrary external sites. The password reset feature now requires
baseUrlorAPOS_BASE_URLto be set before it will operate (this is automatic in multisite projects). This only affects projects withpasswordReset: trueenabled on the login module - Shell injection in
@apostrophecms/cli, where passwords or starter kit URLs containing malicious punctuation could be used to run arbitrary shell commands in scripted use
Thanks to Vincenzo Turturro, Muhammad Uwais (two issues), SPIDY, Nitro13urn, Yiğit Şengezer, and Sainithin0309 for reporting these vulnerabilities.
Additional Fixes
- The layout widget now correctly regains full focus when switching back to Edit content mode
- Keyboard shortcuts for widget operations (copy, cut, paste, duplicate, remove) no longer intercept the browser's native clipboard behavior when no widget is focused — previously, logged-in users found that selecting and copying text on a page was blocked by the admin UI
- Illegal HTML
idattribute values generated by the admin UI have been corrected - A duplicate
<meta charset>tag has been removed fromouterLayoutBase.html; the charset is now consistentlyutf-8(the legacy configuration option is ignored, asutf-8is the only legal value per spec) - Orderable table array items no longer drag the entire floating window
apostropheandoembetterhave been updated to remove a number of services that formerly supported oembed for the general public but no longer do so. While there is no active security risk today, removing these eliminates potential XSS attack vectors should those domains ever lapse. Developers can further prune this list using the newminimumAllowlistandminimumEndpointsoptions on the@apostrophecms/oembedmoduleaposResponseerrors are now logged server-side in the Astro process- Dependencies in
@apostrophecms/clihave been bumped to close vulnerabilities inuuid,fast-xml-parser, andshelljs. The first two were not used in a sensitive or vulnerable way within ApostropheCMS; theshelljsvulnerability would only be exploitable if a developer could be convinced to enter malicious commands as CLI input - The
xmptag could be used to pass forbidden markup throughsanitize-html, even whenxmpitself is not explicitly allowed. This was fixed bysanitize-html 2.17.4and a dependency bump to ensure it is used inapostrophe. - Manual links in the image-widget were vulnerable to XSS. This was fixed by the use of the url field type, a database migration to clean up any existing XSS, and (for defense in depth) upgrades in
launderto ensure it uses the same high-quality URL sanitization employed bysanitize-html.
Community Contributions
We're grateful to the contributors who helped make this release possible. Sainithin0309 flagged the oembed long-term security concern that led to this cycle's cleanup. Harouna Traore contributed the aposResponse error logging improvement to the Astro integration.
You should upgrade
This release contains important security fixes and we encourage all users to upgrade promptly with npm update. Let us know what you think on our roadmap.
🚀 Happy coding!