v3.87.0

cloudflare/pingorav3.87.0Jul 31, 2026by denolfe

AI Summary

A feature and bug fix release for Payload CMS focusing on storage capabilities (Azure), UI enhancements (tabs and localization), and database stability (MongoDB and Drizzle).

Key Highlights

  • Azure storage client uploads now support files larger than 5GB.
  • Fix parent localization through tabs to maintain context.
  • Replace `image-size` with `image-dimensions` dependency for upload dimensions.
  • Fix Prefect tool-call cache keys to prevent collisions on `RunContext` fields.
  • Plugin-multi-tenant now applies tenant on confirmation.

New Features

  • Handle null values in arrays and blocks (v3 backport).
  • MongoDB error handling for null values in arrays and blocks.
  • Vercel blob storage now allows overwriting existing blob keys.
  • UI improvements: handle undefined field admin components.
  • Documentation updates for exported TypeScript type helpers.

Full Release Notes

## [v3.87.0](https://github.com/payloadcms/payload/compare/v3.86.0...v3.87.0) (2026-07-31)


### πŸš€ Features

* **storage-azure:** client uploads with chunkLargeFiles can now support files larger than 5gb ([#17319](https://github.com/payloadcms/payload/issues/17319)) ([3c00a39](https://github.com/payloadcms/payload/commit/3c00a39))

### πŸ› Bug Fixes

* preserve parent localization through tabs 3.x ([#17591](https://github.com/payloadcms/payload/issues/17591)) ([9c8d636](https://github.com/payloadcms/payload/commit/9c8d636))
* replace image-size with image-dimensions dependency for upload dimensions ([#17571](https://github.com/payloadcms/payload/issues/17571)) ([2a99a01](https://github.com/payloadcms/payload/commit/2a99a01))
* forward locale in count and countGlobalVersions (3.x) ([#17547](https://github.com/payloadcms/payload/issues/17547)) ([e042561](https://github.com/payloadcms/payload/commit/e042561))
* pass id to delete access control on soft delete in updateByID ([#17529](https://github.com/payloadcms/payload/issues/17529)) ([a539f5b](https://github.com/payloadcms/payload/commit/a539f5b))
* prefer draft titles in by folder view ([#17412](https://github.com/payloadcms/payload/issues/17412)) ([ef8a6a5](https://github.com/payloadcms/payload/commit/ef8a6a5))
* arrays and blocks should handle null values, v3 backport ([#17278](https://github.com/payloadcms/payload/issues/17278)) ([2a69863](https://github.com/payloadcms/payload/commit/2a69863))
* **db-mongodb:** error on null values in arrays and blocks ([#17190](https://github.com/payloadcms/payload/issues/17190)) ([249f8df](https://github.com/payloadcms/payload/commit/249f8df))
* **drizzle:** validate companion table name length against 63-char limit ([#17563](https://github.com/payloadcms/payload/issues/17563)) ([fd629f2](https://github.com/payloadcms/payload/commit/fd629f2))
* **drizzle:** dedupe reused localized block tables ([#17430](https://github.com/payloadcms/payload/issues/17430)) ([3e8191c](https://github.com/payloadcms/payload/commit/3e8191c))
* **plugin-multi-tenant:** apply tenant on confirm ([#17350](https://github.com/payloadcms/payload/issues/17350)) ([09e01df](https://github.com/payloadcms/payload/commit/09e01df))
* **storage-vercel-blob:** allow overwriting existing blob keys ([#17385](https://github.com/payloadcms/payload/issues/17385)) ([fc2572e](https://github.com/payloadcms/payload/commit/fc2572e))
* **templates:** prevent unauthenticated draft-mode access in website preview route ([#17472](https://github.com/payloadcms/payload/issues/17472)) ([0c2e9a8](https://github.com/payloadcms/payload/commit/0c2e9a8))
* **templates:** mark website button as client component for radix-slot context ([#17474](https://github.com/payloadcms/payload/issues/17474)) ([981b282](https://github.com/payloadcms/payload/commit/981b282))
* **ui:** resolve named-tab field permissions in bulk edit field select (3.x backport of #17523) ([#17524](https://github.com/payloadcms/payload/issues/17524)) ([2371624](https://github.com/payloadcms/payload/commit/2371624))
* **ui:** keep folder create drawers open during autosave ([#17421](https://github.com/payloadcms/payload/issues/17421)) ([bf72bda](https://github.com/payloadcms/payload/commit/bf72bda))
* **ui:** handle undefined field admin components ([#17388](https://github.com/payloadcms/payload/issues/17388)) ([5157c72](https://github.com/payloadcms/payload/commit/5157c72))

### πŸ“š Documentation

* remove deprecated root endpoint property ([#17570](https://github.com/payloadcms/payload/issues/17570)) ([6402daa](https://github.com/payloadcms/payload/commit/6402daa))
* accessibility banner fix ([#17431](https://github.com/payloadcms/payload/issues/17431)) ([29dd43c](https://github.com/payloadcms/payload/commit/29dd43c))
* fix link in live preview dynamic url section ([#17340](https://github.com/payloadcms/payload/issues/17340)) ([cc81ef0](https://github.com/payloadcms/payload/commit/cc81ef0))
* document exported TypeScript type helpers for plugins ([#17336](https://github.com/payloadcms/payload/issues/17336)) ([d4d029f](https://github.com/payloadcms/payload/commit/d4d029f))
* **plugin-mcp:** fix broken Claude Code link ([#17502](https://github.com/payloadcms/payload/issues/17502)) ([21e24ca](https://github.com/payloadcms/payload/commit/21e24ca))

### πŸ§ͺ Tests

* **richtext-lexical:** create dev user first in seed to fix flaky e2e (3.x backport of #17507) ([#17568](https://github.com/payloadcms/payload/issues/17568)) ([0f6c1b3](https://github.com/payloadcms/payload/commit/0f6c1b3))

### βš™οΈ CI

* remove --json from pnpm publish to fix release hang on pnpm v11 ([#17279](https://github.com/payloadcms/payload/issues/17279)) ([4a82c20](https://github.com/payloadcms/payload/commit/4a82c20))

### 🏑 Chores

* export parse params and related sanitizers ([#17314](https://github.com/payloadcms/payload/issues/17314)) ([f14722a](https://github.com/payloadcms/payload/commit/f14722a))

### 🀝 Contributors

- Dan Ribbens (@DanRibbens)
- Paul (@paulpopus)
- Patrik (@PatrikKozak)
- Nate Lentz (@nathanlentz)
- Kacper Zawojski (@zawoj)
- Marc Maceira (@marcmaceira)
- Jarrod Flesch (@JarrodMFlesch)
- Sean Zubrickas (@zubricks)
- Raşit Akyol (@rasitakyol)
- Jessica Rynkar (@JessRynkar)
- Elliot DeNolf (@denolfe)