Bucharest Sprint 2025 - Report

Bucharest Sprint 2025 - Report

March 24 -28, 2025 in Bucharest.

The Bucharest Sprint 2025 took place between 24 and 28 March at Eau de Web’s headquarters in Bucharest, Romania, gathering 20+ contributors from 9 countries and multiple cities across Romania. The event brought together a dynamic mix of Plone core developers, senior integrators, junior developers, and designers, collaborating both on-site and remotely.

Participants joined from Romania, Germany, Italy, the Netherlands, Sweden, Spain, Brazil, India, and the USA, representing different backgrounds and skill levels, which enriched the quality and diversity of contributions. The sprint focused on key areas such as Plone 6.2 polishing, Volto 19 improvements, and early planning for Plone 7 frontend Volto’s successor (codenamed “Seven”). Throughout the week, work was done across 30+ repositories, including PLIPs, bug fixes, new features, onboarding sessions, and architectural discussions. Remote participants engaged via daily standups, shared voice/video channels, and open collaboration tools.

We would like to thank the Plone Foundation for their continued support of community events like this sprint. We’re also grateful to the broader Plone community and the companies that enable and support their team members to contribute.

This report summarizes the main outcomes, technical impact, and collaborative spirit of the event.

Attendees

  • Alec Ghica – Romania
  • Alin Voinea – Romania
  • Ana Oprea – Romania
  • Armin Stroß-Radschinski (remote) – Germany
  • Claudia Ifrim – Romania
  • Dana Comișelu – Romania
  • David Ichim - Romania
  • Érico Andrei – Brazil
  • Ionuț Dobricean – Romania
  • Mack Palomäki – Sweden
  • Maik Derstappen – Germany
  • Narcis Chirilov – Romania
  • Nilesh Gulia (remote) – India
  • Piero Nicolli – Italy
  • Rob Gietema - the Netherlands
  • Steve Piercy (remote) – USA
  • Teodor Voicu – Romania
  • Tiberiu Ichim – Romania
  • Valentina Bălan – Romania
  • Victor Fernandez de Alba – Spain
  • + others

Photos & website

Seven

Piero, Rob, David, Tiberiu, Alin and Víctor were working on Seven these days. They manage to settle up things and cover most of the discussions that were set to happen. Discussions took a good amount of time, as used to happen in these events. The following topics were covered:

  • i18n support
  • Splitting the public UI and the CMS UI
  • Theming
  • Naming and placement of add-ons
  • Form libraries
  • Global state manager
  • Improvements to the client
  • Block model v3
  • Plate.js
  • Documentation

i18n support

It was decided to use i18next library and integrate it in the current branch. Piero was working on this one, and managed to finish a first working implementation. We decided to not pollute the @plone/components basic components with it, so a “driver” will always pass the i18n information to the components. In case of more complex components (like, Login), then these will be allowed to rely on the hooks of i18next to pass down the i18n information.

Piero was working on making this happen.

Splitting the public UI and the CMS UI

This topic is high in the wish list of things to improve in current Volto. This will give us the ability to deploy a simple, lightweight and thin public build of a website without the burden of all the components of the CMS UI.

It was decided to have a single app (Seven) that is able to load the CMS UI on demand. Since the CMS UI will be co-located in the @plone/cmsui add-on, then building without it is easy. There is a Makefile command that takes care of running Seven with only the public UI (make start-publicui) and another that runs Seven with both (make start). 

For now, we foresee these deployment scenarios:

  • Public UI only

  • Public UI and CMS UI (Volto model)

  • Public UI and CMS UI in different builds

We will focus on the first and the second one for now, but keeping an eye on making the third possible.

A new package was created @plone/publicui to have all the components and public routes for the public UI.

Theming

Once the above was settled, it was time to decide on the theming. Another long standing wish, high up on the list, is the ability to use any Design System or CSS framework of choice, without it clashing with the CMS UI or vanilla theme styles.

