Payload CMS Release: 3.33.0

Tag Name: v3.33.0

Release Date: 4/4/2025

Payload CMS LogoPayload CMS

Payload CMS is a modern, self-hosted headless content management system built with TypeScript, Node.js, and MongoDB. It's designed specifically for developers who want full control over their content management system while maintaining a powerful admin interface for content editors.

TL;DR

Payload CMS v3.33.0 brings significant UI improvements with enhanced rich text diffing in version views, optimized form state rendering (up to 96% smaller and 75% faster), and improved drag-and-drop experience for orderable tables. The release also includes important GraphQL enhancements, database fixes for both MongoDB and PostgreSQL, and several new features for the Drizzle and UploadThing integrations.

Highlight of the Release

    • Improved Lexical rich text diffing in version views with HTML-based comparison
    • Significant form state rendering optimization (up to 96% smaller and 75% faster)
    • Enhanced drag-and-drop experience for orderable tables with new drag overlay
    • Better GraphQL type safety with improved non-nullability in query result types
    • Fixed PostgreSQL and MongoDB database issues

Migration Guide

No breaking changes were introduced in this release, so no migration is required.

If you're using the UploadThing storage adapter and want to configure the upload router input, you can now do so via the clientUploads.routerInputConfig property:

import { uploadthingPlugin } from '@payloadcms/plugin-cloud-storage/plugins/uploadthing';

const uploadthingStorage = uploadthingPlugin({
  // other config...
  clientUploads: {
    // Set custom upload limits or other router config
    routerInputConfig: {
      maxFileSize: '1GB',
      maxFileCount: 5
    }
  }
});

If you're using GraphQL with code generation tools, you may benefit from the improved non-nullability in query result types, which could reduce the need for type guards and optional chaining in your code.

Upgrade Recommendations

This release contains significant performance improvements and bug fixes without introducing breaking changes, making it a recommended upgrade for all Payload CMS users.

The form state rendering optimizations are particularly valuable for sites with complex forms containing arrays or blocks with rich text fields or other server components, as they can dramatically reduce network payload sizes and improve performance.

Content editors will benefit from the improved rich text diffing in version views and the enhanced drag-and-drop experience for orderable tables.

Developers using GraphQL will appreciate the improved type safety with better non-nullability in query result types.

To upgrade, simply update your Payload CMS version to 3.33.0:

npm install [email protected]
# or
yarn add [email protected]
# or
pnpm add [email protected]

Bug Fixes

GraphQL Joins and Draft Status

Fixed an issue where GraphQL queries weren't respecting draft: true when querying joins, while the Local API and REST API were working correctly.

PostgreSQL Database Fixes

  • Fixed an issue where down migrations would fail because migrationTableExists wasn't checking in the current transaction
  • Fixed a problem where null values would break orderable hooks, causing unique constraint errors
  • Fixed deleteOne operation failing when the where query doesn't resolve to any document

MongoDB Relationship Querying

Fixed an issue with MongoDB where querying relationships with multiple conditions in a where clause as an object would only respect the latest condition.

UI and Form State Improvements

  • Fixed an issue where optimistic rows would temporarily disappear while form state requests were pending
  • Fixed ValidationError error messages when using a function for field labels
  • Fixed a problem where the doc input was being appended for scheduled publish jobs even when only enabled for globals

Custom Password Fields

Fixed an issue that prevented using custom password fields when disableLocalStrategy: true was set.

New Features

Enhanced Rich Text Diffing in Version Views

The version comparison view for Lexical rich text fields has been completely redesigned, replacing JSON-based diffing with HTML-based diffing. This makes it much easier to spot changes between versions, showing a clean visual diff instead of lengthy JSON.

Improved Drag-and-Drop for Orderable Tables

A new DragOverlay component has been added to the OrderableTable, providing a more fluid drag-and-drop experience when reordering collection items. This prevents clipping issues when dragging outside table bounds and eliminates unnecessary scrollbars.

Drizzle Query Builder Exports

The buildQuery and parseParams functions are now exported from @payloadcms/drizzle, giving developers more flexibility when working with the Drizzle database adapter.

Configurable UploadThing Router

The UploadThing storage adapter now supports configurable upload router input configuration via clientUploads.routerInputConfig. The default upload limit has been increased to 512MB.

