Sulu 3.0: Faster content storage, simplified dependencies, and a cleaner developer experience
Sulu 3.0 is here. đđđ
This major release represents the biggest architectural shift in our CMS since version 2.0. Weâve completely rebuilt how content is stored and managed, updated key dependencies, and improved the developer experience. The numbers also tell a story: We added 153,471 lines of new code while removing 265,104. The result is a faster, more familiar system thatâs easier to debug and extend.
Letâs take a closer look at whatâs changed and why it matters for your projects.
Why we rebuilt the content storage system
When we first chose PHPCR (PHP Content Repository) for Suluâs content storage, it wasnât a mistake. PHPCR provided exactly what we needed: built-in support for hierarchical content, multilingual capabilities, versioning, and referencing. It solved complex content management problems out of the box.
But the web development landscape evolved. Database support for JSON fields matured. Doctrine ORM became more sophisticated. Most importantly, we realized that requiring developers to learn PHPCRâs SQL2 query language and unfamiliar concepts was creating unnecessary friction. Every new Symfony developer joining a Sulu project had to learn not just our CMS, but an entirely different way of thinking about data storage.
From PHPCR to Doctrine ORM with JSON fields
Our new content storage system uses JSON fields within your existing relational database, managed through Doctrine ORM entities. Instead of storing content in PHPCRâs XML-based format, everything now lives as structured JSON alongside your regular database tables.
Hereâs what this means practically: Pages, articles, and snippets are now standard Doctrine entities. You can write regular SQL or DQL queries to analyze your content, debug issues by looking directly at database tables, and use the Doctrine tools you already know.
The new system introduces âdimensionsâ to handle the complexity of multilingual, versioned, and draftable content. Each piece of content can exist in multiple dimensions simultaneouslyâdifferent languages, different publication stages, and different versions. The system automatically merges the right dimensions when rendering content, so a German page can inherit non-translatable data from the base dimension while displaying German-specific content.
For developers wanting deeper technical details, check out Alexander Schranzâs presentation From Translations to Multi-Dimension Entities, which walks through the architecture in detail.
Performance improvements and developer benefits
The performance gains are substantial. Our benchmarks show roughly double the throughput and half the latency compared to PHPCR-based storage. But speed isnât the only benefit: the developer experience has improved dramatically because everything uses familiar Doctrine patterns.
Debugging is now straightforward. When something goes wrong, you can examine the actual database tables, write test queries in SQL, and use standard database tools to understand whatâs happening. Content structure and metadata live in your Git repository as XML configuration files, not buried in database schemas.
Flysystem upgrade: More storage adapters, better flexibility
Weâve updated Flysystem from version 1 to version 3, which brings support for significantly more storage adapters. Previously, you were limited to local filesystem, AWS S3, Azure, and Google Cloud. Now you can use any adapter that Flysystem supports, including FTP, SFTP, WebDAV, MongoDB GridFS, and numerous third-party options like Dropbox, OneDrive, and various CDN providers.
This change eliminates a major deployment constraint. Whether youâre running on traditional hosting, cloud platforms, or hybrid environments, you can now store media files wherever makes sense for your infrastructure and budget.
Bundle rewrites and improvements
All bundles that depended on PHPCR have been completely rewritten from scratch. This includes the Page, Article, Snippet, and CustomURL bundles. While this means more upgrade work for existing projects, it also means these bundles now follow modern Symfony practices and integrate seamlessly with the new storage system.
If you use classes from Jackalope, PHPCR Document Manager, or the old content bundles directly in your custom code, youâll need to refactor those areas.
Article bundle liberation from Elasticsearch dependency
One of the most requested changes was making the Article bundle work without Elasticsearch. Previously, the bundle was built specifically for high-volume publishing scenarios where Elasticsearch was essential for performance. This made sense for the original use case, but it created a barrier for smaller projects or teams that didnât want to manage an additional service.
The new Article bundle works perfectly with just your database. For projects that do need Elasticsearchâs advanced search capabilities, weâve created the separate SuluArticleViewDocumentBundle that provides the same Elasticsearch integration as before.
Search system overhaul with SEAL
Weâve replaced Suluâs internal search system with SEAL (Search Engine Abstraction Layer), a collaborative project that provides unified access to multiple search engines. SEAL works similarly to how Doctrine abstracts databases or Flysystem abstracts file storage: it gives you one consistent API that works with Elasticsearch, Meilisearch, Algolia, Solr, and other search engines.
By default, Sulu 3.0 uses Loupe as the search adapter. Loupe is a PHP-only search engine that uses SQLite, created by Yanick Witschi (Toflar) from the Contao CMS project. It provides typo tolerance, phrase search, filtering, and geo support without requiring any additional services. For most Sulu installations, Loupe eliminates the need to run separate search infrastructure while still providing a much better search experience than basic SQL queries.
If your project outgrows Loupeâs capabilities (it handles up to about 50,000 documents efficiently), switching to Meilisearch, Elasticsearch, or other SEAL-supported engines requires only a configuration change.
Updated version landscape
With the release of Sulu 3.0, our version landscape has evolved. Sulu 1.6 has officially reached end of life, meaning it no longer receives any updates or security patches â if youâre still running a 1.x installation, now is the time to plan your migration path.
Sulu 2.6 is now our long-term support release, receiving security updates and critical bug fixes until Sulu 4.0 arrives. This gives teams a stable, well-maintained foundation while they evaluate their timeline for moving to the new architecture. Sulu 3.0, meanwhile, is our actively maintained current version, receiving regular updates, new features, and ongoing improvements.
Practical upgrade guidance
Upgrading to Sulu 3.0 requires more work than typical minor version updates, but weâve built tools to handle the most complex parts automatically.
Migration bundle and data conversion process
The Sulu PHPCR Migration Bundle handles converting your existing PHPCR content to the new storage format. This includes all your pages, articles, snippets, and custom URL data. The migration process preserves your content structure and translations.
The migration runs as a console command that you can test on development environments before running in production. It provides detailed logging so you can verify that all your content has transferred correctly.
Getting help: Community and professional support options
For complex migrations or custom integrations, our development services team can help assess your specific situation and handle the upgrade process. We also offer architecture reviews and consulting to help plan your migration strategy.
Our community support channels remain active as always. Join our Slack channel for real-time help, or use GitHub Discussions for longer-form questions. The Sulu community has extensive experience with migrations and is eager to help fellow developers navigate the upgrade process.
Whatâs next for Sulu
Sulu 3.0 establishes the foundation for the next generation of features weâre planning. The new content storage system makes previously difficult or impossible features much more feasible. The performance improvements create headroom for more ambitious projects.
Weâre excited to see what you build with these new capabilities. The cleaner architecture, better performance, and improved developer experience should make Sulu projects more enjoyable to work on and easier to maintain long-term.
Ready to upgrade? Start by reviewing the upgrade documentation and testing the migration process in a development environment. And remember, weâre here to help make the transition as smooth as possible!
