v3.63.0
payloadcms/payloadv3.63.0Nov 7, 2025by denolfe
AI Summary
This release introduces polymorphic uploads to reference multiple upload collections and adds a new UI option for duplicating documents in specific locales.
Key Highlights
- Polymorphic uploads for upload fields
- New 'Duplicate In [Select Locales]' UI option
New Features
- Add support for polymorphic uploads
- Adds new UI option Duplicate In [Select Locales]
Full Release Notes
## [v3.63.0](https://github.com/payloadcms/payload/compare/v3.62.0...v3.63.0) (2025-11-07)
### ๐ Features
* add support for polymorphic uploads ([#14363](https://github.com/payloadcms/payload/issues/14363)) ([df40d0e](https://github.com/payloadcms/payload/commit/df40d0e))
* adds new UI option Duplicate In [Select Locales] ([#13803](https://github.com/payloadcms/payload/issues/13803)) ([53d8557](https://github.com/payloadcms/payload/commit/53d8557))
#### **Polymorphic Uploads**
Upload fields can now reference multiple upload collections, similar to polymorphic relationships. This enables more flexible media management where a single field can accept different types of files from various collections. Works seamlessly with bulk upload and `hasMany` options. [#14363](https://github.com/payloadcms/payload/pull/14363)
```ts
import type { CollectionConfig } from 'payload'
export const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
name: 'media',
type: 'upload',
relationTo: ['images', 'documents', 'videos'], // references multiple upload collections
},
],
}
```
Can also be combined with `hasMany`:
```ts
import type { CollectionConfig } from 'payload'
export const ExampleCollection: CollectionConfig = {
slug: 'example-collection',
fields: [
{
name: 'media',
type: 'upload',
relationTo: ['images', 'documents', 'videos'], // references multiple upload collections
hasMany: true, // allows multiple uploads
},
],
}
```
### ๐ Bug Fixes
* use `TSiblingData` for `previousSiblingDoc` in `FieldHook` ([#14503](https://github.com/payloadcms/payload/issues/14503)) ([339a0c3](https://github.com/payloadcms/payload/commit/339a0c3))
* support generic types for kv.get ([#14494](https://github.com/payloadcms/payload/issues/14494)) ([f6194c6](https://github.com/payloadcms/payload/commit/f6194c6))
* group-by sticky pagination not rendering for virtual relationship fields ([#14470](https://github.com/payloadcms/payload/issues/14470)) ([648021c](https://github.com/payloadcms/payload/commit/648021c))
* ensure importMap is reliably generated during HMR (fixes Next.js 16 issue) ([#14474](https://github.com/payloadcms/payload/issues/14474)) ([61a7095](https://github.com/payloadcms/payload/commit/61a7095))
* hmr not working in next.js 16 ([#14462](https://github.com/payloadcms/payload/issues/14462)) ([0231a8d](https://github.com/payloadcms/payload/commit/0231a8d))
* disable `lockedDocuments` if the kv adapter uses a collection ([#14453](https://github.com/payloadcms/payload/issues/14453)) ([827c9a1](https://github.com/payloadcms/payload/commit/827c9a1))
* **drizzle:** postgesql where in jsonb ([#13742](https://github.com/payloadcms/payload/issues/13742)) ([207295b](https://github.com/payloadcms/payload/commit/207295b))
* **graphql:** sort by multiple fields ([#14486](https://github.com/payloadcms/payload/issues/14486)) ([b925d34](https://github.com/payloadcms/payload/commit/b925d34))
* **next:** withPayload wrapper next.js 16 support ([#14473](https://github.com/payloadcms/payload/issues/14473)) ([c0de75e](https://github.com/payloadcms/payload/commit/c0de75e))
* **next:** version._status field queried/returned for entities without drafts ([#14423](https://github.com/payloadcms/payload/issues/14423)) ([a22dff3](https://github.com/payloadcms/payload/commit/a22dff3))
* **plugin-cloud-storage:** file sizes use correct mime type ([#11633](https://github.com/payloadcms/payload/issues/11633)) ([2410296](https://github.com/payloadcms/payload/commit/2410296))
* **richtext-lexical:** prevent unnecessary requests for inline blocks ([#14522](https://github.com/payloadcms/payload/issues/14522)) ([69408f0](https://github.com/payloadcms/payload/commit/69408f0))
* **richtext-lexical:** bulk upload drawer rendered at the wrong depth if already in a drawer ([#14472](https://github.com/payloadcms/payload/issues/14472)) ([4fd8d03](https://github.com/payloadcms/payload/commit/4fd8d03))
* **ui:** virtual fields disappearing from filter/groupBy dropdowns with access control ([#14514](https://github.com/payloadcms/payload/issues/14514)) ([a3c0e84](https://github.com/payloadcms/payload/commit/a3c0e84))
* **ui:** safely access fieldPermissions ([#14458](https://github.com/payloadcms/payload/issues/14458)) ([2393721](https://github.com/payloadcms/payload/commit/2393721))
* **ui:** simplify UI orderable collections table by allowing only ascending order ([#14433](https://github.com/payloadcms/payload/issues/14433)) ([eba6cfc](https://github.com/payloadcms/payload/commit/eba6cfc))
### โก Performance
* **ui:** avoid unnecessary remounting of DraggableSortable ([#14463](https://github.com/payloadcms/payload/issues/14463)) ([91e64b3](https://github.com/payloadcms/payload/commit/91e64b3))
### ๐ Refactors
* use formatNames utility for interface name generation ([#14481](https://github.com/payloadcms/payload/issues/14481)) ([39bead7](https://github.com/payloadcms/payload/commit/39bead7))
### ๐ Documentation
* hooks terminology update ([#13847](https://github.com/payloadcms/payload/issues/13847)) ([245576b](https://github.com/payloadcms/payload/commit/245576b))
* **plugin-mcp:** clarify example ([#14325](https://github.com/payloadcms/payload/issues/14325)) ([c8d6cf0](https://github.com/payloadcms/payload/commit/c8d6cf0))
### ๐งช Tests
* use new chromium headless browser for playwright, bump playwright ([#14464](https://github.com/payloadcms/payload/issues/14464)) ([2bb5535](https://github.com/payloadcms/payload/commit/2bb5535))
* multi-tenant flake ([#14447](https://github.com/payloadcms/payload/issues/14447)) ([80d7781](https://github.com/payloadcms/payload/commit/80d7781))
### ๐ Templates
* remove payload cloud template, remove cloud plugin from templates ([#14479](https://github.com/payloadcms/payload/issues/14479)) ([76ba2df](https://github.com/payloadcms/payload/commit/76ba2df))
* remove outdated cloning and payload cloud information ([#14484](https://github.com/payloadcms/payload/issues/14484)) ([d4d9622](https://github.com/payloadcms/payload/commit/d4d9622))
### ๐จ Build
* add kv-redis to publishList ([#14416](https://github.com/payloadcms/payload/issues/14416)) ([6420927](https://github.com/payloadcms/payload/commit/6420927))
### โ๏ธ CI
* speed up workflow reruns, remove run_number from build cache key ([#14448](https://github.com/payloadcms/payload/issues/14448)) ([f67d031](https://github.com/payloadcms/payload/commit/f67d031))
* add kv and plugin-mcp to valid PR scopes ([be0943a](https://github.com/payloadcms/payload/commit/be0943a))
### ๐ก Chores
* standardize query param parsing ([#14498](https://github.com/payloadcms/payload/issues/14498)) ([3c9f56e](https://github.com/payloadcms/payload/commit/3c9f56e))
* enables folders on website template ([#14116](https://github.com/payloadcms/payload/issues/14116)) ([219fba2](https://github.com/payloadcms/payload/commit/219fba2))
* bump kv-redis version ([ff670c0](https://github.com/payloadcms/payload/commit/ff670c0))
* **claude:** update claude PostToolUse hook to only format on write ([9f2adeb](https://github.com/payloadcms/payload/commit/9f2adeb))
* **claude:** set some sane defaults ([#14445](https://github.com/payloadcms/payload/issues/14445)) ([aa14d86](https://github.com/payloadcms/payload/commit/aa14d86))
* **claude:** add analyze-issue command ([#14435](https://github.com/payloadcms/payload/issues/14435)) ([f1456a0](https://github.com/payloadcms/payload/commit/f1456a0))
### ๐ค Contributors
- Sasha (@r1tsuu)
- Elliot DeNolf (@denolfe)
- Chris Rieckmann (@c-riq)
- Sam Wheeler (@swheeler7)
- Alessio Gravili (@AlessioGr)
- Slava Nossar (@slavanossar)
- Jacob Fletcher (@jacobsfletch)
- Patrik (@PatrikKozak)
- Paul (@paulpopus)
- Tobias Odendahl (@tak-amboss)
- Kendell (@kendelljoseph)
- Jessica Rynkar (@jessrynkar)
- German Jablonski (@GermanJablo)
- Sean Zubrickas (@zubricks)
- Violet Rosenzweig (@6TELOIV)