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)