v3.63.0 (2025-11-07)
๐ Features
- add support for polymorphic uploads (#14363) (df40d0e)
- adds new UI option Duplicate In [Select Locales] (#13803) (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
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:
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
TSiblingDataforpreviousSiblingDocinFieldHook(#14503) (339a0c3) - support generic types for kv.get (#14494) (f6194c6)
- group-by sticky pagination not rendering for virtual relationship fields (#14470) (648021c)
- ensure importMap is reliably generated during HMR (fixes Next.js 16 issue) (#14474) (61a7095)
- hmr not working in next.js 16 (#14462) (0231a8d)
- disable
lockedDocumentsif the kv adapter uses a collection (#14453) (827c9a1) - drizzle: postgesql where in jsonb (#13742) (207295b)
- graphql: sort by multiple fields (#14486) (b925d34)
- next: withPayload wrapper next.js 16 support (#14473) (c0de75e)
- next: version._status field queried/returned for entities without drafts (#14423) (a22dff3)
- plugin-cloud-storage: file sizes use correct mime type (#11633) (2410296)
- richtext-lexical: prevent unnecessary requests for inline blocks (#14522) (69408f0)
- richtext-lexical: bulk upload drawer rendered at the wrong depth if already in a drawer (#14472) (4fd8d03)
- ui: virtual fields disappearing from filter/groupBy dropdowns with access control (#14514) (a3c0e84)
- ui: safely access fieldPermissions (#14458) (2393721)
- ui: simplify UI orderable collections table by allowing only ascending order (#14433) (eba6cfc)
โก Performance
๐ Refactors
๐ Documentation
๐งช Tests
- use new chromium headless browser for playwright, bump playwright (#14464) (2bb5535)
- multi-tenant flake (#14447) (80d7781)
๐ Templates
- remove payload cloud template, remove cloud plugin from templates (#14479) (76ba2df)
- remove outdated cloning and payload cloud information (#14484) (d4d9622)
๐จ Build
โ๏ธ CI
- speed up workflow reruns, remove run_number from build cache key (#14448) (f67d031)
- add kv and plugin-mcp to valid PR scopes (be0943a)
๐ก Chores
- standardize query param parsing (#14498) (3c9f56e)
- enables folders on website template (#14116) (219fba2)
- bump kv-redis version (ff670c0)
- claude: update claude PostToolUse hook to only format on write (9f2adeb)
- claude: set some sane defaults (#14445) (aa14d86)
- claude: add analyze-issue command (#14435) (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)