Plone 6.1.4 released

Release notes for Plone 6.1.4 (2026-01-15)

If you want to jump straight in, here are some important links:

Highlights

These are the main changes since 6.1.3:

  • plone.app.upgrade: Fix upgrading TinyMCE plugins with invalid/outdated plugins.
  • plone.exportimport: Implement regular commits to reduce memory usage in larger import processes.
  • Updated robotframework related versions, used in acceptance testing.
  • plone.app.multilingual: Adds the volto.blocks behavior to LRF if plone.volto is installed.
  • plone.namedfile: Add default width and height attributes if none provided when using the srcset method.
  • plone.scale: Handle animated WebP images.
  • plone.staticresources: Update mockup=5.4.6. See Release Release 5.4.6 · plone/mockup · GitHub.
  • plone.volto: Support collective.html2blocks to convert HTML to Volto blocks as a replacement for blocks-conversion-tool.
  • plonetheme.barceloneta: Add a bit more separation between the menu and the search field in the mobile menu.

Volto frontend

The default frontend for new Plone 6 sites is Volto.
Note that this is a JavaScript frontend that you need to run in a separate process with NodeJS.

Plone 6.1 is meant to be used with Volto 18.
Latest release is 18.32.0. See the changelog.
You can already test with the latest Volto 19 alpha version.

Classic UI

The HTML based and server side rendered UI that was present in Plone 5.2 and earlier major Plone releases is still available and has also been updated and improved upon in Plone 6.0 and 6.1. Our documentation now refers to this frontend as 'Classic UI'.

Python compatibility

This release supports Python 3.10, 3.11, 3.12, and 3.13.

pip, buildout, setuptools

In Plone core we use these versions to install Plone:

packaging==25.0
pip==25.3
setuptools==80.9.0
wheel==0.45.1
zc.buildout==4.1.12

In general you are free to use whatever versions work for you, but these worked for us.
Note that if you use Buildout and are on setuptools 80+, you need the latest zc.buildout 4.1.12.

If you use zc.buildout, you can also choose to upgrade to version 5.x.
That helps avoid problems when not all packages in a namespace are using the same namespace style.
When using either zc.buildout or pip (or uv) you can also choose to install the horse-with-no-namespace package.
Plone 6.2 (under development) already uses both.

Let's explain why you may want to do this.
Problems start when you have multiple packages in the same namespace, that use different namespace implementations.
Then on startup of Plone you may get an error saying "Package not found".
This depends on what you use to install the packages.
In the following examples, we have two packages in the same namespace, say ns.native (using native namespaces) and ns.deprecated (using pkg_resources style).

  • Make editable installs of both packages (pip install -e or in buildout, develop =):

    • This works neither in pip nor in buildout.
    • You can install the horse-with-no-namespace package to get this working.
  • Make a normal install of both packages:

    • This works fine in pip.
    • This fails in buildout 4.x.
    • This works fine in buildout 5.x.
  • Make a normal install of one package and an editable install of the other:

    • This works fine in pip.
    • This fails in buildout 4.x.
    • This fails in buildout 5.x as well. But again, you can use horse-with-no-namespace to get this working.

For more explanation, see the zc.buildout 5 readme, the part about
"native namespaces and breaking changes in 5.x". This is also good to read if you use pip instead of Buildout.

Installation

For installation instructions, see the documentation.

Issues

If you find any issues, please report them in the main issue tracker.

7 Likes

At the same time, I have made the first alpha release of Plone 6.2! Proper announcements will be made in due time, but if all you need are the versions or constraints, you can already find them here:

4 Likes

hmm…I upgrade a sandbox from 6.1.3 to 6.1.4. I have an init script that does no longer work. requirements.txt has been updated. horse-with-no-namespace is installed

(zopyx.surveyjs) ➜  zopyx.surveyjs git:(master) ✗ bin/instance run scripts/init_plone.py
🐎 This Python (/home/ajung/src/zopyx.surveyjs/.venv/bin/python3) uses horse-with-no-namespace to make the following pkg_resources namespace packages compatible with PEP 420 namespace packages:
  zc

/home/ajung/src/zopyx.surveyjs/.venv/lib/python3.12/site-packages/horse_with_no_namespace/pkg_resources.py:54: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
  import pkg_resources
🐎 This Python (/home/ajung/src/zopyx.surveyjs/.venv/bin/python3) uses horse-with-no-namespace to make the following pkg_resources namespace packages compatible with PEP 420 namespace packages:
  zc

