We've designated dotCMS 23.01 our latest Long-Term Supported release. A lot has changed even since the last LTS, and we're excited to share all that we've added and improved.
And so the time has come to bombard you with reasons you should upgrade to the latest and greatest — indeed, why you should demand 23.01, apoplectic with rage, perhaps flipping a table in the process. Although we mourn our spilled coffee, we will understand completely.
And then we'll get that table bolted down. We like our Java stable and resilient.
What's New Since 22.03 LTS?
In the year or so since the release of 22.03, we've added a slew of important features. In fact, we now hold many of these as indispensable to the modern dotCMS experience.
Having a Field Day
Last May, we launched our Block Editor — a JSON-based field for authoring rich content. With 23.01, it's finally making its LTS debut.
The Block Editor can display formatted text, images, and even structured content developed through dotCMS, with fully customizable rendering. Elements are treated as individual “block” objects, making it user friendly in both traditional and headless paradigms.
Since May, the Block Editor has received steady additions and improvements, including the ability to whitelist blocks and content types, expanded image-handling options, new table blocks, automatic updating of embedded dotCMS content, and even an option to transform existing WYSIWYG Fields into Block Editor Fields. (For more information, you can read a comparison of the two fields.)
That's a tough act to follow, but save some applause for the JSON Field — another LTS premiere. The JSON Field can store properties for a widget or plugin, save information retrieved from an external API, and more. There are a lot of uses for semi-structured data out there; you may even deal with some of them on the regular. All the more reason to dig in!
API Candy
For all you headless riders, we've continued to expand our API library, building new endpoints for permissions operations, adding or updating Push Publishing filters, and full CRUD control (that is, Create, Read, Update, Delete) of Containers.
New “deep copy” methods allow you to duplicate a piece of content on a page, effectively modifying it for that one page instead of for all pages displaying it. Or, you can make a copy of a page and all content therein — essentially a “Save as Copy” function.
If you've got a large file library and dream of all the time you'd save by being able to fetch file metadata via API, then dream no more: Metadata is now exposed through our Page API, Content API, Elasticsearch API, or GraphQL.
Positive Velocitude
The newest Velocity goodies are not to be missed. In particular, the new Dotcache Viewtool — a generic object caching tool — opens a door to a world of convenient, efficient possibilities. In short, if you can assign it, you can cache it.
We've expanded our set of built-in Velocity content objects with $dotContentMap — a predefined content object for all containers, saving the step of a manual content pull. We liked this one so much, we now use it in our shortcut dialogs in the Container interface.
Field variables tend to contain important data, such as configuration options. You can even define your own custom field variables. What can you do with those? A lot, now that you can read field variables with Velocity; implement whatever behaviors you please!
Content (But Never Complacent)
There are even new ways to interact with content. We've added a simple way to copy Content Types via either traditional or headless operation. It's now trivial to use any existing content type as a template for another.
As long as we're making things more convenient, adding Custom content tools is now preposterously simple. Through the traditional interface, it's down to a push-button operation.
Content relationships have received some care, too. You can now retrieve parent content through its child's Relationship Field by using Lucene queries. And thanks to recent optimizations, related content loads faster across locales.
Finally, for those souls managing multiple sites — laboring under the heat of multiple searing and eternal suns — a small token of our esteem: On global Content Types, unique fields can be defined as unique globally or per site. Namaste.
That's All Impressive, But What Do You Have for 'Miscellaneous'?
Ah, a kindred lover of the eclectic! Let us toast our newfound camaraderie with our favorite beverage: a bulleted list.
We built a new OSGi plugin framework for loading system bundles — performant, stable, and small of footprint. It breezes across plains and woodlands alike, always two steps ahead of even our most seasoned hunters.
Key/Value Fields now allow whitelisting of keys and predefined values.
For Edit Mode Anywhere users:
The URL Override plugin's functionality has been made part of the core product. It seemed important!
EMA now works in AWS Amplify, and other hosting platforms.
We added an app supporting Prerender.io integration, for better headless SEO.
Various quality-of-life improvements, because “it's the little things”:
You can now copy image paths from Site Browser context menus.
Added a new Push Remove Now action for simpler unpublishing of pushed content.
Browser tabs are titled based on the content being edited; multitabbers rejoice!
Unless specified otherwise via environmental variable, the initial admin password now defaults to a generated unguessable value retrievable from the logs.
We've rebuilt the log viewer for improved performance and reliability.
There have been many other other performance optimizations — from more responsive macro caching and category fetching from Velocity, to faster saving procedures, to moving remote-access tools to a thread pool, and so on.
Believe it or not, this list could keep going — as the Changelogs illustrate. But the peak-end rule demands that we instead pivot to include one more extremely cool “What's New” subsection:
Work Hard, Play Hard
We've added two new “playgrounds” to the Dev Tools group.
The API Playground, powered by Swagger, is a synoptic reference to our various REST API endpoints — and also a convenient way to try them out.
The Velocity Playground is for all you Velocity heroes out there. Pining for a way to preview or debug some templating code? Then you'll want to give this a try.
Aside from being one of the best ways to learn, tinkering is also quite fun. Either of those on their own would be a fine reason to visit the playgrounds, but you've got both. Go forth and play!
Developer Notes
The last ten months saw steady movement away from repackaged libraries, which are now considered deprecated. All repackaged library support will eventually be removed; in some cases, removal has already occurred, such as with JSON-handling classes.
Significant efforts have gone into the restructuring of our codebase and our internal workflows. These have included moving toward monorepo status, such as by folding the core-web repository into core; improving our testing and diagnostic apparatus; and implementing various new automations. We're extremely pleased with the direction of these changes.
The View From Farther Back
Many of those considering an upgrade may be starting from farther back than 22.03. We see you, and we're waving vigorously, without apparent care for bystanders soaking up second-hand greetings. This section gives a (less exhaustive) sense of some of the other features and enhancements you can look forward to, on top of what's been mentioned.
For Those Running 21.06 LTS
The months from 21.06 to 22.03 were similarly transformative. They brought a new required Java version, discontinued support for Oracle databases, changes to configuration options, caching tools — bidding farewell to Hazelcast as a default component — and more. The sum of these changes was a leaner, more secure, more performant system.
Let's glance at some of the flashier new features these changes enabled — big additions with big splashes:
A brand new Template designer gives users a powerful visual tool for designing reusable page layouts.
A new Content Palette makes Edit Mode simpler and more productive — also giving an opportunity for a brand new Content Type icon library to shine.
A new History tab allows comparison between current and past versions of the same content, complete with difference highlighting.
dotCDN, now a built-in app, provides out-of-the-box CDN functionality.
New Headless Widgets can output either HTML or JSON according to context.
A new system tool allows the full-export download of your dotCMS environment at the press of a button.
New Bundle Manifests keep records of push publishing, tracking what was pushed, when and why!
Alongside these new skyscrapers in the dotCMS skyline are a slew of enhancements and quality-of-life improvements — the metaphorical city's proverbial elevators, air conditioners, and fire alarms. Maybe water fountains, too, or some appliance to fix overextended metaphors. Either way, here are a few of the bigger ones:
Environment variables! The exclamation mark is warranted, we promise: Now, just about everything can be configured through these little wonders. In a world of Docker (and similar) containers, setting options through config files is less and less practical, so let's skip those entirely!
You can now drag and drop local images or files into Pages.
Image or file fields can now define default paths, saving editors quite a bit of digging.
Field limits are gone; Content Type data is stored as JSON, now, allowing arbitrary field quantities.
The default language is now simple to change from the admin panel.
Rules can be used to rewrite URLs.
Bash scripts can be used for CI/CD.
Improved support, and more efficient caching, for GraphQL.
Various efficiency improvements: better image filters, better SVG handling, better bundle performance, new “pauseless” garbage collection resulting in less memory use over time, better content pulls, and better Velocity performance, among other gains.
For the Discerning 5.3.8 LTS User
After all of the above, could there possibly be more? Oh my, yes.
Here are just a bare handful of the features that had become standard by the time of 21.06, that would still represent new territory to 5.3.8 users:
New API endpoints for:
Working with Templates
Fetching object versions
Copying a Site
Editing Pages headlessly
Added TinyMCE customizability.
Tools show cache size estimates categorized by object and region
File-based Templates — build Templates across multiple files editable through WebDAV
A GraphQL tool in the admin panel's Dev Tools, and further GraphQL support improvements
Further numerous performance improvements and optimizations
If You've Read This Far…
Thank you sincerely. Your interest means the world to us.
If this post has shown anything, it's that a lot can change in even a year — and we can extrapolate that forward, too. Even now, new major features are in development that will grace the next LTS. But at this moment, we all feel very comfortable saying: When it comes to upgrading, there's no time like the present.
For more on technical considerations while upgrading, Upgrading — Important Changes has a succinct list.
As we continue to improve dotCMS, we hope you'll take full advantage of the many new features, tools, and time-savers we add!