Improved GraphQL Type Safety

GraphQL query result types now have improved non-nullability, making several fields and list item types non-nullable where appropriate. This reduces the need for type guards and optional chaining in generated code.

Security Updates

No specific security fixes were mentioned in this release.

Performance Improvements

Form State Component Rendering Optimization

A significant optimization has been made to the form state component rendering strategy, resulting in up to 96% smaller network responses and 75% faster processing when manipulating array and block rows containing server components.

Previously, when working with array and block fields, all rows would render any server components that might exist within them (like rich text fields), even if they didn't need to be updated. This caused unnecessary re-rendering and increased network payload sizes.

The new approach ensures that only fields being manipulated are rendered, rather than all rows. This is especially beneficial for fields with many rows, where each row might contain complex server components like rich text editors.

In testing with 100 array rows each containing a rich text field, form state requests were reduced from 1.9MB to 80KB (96% smaller) and processing time dropped from 266ms to 70ms (75% faster).

Impact Summary

Payload CMS v3.33.0 delivers substantial improvements to the user experience and developer workflow without introducing breaking changes.

For content editors, the standout features are the completely redesigned rich text diffing in version views, which makes comparing changes much more intuitive, and the enhanced drag-and-drop experience for orderable tables. The significant performance improvements in form state rendering will be especially noticeable when working with complex forms containing arrays or blocks with rich text fields.

For developers, the release offers better GraphQL type safety, fixes for database issues in both MongoDB and PostgreSQL adapters, and new exports from the Drizzle adapter. The UploadThing storage adapter now supports configurable upload router input, with an increased default upload limit of 512MB.

System administrators will appreciate the performance optimizations that reduce server load and network traffic, particularly the form state rendering improvements that can reduce response sizes by up to 96% and processing time by up to 75%.

Overall, this is a solid quality-of-life release that improves performance, fixes bugs, and enhances the user experience without requiring any migration effort.

Full Release Notes

v3.33.0 (2025-04-04)

🚀 Features

  • drizzle: export buildQuery and parseParams (#11935) (f34eb22)
  • graphql: improve non-nullability in query result types (#11952) (018bdad)
  • next: improved lexical richText diffing in version view (#11760) (d29bdfc)
  • storage-uploadthing: configurable upload router input config (#11954) (f9c73ad)
  • ui: use drag overlay in orderable table (#11959) (816fb28)

🐛 Bug Fixes

  • postgres null value breaks orderable hook (#11997) (9adbbde)
  • allow custom password field when using disableLocalStrategy: true (#11893) (8ad22eb)
  • ValidationError error message when label is a function (#11904) (dc793d1)
  • do not append doc input for scheduled publish job if it's enabled only for globals (#11892) (760cfad)
  • db-mongodb: querying relationships with where clause as an object with several conditions (#11953) (857e984)
  • db-postgres: deleteOne fails when the where query does not resolve to any document (#11632) (4ebd3ce)
  • db-postgres: down migration fails because migrationTableExists doesn't check in the current transaction (#11910) (f310c90)
  • graphql: respect draft: true when querying joins (#11869) (e5690fc)
  • storage-uploadthing: pass clientUploads.routerInputConfig to the handler (#11962) (8e93ad8)
  • ui: optimistic rows disappear while form state requests are pending (#11961) (8880d70)

⚡ Performance

  • ui: significantly optimize form state component rendering, up to 96% smaller and 75% faster (#11946) (e87521a)

📚 Documentation

📝 Templates

  • set packageManager pnpm version for vercel templates (#11992) (b76844d)

🏡 Chores

🤝 Contributors

Statistics:

File Changed176
Line Additions7,504
Line Deletions1,330
Line Changes8,834
Total Commits27

User Affected:

  • Improved visual diffing for Lexical rich text fields in version views, making it easier to spot changes
  • Enhanced drag-and-drop experience with orderable tables using a new drag overlay
  • Faster form state rendering, especially when working with arrays and blocks containing rich text fields
  • Fixed issue where optimistic rows would temporarily disappear during form state requests

Contributors:

r1tsuuAlessioGrGermanJabloakhrarovsaidreivjacobsfletchjmikruttonytkachenkopaulpopusDanRibbensdenolfe