WARNING:GenericSetup.componentregistry:The object None was not found, while trying to register an utility. The provided object definition was portal_metadata. The site used was: <PloneSite at /demo>
WARNING:GenericSetup.componentregistry:The object None was not found, while trying to register an utility. The provided object definition was portal_syndication. The site used was: <PloneSite at /demo>
WARNING:GenericSetup.componentregistry:The object None was not found, while trying to register an utility. The provided object definition was portal_undo. The site used was: <PloneSite at /demo>
WARNING:Products.MimetypesRegistry.MimeTypesRegistry:Redefining mime type text/plain (<class 'Products.MimetypesRegistry.mime_types.mtr_mimetypes.text_plain'>)
WARNING:Products.MimetypesRegistry.MimeTypesRegistry:Redefining mime type application/msword (<class 'Products.MimetypesRegistry.mime_types.mtr_mimetypes.application_msword'>)
WARNING:Products.MimetypesRegistry.MimeTypesRegistry:Redefining mime type text/xml (<class 'Products.MimetypesRegistry.mime_types.mtr_mimetypes.text_xml'>)
WARNING:Products.MimetypesRegistry.MimeTypesRegistry:Redefining mime type text/x-python (<class 'Products.MimetypesRegistry.mime_types.mtr_mimetypes.text_python'>)
WARNING:Products.MimetypesRegistry.MimeTypesRegistry:Redefining mime type application/octet-stream (<class 'Products.MimetypesRegistry.mime_types.mtr_mimetypes.application_octet_stream'>)
WARNING:Products.MimetypesRegistry.MimeTypesRegistry:Redefining mime type application/rtf (<class 'Products.MimetypesRegistry.mime_types.mtr_mimetypes.application_rtf'>)
WARNING:Products.MimetypesRegistry.MimeTypesRegistry:Redefining mime type text/html (<class 'Products.MimetypesRegistry.mime_types.mtr_mimetypes.text_html'>)
Traceback (most recent call last):
  File "/home/ajung/src/zopyx.surveyjs/parts/instance/bin/interpreter", line 348, in <module>
    exec(_val)
  File "<string>", line 1, in <module>
  File "scripts/init_plone.py", line 315, in <module>
    api.addon.install("zopyx.surveyjs")
  File "/home/ajung/src/zopyx.surveyjs/eggs/decorator-5.2.1-py3.12.egg/decorator.py", line 235, in fun
    return caller(func, *(extras + args), **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zopyx.surveyjs/eggs/plone.api-2.5.3-py3.12.egg/plone/api/validation.py", line 73, in wrapped
    return function(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zopyx.surveyjs/eggs/plone.api-2.5.3-py3.12.egg/plone/api/addon.py", line 292, in install
    return installer.install_product(addon)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zopyx.surveyjs/eggs/Products.CMFPlone-6.1.4-py3.12.egg/Products/CMFPlone/controlpanel/browser/quickinstaller.py", line 311, in install_product
    self.ps.runAllImportStepsFromProfile("profile-%s" % profile_id)
  File "/home/ajung/src/zopyx.surveyjs/eggs/Products.GenericSetup-5.0.0-py3.12.egg/Products/GenericSetup/tool.py", line 393, in runAllImportStepsFromProfile
    result = self._runImportStepsFromContext(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zopyx.surveyjs/eggs/Products.GenericSetup-5.0.0-py3.12.egg/Products/GenericSetup/tool.py", line 1504, in _runImportStepsFromContext
    message = self._doRunImportStep(step, context)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zopyx.surveyjs/eggs/Products.GenericSetup-5.0.0-py3.12.egg/Products/GenericSetup/tool.py", line 1316, in _doRunImportStep
    return handler(context)
           ^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zopyx.surveyjs/eggs/plone.app.registry-2.0.7-py3.12.egg/plone/app/registry/exportimport/handler.py", line 79, in importRegistry
    importer.importDocument(body)
  File "/home/ajung/src/zopyx.surveyjs/eggs/plone.app.registry-2.0.7-py3.12.egg/plone/app/registry/exportimport/handler.py", line 125, in importDocument
    self.importRecords(node)
  File "/home/ajung/src/zopyx.surveyjs/eggs/plone.app.registry-2.0.7-py3.12.egg/plone/app/registry/exportimport/handler.py", line 351, in importRecords
    interface = resolve(interfaceName)
                ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ajung/src/zopyx.surveyjs/eggs/zope.dottedname-6.0-py3.12.egg/zope/dottedname/resolve.py", line 46, in resolve
    __import__(used)
ModuleNotFoundError: No module named 'plone.base.interfaces.resources.IBundle'; 'plone.base.interfaces.resources' is not a package

thats not in plone.base, only plone.base.interfaces.resources.IBundleRegistry

Invalid…there was some AI-generated culprit in my repo :slight_smile:

I see that I have accidentally included plone.app.drafts 3.0.0. This has native namespaces. The version should have remained at 2.0.0. If you use zc.buildout 5 or you install everything with pip, the new version should work fine. Otherwise you should update the version pin / constraint.

This is an "ecosystem" package, and not used by default. It is one of the packages used by the "tiles" system, so you need it if you are using for example Mosaic (plone.app.mosaic).