In a public UI only scenario, this has to be fairly easy to remove all existing styling, then use your own. In the other scenarios, we need a way to scope the CMS UI styling and that the vanilla theme is also scoped or thin enough that it does not interfere with the public UI styling.

This can be achieved leveraging modern CSS techniques and @layer CSS directive. One of the premises of @plone/components and the vanilla theme is that their styling will be “barebones”, very thin and simple enough to sum up your styling above easily or even remove them and use just your own styling.

After several discussions, and studying several proof of concepts, it was decided to test drive a model having Tailwind as baseline for both the public and the CMS UI. The fundamental changes happened in Tailwind version 4 embracing CSS instead of fighting with it, the use of @layer and the ability to use the cascade in a normal way, are some of the reasons that drive this choice.

The current state of the add-on @plone/theming already implements this approach, and we already have some Tailwind version of the components in @plone/components.

react-aria-components has supported Tailwind since the very beginning, and it’s their recommended choice of styling their components. It’s planned to keep the current version of @plone/components components using CSS for styling, along with a new set of Tailwind only components, so you could choose which one to use depending on the project and requirements you might have.

David, Piero, Víctor were working in this one.

Naming and placement of add-ons

These are the current list of add-ons for Seven and the Plone’s frontend modular architecture:

Core

  • @plone/types

  • @plone/client

  • @plone/components

  • @plone/registry

Utilities

  • @plone/helpers

  • @plone/providers

  • @plone/react-router

Add-ons

  • @plone/blocks

  • @plone/cmsui

  • @plone/publicui

  • @plone/slots

  • @plone/theming

Form libraries

It was also discussed which form library we should embrace. Some of the candidates:

  • react-hooks-form

  • @tanstack/form

Some proof of concepts were done and tried out.

Tiberiu was working on this subject.

Global form state

It was decided not to introduce any global form state, and try to use the framework capabilities as long as it is possible. In case we need a global state at some point, it was decided that we will use jotai.

Piero, Víctor and Tiberiu were working on it.

Improvements and refactor of @plone/client

@plone/client is the JavaScript client for accessing programmatically to Plone REST API resources. It was conceived to have also a layer of integration with @tanstack/query, a very popular library that takes care of everything when having to make requests to an asynchronous layer in React. However, the new unified model of acquiring data in React 19 and how React frameworks leverage it has changed so dramatically that using this library of this kind no longer has the importance that it used to have. 

Rob was working on refactoring the @plone/client in order to remove all the @tanstack/query artifacts from the code base. He managed to do so, and now the client is simpler and more approachable.

There was also work on the side of integrating the @plone/client documentation in the Plone REST API one, by providing another tab to the existing ones. Asko Soukka is working on it, and hopefully we will have a working version soon, so we can start documenting the API there too.

Alin was working on a proof of concept using the new client in Ionic, with good results. He could show up content in an Ionic app with little effort.

Block model v3 (improvements of the block style preview in edit mode)

David was working on validating the upcoming block model v3, which aims to improve the block style preview in edit mode. He also had several talks with Dante discussing things about the implementation and solving questions.

Plate.js

Tiberiu was working on a proof of concept for replacing the slate block with the Plate.js implementation. He also proposed a couple of ideas worth exploring that might improve the overall authoring user experience. We will continue exploring them in the upcoming sprints.

Documentation

Steve and Víctor were working on moving the Seven documentation to the root of the docs folder, and started on the rationalization of the new docs, using Diataxis. Some other polishments were done in that direction, more to come in the next few weeks.

Some documentation on how to install Seven was done. You can find the first version in:

General progress

Seven is being developed in this branch:

The public ui is functional, you can navigate through content and the basic blocks are displayed (Slate, Image, Teaser) with minimum styling. You can find a deployed public UI only demo:

And compare it with the Volto version of the same site:

Work on the CMS UI side was done also. There is an initial implementation of the login form and a minimum edit form that can edit a title of a content object.

Plone 6.2

