v3.73.0 (2026-01-23)
🚀 Features
- next.js 16 support (#14456) (18ca83b)
- db-sqlite: add
busyTimeoutoption (#15317) (0c235c3) - db-sqlite: add WAL mode support (#15278) (3357aa6)
- drizzle: predefined migration for
blocksAsJSON: true(#15257) (1b7b13d) - live-preview: expose requestHandler arg to hooks (#15302) (4f3c31f)
- plugin-mcp: adds select API with CRUD tools (#15301) (268b33a)
- ui: use native useEffectEvent if available (#15304) (f0458fb)
Feature Details
🔥 Next.js 16 Support - Full compatibility with Next.js 16, including Turbopack HMR and build support. Requires Next.js >16.1.1-canary.35 or 16.2.0+. Templates will be updated after Next.js 16.2.0 is released. Support for cache components will follow in a future release #14456
WAL Mode Support (db-sqlite) - Enable SQLite Write-Ahead Logging for improved concurrent read/write performance. Configurable synchronous mode and journal size limit. #15278
Busy Timeout Option (db-sqlite) - Set maximum wait time in milliseconds when the database is locked, preventing SQLITE_BUSY errors in high-concurrency scenarios. #15317
Predefined Migration for blocksAsJSON (drizzle) - Migrate existing projects to use blocksAsJSON: true with a single command. Automatically updates your Payload config and generates the required migration. #15257
pnpm payload migrate:create --file @payloadcms/db-postgres/blocks-as-jsonRequest Handler in Live Preview Hooks (live-preview) - The useLivePreview hook (React and Vue) now accepts a requestHandler argument, allowing customization of data fetching. Useful when your frontend proxies requests or uses external middleware. #15302
Select API for MCP Tools (plugin-mcp) - Find, Create, and Update tools for Globals and Collections now support the select API, reducing token usage and aligning with Payload's existing query capabilities. #15301
Native useEffectEvent (ui) - Uses React's native useEffectEvent when available (React 19.2.0+), falling back to the existing polyfill for older versions. #15304
🐛 Bug Fixes
- select hasMany prevent duplicate values (#15218) (f4e8990)
- orderable fractional indexing case-sensitivity issue with PostgreSQL (#14867) (ef27ad9)
- find distinct sort on a different field (#15233) (e95f26d)
- conditional tabs breaking in Next.js 16 due to unstable tab id (#15270) (f5a7a00)
- correct previousValue and value in afterChange when using seo-plugin (#15253) (b6b6bab)
- db-mongodb: fix projection handling for relationship fields in GraphQL queries with select (#14850) (ace3447)
- drizzle: d1 sqlite IN querying of
idwhen any other join is present in the query (#15290) (4f5a9c2) - next: relationship fields with maxDepth: 0 show "Untitled - ID" in diff view (#15305) (65238c5)
- plugin-mcp: auto-detect basePath from Payload config routes (#15189) (dbc06f6)
- richtext-lexical: internal links render as href="#" in versions view (#15308) (ab4102c)
- sdk: correct return types with
select(#15289) (db40d7b) - ui: diff view columns have unequal widths for nested fields causing text misalignment (#15330) (db72a65)
- ui: upsertPreferences did not return preferences when creating new preferences (#15321) (94d5728)
- ui: pass the locale to reorder endpoint in orderable table (#14839) (d6bb3de)
📚 Documentation
- add jsdocs to query presets api (#15306) (3dbaed8)
- small md fix (#15299) (9a1eb77)
- remove csv as a language for code blocks (#15265) (259eac4)
📝 Templates
⚙️ CI
🏡 Chores
- removes never implemented readDrafts access arg on globals (#15297) (12b679f)
- export fractional indexing utilities (#15286) (02800b0)
🤝 Contributors
- Sasha (@r1tsuu)
- Patrik (@PatrikKozak)
- Alessio Gravili (@AlessioGr)
- Kendell (@kendelljoseph)
- David Murdoch (@dsm23)
- Rafau (@RafalFilipek)
- Aaron Claes (@AaronClaes)
- Jarrod Flesch (@JarrodMFlesch)
- German Jablonski (@GermanJablo)
- Elliot DeNolf (@denolfe)
- Jens Becker (@jhb-dev)
- Paul (@paulpopus)
- Vladyslav Prosolupov (@vladyslavprosolupov)
- Jessica Rynkar (@jessrynkar)