Weblog
Guido Stevens: Living Software for a Living World
Talk by Guido Stevens at Plone Conference 2025 in Jyväskylä, Finland.
I read the GoF (Gang of Four) book 'Design Patterns'. When I read what it says about the adapter pattern, which I use every day in Plone, it just takes the fun out of it. Overabstraction is wrong. If humans can't understand a pattern or architecture, it is wrong.
Book 'A Pattern Language', 1977. Much different from the GoF book. More inspired by Christopher Alexander. More human.
In 2000-2004 I was using PHP, with test driven development, full version control. 2007-2010: Plone 2.1, 2.5, with TTW skins, which had no tests and no version control, so a step back. But the ZCA (Zope Component Architecture) came. This has several of the Design Patterns: Interface, Adapter, Utility (Singleton), Subscriber (Observer). Some others might be useful, like Strategy.
I used to completely specify Interfaces, which is how it is intended. But nowadays they are mostly just marker interfaces, which work because they serve as hooks into the ZCA.
Before adapters there was excessive polymorphism. Just look at the CatalogTool in Products.CMFPlone, and try to follow its multiple inheritance. You can overdo it. With adapters you have separation of concerns. You create an adapter that gets the UID from an object. And you create a utility that resolves the UID into an object.
Subscriber (Observer): a subject broadcasts event. It has no knowledge of its subscribers. These subscribe to events, and execute some code on it.
We have actor, action, context: an editor publishes a news item. And this sends 5000 notifications via email, and the editor needs to wait. That does not scale. So we need a notifications sub system. Alessandro is the technical architect and lead developer here. We log the 'published' event in an SQL database, and then the transaction is done.
Then we schedule notifications. Here we use the Chain of Responsibility pattern: for each logged event, for each channel, for each category, for each recipient: if channel is active for category and recipient: store the notification in SQL.
Then we dispatch the notifications. For some we will send emails, for some we send them later in a digest email.
Christopher Alexander, mentioned before, wrote 'The Nature of Order'. There are lots of patterns, but you can condense it to 15 structural patterns. Structure preserving presentations, process, time. Inspired by nature, fractals.
How do we apply this to the software challenge we have? In Quaive we have a Calendar app. This has notifications. This is implemented in adapters and subscribers. Same for other apps. Same pattern. So we have the notifications framework that does the heavy lifting, this is the trunk. And then we have the apps (leaves or branches) that use the patterns. So developers can zoom in on the business logic in a single app, and forget about everything else.
Object reuse was the 1995 Patterns goal. But now we have frameworks, that coordinate reuse. It is not not import library, but you make you of the code flow in the framework.
Plone rocks. It is a community that makes a framework and a framework that makes a community.
Lightning talks Thursday
Lightning talks on Thursday at Plone Conference 2025 in Jyväskylä, Finland.
Mari: Social skills in Finland
Today's lesson: use of personal space. An internet meme is that Finnish people need a lot of personal space. There have been actual academic studies around this: it is actually a thing! You have high contact cultures and low-contact cultures. Finland has 16 people per square kilometer, India has over 400.
Herman Melville: "We cannot live only for ourselves. A thousand fibers connect us with our fellow-men."
If a Fin steps back from you in conversation, do not see it as an insult, just a different culture.
Plone Sponsorships
First: if you have not voted for the Plone Foundation Board elections, do so, if you are a member.
There have been a lot of sprints today. And these are the things where most of the money of the foundation goes to. So sponsoring Plone is important. See https://plone.org/foundation/sponsorship
We have drafted a new sponsorship program, and hope to start with it soon. We will contact all current sponsors.
Thomas Lambert: How to integrate +100 different themes
SmartWeb is a Plone application to help municipalities in Belgium to manage their website. By now more than 100 websites in production. Each website has its own layout/theme. Our graphic designer creates a Figma layout, together with the municipality. We use Barceloneta inside a base theme. Then pnpm with some custom CSS for each site.
Maurits van Rees: SFIA skills framework
SFIA is the global skills and competency framework for the digital world. See https://sfia-online.org/ This is a client of Zest Software, and I work for them via my own company Py76. A few days ago I found out that they recently started sponsoring Plone, so that is nice, and I thought I would present their website here. It is a Plone 6.1 Classic UI site, using Mosaic.
The SFIA framework defines skills on levels between 1 and 7. An organisation can use this to see where a team is missing skills. Maybe a team needs someone with a Programming/software development skill at level 4. You can use the text on this site as basis for a job offering. Or you see that the team already has someone with this skill on a lower level, and they could grow with some training. As individual you can look at which skills you have and at which level you are using it. You can look what the responsibilities and expectations are on the next higher level. Or find a list of related skills that may be interesting for you.
The stack is: CloudFlare, Apache, Varnish, 2 zeo clients, a zeo server. We only very recently added Varnish. It seemed fine enough without it, and we had CloudFlare. But by default CloudFlare basically only caches CSS, JS, images. No html, unless you configure it differently. And then AI bots started querying the site, causing slow responses. So we added Varnish and this helped.
It is a multilingual site, translated into 13 languages. Does anyone here have more languages in a site? No.
But how do you edit a Japanese page as editor if you can’t read Japanese? CodeSyntax has made an add-on for this: cs.adminlanguage. This is only active when you are logged in as Editor. Messages in the plone domain are not translated, so important parts of the UI are in English.
Every three years they release a new version of their skills framework. This is prepared in English. Then we export this as XML. This gets uploaded to an external service where it gets translated in the other languages, partially by human translators, but AI or translation memories are getting a larger role. Then we import it and create the new content in Plone.
There is also a control panel to create an html export. You select an image, a title, optional extra css, and select the content to export and the language. Then you click the button to generate the html. And more importantly you can generate a PDF. This uses the same HTML, and transforms it with Prince, which is installed on the server.
They are nice people to work with, so thank you Peter, Ian, and Lucy!
Rob Gietema: New Volto form block
The current form block uses custom widgets. Would be nicer to reuse existing ones. Reuse the backend with some minor changes. Provided wrappers with the logic that is needed for the form, so you can use "dumb" custom widgets where needed. You can specify a custom form component.
Piero Nicolli: 42
If you want to use the under development Seven project today, you can, but you currently need to use Volto for the editing. So I made a package in the collective on the name fortytwo (Seven times Plone 6).
Antoine Duchene: Document generation in Plone 6
Some metrics: we produce around 110 thousand documents per month across all our business apps. Roughly 2500 templates in the wild. The engine is the Appy framework, relying on LibreOffice. We made collective.documentgenerator. Version 4 works on Plone 6 (Classic UI). Already used in production at iMio. Manageable LibreOffice templates TTW with specific content types.
Luna: Website builder distribution
Based on Volto. Demo.
Johannes Raggam: bssp
We will have another Buschenschanksprint (bssp) in 2026. This is in Austria. Topic of course Plone, Classic UI, Volto, but you can bring your own topics. I organise apartments so people can sleep there. You can of course book your own if you want a more private sphere. The Buschenschank is a traditional restaurant with cold plates with cheese and sausage and such.
Tuesday 26 to Sunday 31 May 2026. You can already register.
Philip Bauer: Is it awesome?
You have probably created awesome add-ons. But have you "awesomed" it? Register it in our awesome lists:
- For Plone backend / Classic UI: https://github.com/collective/awesome-plone
- For Volto: https://github.com/collective/awesome-volto
Mathias Leimgruber: Plone 6 Classic UI - A Success Story
Talk by Mathias Leimgruber at Plone Conference 2025 in Jyväskylä, Finland.
I am a full stack dev, over 15 years of experience with Plone, attended several conferences around 2010, and I never thought I would own a company. Fun fact: I immigrated during Covid to the US, to join my lovely wife!
I founded webcould7 in April 2022, in Lucerne, Switzerland, together with Christoph Brütsch. We wanted to build and ship an actually standardized product. Release management: 4 times a year.
Problem: we are a new, small company, upgrades for some Plone 4 and 5 clients were urgent, I am not a designer, and how to deploy?
We chose Plone 6 Classic UI. We had pressure to go to market fast, and I had experience with the Classic UI. We could focus on the backend, and have content be created there. And then the rest api as interface to the world. This way we can have a slower release cycle on the backend, and the frontend can move faster. The frontend is 100% geared to the customer, and backend to the content creators. I begin with TTW content types, and some Python Scripts, to get a quick start.
Why not Volto? For e a steep learning curve: React, Next, new design patterns. Volto is good for wysiwyg, but that is not important for me at all. We wanted a different UI for editors and visitors.
We have our product: 7inOne. In the theme we only changed the color, so it is pretty standard Plone. If anything is changed in core, we get it quickly.
We made a Page Builder. Using grid from Bootstrap, and add blocks in there. Similar structure to Volto, really. I implemented a Trash option. Since we don't have wysiwyg, we have a preview split screen so you can see how it looks. Also mobile preview.
I have built a working copy / versioning variant. I could not use plone.app.iterate for various reasons. You can ask multiple co-editors for reviews.
PDF with weasyprint.
External API integration. You can load data from an external API. Stores results in a Dexterity field, or in Redis. Json only. You can tell it how often it should load data automatically.
We use collective.elasticsearch. We added an endpoint @es-search if you want to explicitly search there in the normal Plone way. Implemented @raw-search endpoint where you basically send raw elastic search queries, except that we add allowedRoledAndUser=[] as security measure.
We use pas.plugins.oidc for SAML/oidc authentication. And wcs.samlauth.
Then we want to improve performance:
- With Py-spy we can make flamegraphs to see what is happening.
- We made opinionated improvements to the REST API, some internal caching (navigation), automatically prevent recursive "expands", always disable diazo (so the transforms), auto apply a sort_limit to queries where possible.
- Cache as much as possible.
We use Redis and RQ Python for async and scheduled tasks.
It is all built on Kubernetes, and using CloudFlare.
The backend and API are on different sub domains. Backend is only for authenticated users.
For some clients we do the frontend ourselves, for others there is a third party. We give them the Plone REST API documentation, with some extra guidelines:
- Do not use
expandfor@navigationand@contextnavigation. - Dedicated frontend routes for search, dashboards, etc, with limited caching.
- Implement a small client to handle redirects and status like 404 and 500
baselland.ch was the first customer with which we went live with this system. In 1 year the frontend had no downtime. The backend 45 minutes, due to a Kubernetes upgrade and some CloudFlare issues. Total of 29 releases installed. From Plone 6.0 beta to 6.1.2.
For all clients the backend is always the same (7inOne). Just the configuration differs.
Some of the challenges:
- Performance of the Kubernetes cluster, it remains a bit of a mystery to me. Storage I/O speed, especially catalog access is slow after a restart.
- There is one developer for the backend: me. I'm always right... Only one opinion, no diversity.
- Testing: where to start and where to stop.
Lessons learned:
- The Plone REST API is great. Its documentation is awesome.
- Using Plone as a headless CMS works.
- Technical documentation are usually too late, but AI helps.
- Not everything needs to be automated, even though I love to do that, it is not always worth the time.
- Kubernetes: the ZODB needs fast storage, use physical servers (cheaper)
- Get help! I should have asked other people first in some cases.
- Caching, caching, caching. Try to cache everything and invalidate.
Erico Andrei: Create Your Next Conference Site With Plone
Talk by Erico Andrei at Plone Conference 2025 in Jyväskylä, Finland.
The website for PyCon Brasil in 2006-2010. This used a package called Products.PyConBrasil, developed by Dorneles Tremea, Jean Ferri, Erico Andrei. Archetypes based. We had registration forms (you don't need Google Forms for that, come on), call for papers, certificates. 7 content types, workflows. We would improve this year after year for the next conference. Simples Consultoria would come up with a new theme.
PythonBrasil 2011 plus Plone Symposium South America. I had separate packages for each part. Dexterity based. Support for multiple conference editions.
PloneConf 2013. Problem: multilingual, Plone people from all over the world do not all speak Portuguese. Dexterity based, and with Grok.
Plone Conf 2020-2023. Copy-paste-rinse-repeat. Covid happened, so we needed an online conference. Every conference: a repo on github.com/plone. Classic then, later upgraded to Volto. Features: Speaker, Talk, Training, Keynote, Sponsor. In 2022: a schedule block (created by Affinitic). Talk submission: via Google Forms. Registration with TiTo (2022, 2023).
PloneConf 2024: copy-paste plus crazy ideas. Registrations with Eventbrite. Call for Proposals: with Pretalx. So some new blocks needed. Change some colors in the theme. But we wanted Volto Light Theme. Last minute "requirements": online experience, "My schedule", training registrations and certificates, attendee check-in.
I got personally involved with 3 distinct conferences this year. Easy, right, because I got all this experience just a few months before. Copy the Plone Conference code, change some colors, put it live, in uder two hours. It worked! March: copy-paste for Plone conference here. Also fine. But then Python Cerrado conference: this had some more challenges. More frontend and backend add-ons needed. How can I find time and energy to do anything on my own? But: okay, just do it. In 4 days from cookieplone to collective.techevent reality.
So: no longer copy-paste, but use this add-on as base. Not from scratch.
- Code: https://github.com/collective/tech-event, which is a mono repo.
- Backend: collective.techevent (Plone add-on) provides content types, behaviors, and REST endpoints (e.g., /@schedule, /@sponsors).
- Frontend: @plone-collective/volto-techevent (Volto add-on) provides the UI: views, blocks, schedule, sponsors, listings, etc.
Asko Soukka is the main driving force behind tech-event: working-copy support, performance fixes, revamped schedule block to be able to handle even six parallel talks.
Wish list:
- Registration:
- I want an Attendee content type with Membrane.
- Check-in
- Integration with Presenter profile
- CfP (workflow and permissions)
- "My schedule" / bookmark / calender export
- "Smart" talk materials listing, embedding
- Training life cycle: registration, certificates
How to do: create new project with cookieplone, add kitconcept.voltolighttheme and collective.techevent to backend, some to frontend.
Other events would benefit: World Plone Day, Plone Tagung.
I am releasing collective-techevent 1.0.0b1 right now in this presentation.
Fred van Dijk: Communicating complexity
Talk by Fred van Dijk at Plone Conference 2025 in Jyväskylä, Finland.
This talk is a long analogy about maintaining and customizing a large web portal.
My father for a long time was cleaning tap installation in bars. I saw both groggy bar owners and Chinese restaurant owners and personnel. Cultural differences.
In the Netherlands, Chinese restaurants are tailored to Dutch tastes, often including some Indonesian tastes. How do you start? You get a building, a kitchen, a dining area, a bar, a takeway. You need to decorate it. You need personnel. He learns that he cannot just build on his own tastes, but needs to adapt to Dutch tastes.
He starts, two months later the city closes the parking lot for reparations, people need to park further away, so less customers. So: challenges, but it works. Food inspection has some comments, gives a fine, but he improves.
But everything has to work all the time, 7 days a week. Kitchen, waitress, bar tender, both takeaway and restaurant, etc.
After a few years he needs to do some maintenance, renovations. But business is slowing down, the people have tasted the food enough, have seen the fishes, there is another nice restaurant. So: a make over. New dishes, extra cooks because he wants to prepare food at the table. Take away in a more separate area. The owner stays as the face of the restaurant, is always there. And it works, he doesn't go bankrupt.
The end.
Let's disect this analogy. This is running a website, what I have been telling you for the past 20 minutes.
The website is the dining area. Or the take away area with the restapi. The building is the hosting environment. There are rules (food inspection). The food is the content. Who are the waiters? The editors. The tables and chairs are the software. Kitchen is backend, dining area is frontend. Website needs to be restyled every few years. So if you have an enterprisey website, you are a restaurant manager. And you don't have everything under control, you have to change with the times. You cannot stay with Python 2 and yarn, you need to go to Python 3 and pnpm.
What we try to pull off, is doing 8 to 10 things together. A website is not easy, it is as complex as a restaurant.
BTW, the restaurant is the Rose Garden in Barneveld.