A lot of work was done in the Volto 19, and Plone 6.2 side. The work on 19 was started by cutting a new branch for maintaining Volto 18: 18.x.x The first merges of breaking PRs were done to the main branch.

Cookieplone

Érico was working in Cookieplone and its templates, removing pre-commit from it and working on general improvements.

plone-repo-helper

Érico was also working on this new package that will ease the management of repositories for add-ons, projects and distributions that have a frontend and backend code.

plonecli and playwright integration in Plone Classic UI

Maik was working on this subject, improving the plonecli and the playwright integration for Python fixtures in Plone Classic UI.

plone.api improvements

Érico, Steve and Ujjwal Kala (ujsquared) worked in plone.api:

Prefix path

Nilesh and Claudia worked in a polished implementation of the work done in other related PRs in the past.

Auto save feature

Ionuț Dobricean started revisiting the auto-save functionality due to some conflicts. He was working on adapting what Tiberiu Ichim implemented two years ago to Volto’s new structure. 

Removal of moment.js

Teodor Voicu was working on the completely removal of moment.js 

Focus steal from Title block

Ana Oprea was trying to find the cause of this bug. She managed to hunt it down: 

Improvements of the Link widget

Dana Comișelu was working on improving the link chooser widget in slate: 

Wrong grey box overlay on drag and drop

Narcis Chirilov was working and hunted down the issue with the gray box from dnd that appears with the wrong style and in the wrong place in horizontal scroll.

Cookieplone Documentation

Armin Stroß-Radschinski was working on the review of cookieplone-template documentation_starter and a successor to inject docs boilerplate in existing projects.

Image preview in object browser

Ionuț Dobricean was working on the:

Add plone.navtitle behavior to content types

Ana Oprea worked on:

Remove Title block as required

Narcis Chirilov created a PR for the title block being required.

Code block improvements

Ionuț Dobricean worked on the code-block and I found a solution in the View to render the language highlight when needed using prism-react-renderer.

NickCMS

Rob was working on improving nick, specially in the implementation of the new @inherit endpoint of Plone REST API. He also was working on being able to consume Nick resources from a BfF (Backend for Frontend) perspective. Since the new frontends allow us to consume backend resources directly from the Node world directly without leaking backend only libraries to the browser side, it seems like a good feature that Nick can provide.

Mack Palomäki was working in Swedish translations for Nick and Volto. After that, he is working in an AI powered way to improve and complete the existing translations for both Plone and Volto. He was in touch with Mikel Larreategi to find a way to integrate this new approach into the existing translation workflow. The results are quite impressive and promising! 

Mack also wrote a short write up summarizing his very first experience attending a Plone sprint.

Presentations

Piero presented Seven and how React Router 7 works to the attendees.

Víctor presented the attendees with his usual updated presentation on the Plone’s frontend modular architecture and Plone 7 Roadmap:

Érico presented the new features in Cookieplone and plone-repo-helper:

Maik presented the latest improvements in plonecli and playwright integration in Plone.

Víctor presented the latest features of VLT 6.0.0 (in alpha) and new the through the web site customizations:

Alec showed up pas.plugins.eea enumeration plugin for pas.plugins.authomatic:

Piero and Víctor presented a primer on Tailwind 4 and its goodies and how Plone can take advantage of it.

Documentation

Steve and others worked on documentation and documentation infrastructure.

Conclusion

In summary, it was a very successful sprint where many topics and discussions were covered. A huge progress was made in the Plone 7 and Plone 6.2 side. Many features and bugfixes were addressed and will be ready soon. We had newcomers that did amazing work and also youngsters that started with Plone not long ago that also provided useful insights and fresh air to the project.

As a final remark, Mack also wrote a short write up summarizing his very first experience attending a Plone sprint. Thanks a lot Mack for the amazing work and for attending the sprint! A pleasure to have you and looking forward to the next time!

More images from the Bucharest Sprint 2025 can be found on flickr.