Payload

Developer Tools

A TypeScript-native headless CMS that runs inside a Next.js application.

Latest v3.87.1 · by PayloadWebsitepayloadcms/payload

Release activity

Release activity — 10 releases across 10 days since Apr 9, 2026. Each cell is one day; darker means more releases that day. Nothing is recorded before Apr 9, 2026. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on Apr 26, 2026No releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026
MondayNo releases on Apr 27, 2026No releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
TuesdayNo releases on Apr 28, 2026No releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 20261 release on May 26, 2026No releases on Jun 2, 20261 release on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on Apr 29, 2026No releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 20261 release on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 2026
ThursdayNo releases on Apr 30, 2026No releases on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 20261 release on Aug 6, 2026
FridayNo releases on May 1, 2026No releases on May 8, 2026No releases on May 15, 2026No releases on May 22, 2026No releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 20261 release on Jul 10, 2026No releases on Jul 17, 2026No releases on Jul 24, 20261 release on Jul 31, 2026No releases on Aug 7, 2026
SaturdayNo releases on May 2, 2026No releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026

10 releases since Apr 9, 2026

Changelog

v3.87.1

Fixed 3
  • Connect to the correct Next.js dev HMR endpoint per version
  • Preserve link drawer form state in richtext-lexical
  • Fix with-cloudflare-d1 build and bump dependencies
Security 3
  • Bump mongoose to 8.24.1 for GHSA-664h-wqgq-64gw
  • Bump undici for security vulnerability
  • Bump @modelcontextprotocol/sdk to 1.30.0 for GHSA-frvp-7c67-39w9
v3.87.1 (2026-08-06)
🐛 Bug Fixes
  • connect to the correct Next.js dev HMR endpoint per version (#17644) (291ac66)
  • db-mongodb: bump mongoose to 8.24.1 for GHSA-664h-wqgq-64gw (3.x backport of #17609) (#17608) (f039324)
  • deps: bump undici (#17630) (9e2c11e)
  • plugin-mcp: bump @modelcontextprotocol/sdk to 1.30.0 for GHSA-frvp-7c67-39w9 (3.x) (#17611) (0cb605d)
  • richtext-lexical: preserve link drawer form state (#17586) (90fb9e1)
  • templates: fix with-cloudflare-d1 build and bump dependencies (#17577) (ca3e899)
📚 Documentation
  • update admin panel location link in custom components docs (#17624) (57178e3)
⚙️ CI
🤝 Contributors
  • Nate Lentz (@nathanlentz)
  • Jarrod Flesch (@JarrodMFlesch)
  • Elliot DeNolf (@denolfe)
  • Sean Zubrickas (@zubricks)
  • Patrik (@PatrikKozak)
View originalPermalink
How v3.87.1 went

v3.87.0

Added 1
  • storage-azure client uploads with chunkLargeFiles can now support files larger than 5gb
Changed 1
  • export parse params and related sanitizers
Fixed 16
  • preserve parent localization through tabs
  • replace image-size with image-dimensions dependency for upload dimensions
  • forward locale in count and countGlobalVersions
  • pass id to delete access control on soft delete in updateByID
  • prefer draft titles in by folder view
  • arrays and blocks should handle null values
v3.87.0 (2026-07-31)
🚀 Features
  • storage-azure: client uploads with chunkLargeFiles can now support files larger than 5gb (#17319) (3c00a39)
🐛 Bug Fixes
  • preserve parent localization through tabs 3.x (#17591) (9c8d636)
  • replace image-size with image-dimensions dependency for upload dimensions (#17571) (2a99a01)
  • forward locale in count and countGlobalVersions (3.x) (#17547) (e042561)
  • pass id to delete access control on soft delete in updateByID (#17529) (a539f5b)
  • prefer draft titles in by folder view (#17412) (ef8a6a5)
  • arrays and blocks should handle null values, v3 backport (#17278) (2a69863)
  • db-mongodb: error on null values in arrays and blocks (#17190) (249f8df)
  • drizzle: validate companion table name length against 63-char limit (#17563) (fd629f2)
  • drizzle: dedupe reused localized block tables (#17430) (3e8191c)
  • plugin-multi-tenant: apply tenant on confirm (#17350) (09e01df)
  • storage-vercel-blob: allow overwriting existing blob keys (#17385) (fc2572e)
  • templates: prevent unauthenticated draft-mode access in website preview route (#17472) (0c2e9a8)
  • templates: mark website button as client component for radix-slot context (#17474) (981b282)
  • ui: resolve named-tab field permissions in bulk edit field select (3.x backport of #17523) (#17524) (2371624)
  • ui: keep folder create drawers open during autosave (#17421) (bf72bda)
  • ui: handle undefined field admin components (#17388) (5157c72)
📚 Documentation
🧪 Tests
  • richtext-lexical: create dev user first in seed to fix flaky e2e (3.x backport of #17507) (#17568) (0f6c1b3)
⚙️ CI
  • remove --json from pnpm publish to fix release hang on pnpm v11 (#17279) (4a82c20)
🏡 Chores
🤝 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)
View originalPermalink
How v3.87.0 went

v3.86.0

Added 3
  • Add collection-level disableBulkDelete option
  • Add livePreview.openByDefault config option to UI
  • Backport plugin-form-builder v3 to support translations
Fixed 8
  • Coerce schedulePublish doc.value to collection ID type before update
  • Escape regex metacharacters in isURLAllowed pathname allow-list
  • Respect disabled GraphQL config in v3 backport
  • Allow access to files reuploaded on a draft
  • Run tenant delete cleanup inside the request transaction in plugin-multi-tenant
  • Use qs-esm allowEmptyArrays parameter in SDK
  • Skip presentational fields in form state when admin.condition is false in UI
  • Prevent slug field error tooltip from hiding lock button in UI
v3.86.0 (2026-07-10)
🚀 Features
  • collection-level disableBulkDelete (#17207) (ca02cdc)
  • plugin-form-builder: v3 backport to support translations (#17255) (2cde8c8)
  • ui: add livePreview.openByDefault config option (#17213) (f23b693)
🐛 Bug Fixes
  • coerce schedulePublish doc.value to collection ID type before update (#17238) (7de11b2)
  • escape regex metacharacters in isURLAllowed pathname allow-list (#17237) (2061859)
  • respect disabled GraphQL config, v3 backport (#17228) (9e9c35a)
  • allow access to files reuploaded on a draft (#17209) (f02d22a)
  • plugin-multi-tenant: run tenant delete cleanup inside the request transaction (#17175) (d128fde)
  • sdk: use qs-esm allowEmptyArrays parameter (#17208) (c7dc68e)
  • ui: presentational fields skipped in form state when admin.condition is false (#17224) (f31f26d)
  • ui: prevent slug field error tooltip from hiding lock button (#15885) (908fba1)
⚙️ CI
🤝 Contributors
  • Jessica Rynkar (@JessRynkar)
  • Ævar Þór Gunnlaugsson (@aevarOrigo)
  • Sasha (@r1tsuu)
  • Herman Ciechanowiec (@ciechanowiec)
  • Vivek Tyagi (@darkspirit2802)
  • Noah Bachmann (@noahbachmann)
  • Jake Fletcher (@jacobsfletch)
  • Amelia (@LimChorngUan)
  • German Jablonski (@GermanJablo)
  • Elliot DeNolf (@denolfe)
  • Jarrod Flesch (@JarrodMFlesch)
View originalPermalink
How v3.86.0 went

v3.85.2

Fixed 13
  • Fix payload bin fails with tsx on node v23.5+
  • Regenerate reused array and block row IDs during bulk update
  • Prevent type generation script from hanging on storage-r2
  • Prevent reordering from unpublishing documents that have a newer draft
  • Remove duplicate IDs in nested relationship queries for MongoDB
  • Preserve failing sub-table on unique-constraint ValidationError in Drizzle
Security 2
  • Resolve high severity audit vulnerabilities
  • Override transitive js-cookie to ^3.0.7 for CVE-2026-46625
v3.85.2 (2026-07-01)
🐛 Bug Fixes
  • payload bin fails with tsx on node v23.5+ (#17081) (afb0226)
  • regenerate reused array and block row IDs during bulk update (3.x) (#17018) (e526c88)
  • prevent type generation script from hanging on storage-r2 (#17020) (b681448)
  • prevent reordering from unpublishing documents that have a newer draft (#16969) (b4d43c0)
  • db-mongodb: remove duplicate IDs in nested relationship queries (#17019) (8533dfb)
  • deps: resolve high severity audit vulnerabilities (#17086) (ac000e5)
  • deps: override transitive js-cookie to ^3.0.7 (CVE-2026-46625) (#17000) (ef888de)
  • drizzle: preserve failing sub-table on unique-constraint ValidationError (3.x) (#17015) (6dfac53)
  • plugin-cloud-storage: split client and server utility exports (#17152) (30bc3fd)
  • plugin-cloud-storage: prevent draft file reupload from unpublishing the document (3.x) (#17034) (a18ae22)
  • richtext-lexical: preserve hard line breaks on markdown import (#17061) (c0affcb)
  • translations: replace Malay strings in Burmese (my) locale (3.x) (#17032) (c3ae01d)
  • ui: preserve polymorphic upload bulk select relation (#17112) (9691e42)
  • ui: list relationship cell shows (Untitled) for draft-only titles (#16979) (16152e2)
  • ui: respect admin.condition on row fields (#16954) (29afa77)
⚙️ CI
🤝 Contributors
  • Jarrod Flesch (@JarrodMFlesch)
  • Elliot DeNolf (@denolfe)
  • Sasha (@r1tsuu)
  • German Jablonski (@GermanJablo)
  • Amelia (@LimChorngUan)
View originalPermalink
How v3.85.2 went

v3.85.1

Changed 1
  • Skip rendering custom components hidden by admin.condition for improved performance
Fixed 7
  • Fix draft save and duplicate behaviour on upload-enabled collections
  • Bin scripts cannot import dependencies without explicit "type": "module"
  • Add type declarations for css export for TypeScript 6 compatibility
  • Follow redirects when fetching uploaded files for MIME type detection
  • Fix CSV import of arrays and richText in plugin-import-export
  • Use explicit relative paths for internal SCSS imports in ui
  • Hide entire tabs field when admin.condition is false
v3.85.1 (2026-06-09)
🐛 Bug Fixes
  • fix draft save and duplicate behaviour on upload-enabled collections (#16853) (fad992c)
  • bin scripts cannot import dependencies without explicit "type": "module" (backport) (#16848) (6707e85)
  • add type declarations for css export (TypeScript 6 compat) (#16348) (6c81355)
  • follow redirects when fetching uploaded files for MIME type detection (#16708) (ac46214)
  • plugin-import-export: fix CSV import of arrays and richText nest… (#16923) (ccbdcc2)
  • ui: use explicit relative paths for internal SCSS imports v3.x (#16827) (c039e55)
  • ui: hide entire tabs field when admin.condition is false (#16809) (79b4e4c)
⚡ Performance
  • ui: skip rendering custom components hidden by admin.condition (#16819) (0be11b6)
📚 Documentation
⚙️ CI
🤝 Contributors
  • Paul (@paulpopus)
  • Habeeb (@haxllo)
  • Sean Zubrickas (@zubricks)
  • Alessio Gravili (@AlessioGr)
  • Jake Fletcher (@jacobsfletch)
  • Anders Semb Hermansen (@andershermansen)
  • Elliot DeNolf (@denolfe)
View originalPermalink
How v3.85.1 went

v3.85.0

Added 1
  • Move plugin-import-export out of beta and add support for collection-level and field-level hooks
Fixed 11
  • Bump uuid package to 13.0.2
  • Stop workflows retrying forever when no retries are configured
  • Propagate custom hook errors during upload in plugin-cloud-storage
  • Preserve user-defined prefix.defaultValue in plugin-cloud-storage
  • Dedupe filename in clientUploads signed URL in plugin-cloud-storage
  • Make tenant field selectable in bulk upload Edit all in plugin-multi-tenant
Security 1
  • Bump mongoose to 8.22.1 for GHSA-wpg9-53fq-2r8h in db-mongodb
v3.85.0 (2026-05-26)
🚀 Features
  • plugin-import-export: out of beta and added support for collection-level and field-level hooks (#16556) (cf9252d)
🐛 Bug Fixes
  • bump uuid package to 13.0.2 (#16545) (274af06)
  • stop workflows retrying forever when no retries are configured (#16465) (caf9150)
  • db-mongodb: bump mongoose to 8.22.1 for GHSA-wpg9-53fq-2r8h (#16688) (4baba91)
  • plugin-cloud-storage: propagate custom hook errors during upload (#16632) (055c508)
  • plugin-cloud-storage: preserve user-defined prefix.defaultValue (#16529) (8d14915)
  • plugin-cloud-storage: dedupe filename in clientUploads signed URL (#16510) (64b2860)
  • plugin-multi-tenant: tenant field unselectable in bulk upload "Edit all" (#16466) (695df3c)
  • richtext-lexical: cursor kicked out of nested richtext while typing in a block (#16490) (931a349)
  • richtext-lexical: drag/drop image into rich text fails when a field name matches the collection slug (#16409) (d6f7b47)
  • ui: bulk upload silently counts failed files as saved (#16532) (c31f4ef)
  • ui: respect formatDocURL returning null in ListDrawer (#16464) (0facc44)
  • ui: show all listSearchableFields in ListDrawer search placeholder (#16467) (3cd4a64)
📚 Documentation
📝 Templates
⚙️ CI
🏡 Chores
  • deps: bump nodemailer minimum version to 8.0.5 (#16664) (efa4afe)
🤝 Contributors
  • Sean Zubrickas (@zubricks)
  • German Jablonski (@GermanJablo)
  • Jake Fletcher (@jacobsfletch)
  • Paul (@paulpopus)
  • Alessio Gravili (@AlessioGr)
View originalPermalink
How v3.85.0 went

v3.84.1

Changed 1
  • Adjust 3.x branch references in create-payload-app
v3.84.1 (2026-04-23)

Retargeting create-payload-app to pull from 3.x branch.

⚙️ CI
🤝 Contributors
  • Elliot DeNolf (@denolfe)
View originalPermalink
How v3.84.1 went

v3.84.0

Added 5
  • Allow client components to also be used as custom collection views
  • Add email recipient override config to email-nodemailer
  • Add locale-aware currency formatting and symbol positioning to plugin-ecommerce
  • Add support for multi part uploads to plugin-form-builder
  • Add support for server instructions to plugin-mcp
Fixed 8
  • Fix unique value errors not being displayed properly for localized fields
  • Fix multipart uploads without content-length
  • Fix plugin-ecommerce to verify PaymentIntent succeeded before creating orders
  • Fix internal links exporting as [text](undefined) in markdown transformer for richtext-lexical
  • Simplify key handling for signed urls and composite prefixes in storage plugins
  • Remove tilde SCSS imports and add Sass loadPaths for Windows in templates
  • Fix json and richText fields exposing unsupported operators in WhereBuilder
  • Fix bulk edit ignoring fields in named tabs and showing incorrect labels for unlabeled containers
v3.84.0 (2026-04-22)
🚀 Features
  • allow client components to also be used as custom collection views (#16312) (8fe5f04)
  • email-nodemailer: add email recipient override config (#16311) (1c1ed97)
  • plugin-ecommerce: add locale-aware currency formatting and symbol positioning (#15139) (6731036)
  • plugin-form-builder: add support for multi part uploads (#15268) (aa01a45)
  • plugin-mcp: add support for server instructions (#15858) (c852d85)
🐛 Bug Fixes
  • unique value errors are not displayed properly for localized fields (#16069) (f6e9073)
  • correct slugifyTitle hook example in documentation (#16306) (48db8c1)
  • handle multipart uploads without content-length (#16301) (c150ef8)
  • plugin-ecommerce: verify PaymentIntent succeeded before creating… (#15902) (500e39d)
  • richtext-lexical: internal links export as text in markdown transformer (#16302) (3dc6041)
  • storage-*: simplify key handling for signed urls and composite prefixes (#16291) (6139508)
  • templates: remove tilde SCSS imports and add Sass loadPaths for Windows (#16295) (7ca8b05)
  • ui: json and richText fields expose unsupported operators in WhereBuilder (#16353) (a507fcc)
  • ui: bulk edit ignores fields in named tabs and shows incorrect labels for unlabeled containers (#16340) (e5bc6be)
📚 Documentation
🧪 Tests
  • add tests for autosave creating new versions and losing draft status on reload (#16335) (60d8678)
  • add more integration tests to CI (#15419) (8a470c1)
📝 Templates
  • bump plugin template to latest payload version (#16305) (9de13c2)
⚙️ CI
  • disable audit-dependencies slack notification (#16329) (eeee018)
  • use SLACK_CHANNEL env var for activity notifications (#16323) (a7cc58b)
  • use artifacts for e2e prep so job retries don't fail on cache eviction (#16310) (bc590bd)
🏡 Chores
  • change other instances of port 3000 being hardcoded in tests (#16290) (7f0b069)
  • templates: fix link to one-click deployment (#16337) (5a39afc)
  • templates: strengthen types in preview url gen (#14947) (fcbc987)
  • templates: remove unused image-3 from website templates (#16155) (f0735b1)
🤝 Contributors
  • Patrik (@PatrikKozak)
  • Sasha (@r1tsuu)
  • Jake Fletcher (@jacobsfletch)
  • Elliot DeNolf (@denolfe)
  • German Jablonski (@GermanJablo)
  • Marcin Gierada (@teastudiopl)
  • Anton Ambarov (@AntonAmbarov)
  • Paul (@paulpopus)
  • Jens Becker (@jhb-dev)
  • Neha Prasad (@nehaaprasad)
  • Jarrod Flesch (@JarrodMFlesch)
View originalPermalink
How v3.84.0 went

v3.83.0

Added 11
  • Expand plugin API with definePlugin helper that introduces opt-in execution ordering, cross-plugin discovery via slug-keyed plugins map, and module augmentation for type-safe plugin options
  • Add profiling utilities timeSync and timeAsync for measuring function execution time during development
  • Add internal plugin priority and slug API for execution ordering and cross-plugin discovery
  • Hide slug field buttons when field is read-only
  • Add --agent flag for create-payload-app to download and install Payload coding skill for coding agents
  • Add uuidv7 support to Drizzle adapter for Postgres and SQLite
Changed 1
  • Change checkbox label from 'Default Value' to 'Checked by default' in form builder plugin
v3.83.0 (2026-04-15)
🚀 Features
  • expand plugin API (#16247) (54189e1)
  • add profiling utilities for performance analysis (#16198) (9391c20)
  • add internal plugin priority and slug api for cross-plugin discovery (#16244) (5f5694f)
  • hide slug field buttons when field is read-only (#14824) (67c2c47)
  • cpa: add --agent flag for coding agent skill installation (#16278) (9f9f343)
  • drizzle: add uuidv7 support (#16113) (ac01e82)
  • email-resend: add Custom headers for the Resend adapter (#15645) (a7dd17c)
  • next: add support for custom collection views (#16243) (835a0ad)
  • plugin-form-builder: change checkbox label from 'Default Value' to 'Checked by default' (#15229) (b3d2054)
  • plugin-mcp: allow external plugins to extend mcp plugin (#16245) (ac4fc31)
  • richtext-lexical: add view override system for custom node rendering (#14244) (1ef43eb)
  • storage-*: add useCompositePrefixes option and fix client upload prefix handling (#16230) (74aa825)

Expanded Plugin API — New definePlugin helper introduces opt-in execution ordering, cross-plugin discovery via a slug-keyed plugins map, and module augmentation for type-safe plugin options. The existing (config) => config contract remains unchanged. #16247

import { definePlugin } from 'payload'

export const seoPlugin = definePlugin<SEOPluginOptions>({
  slug: 'plugin-seo',
  order: 10,
  plugin: ({ config, plugins, collections, generateTitle }) => ({
    ...config,
    // collections and generateTitle come from SEOPluginOptions
  }),
})

Profiling Utilities — Lightweight timeSync and timeAsync wrappers for measuring function execution time during development. Wrap any function to capture its duration, then call printProfileResults for a formatted timing table. Not intended for production use. #16198

Internal Plugin Priority & Slug API — Plugins can now attach priority, slug, and options properties for execution ordering and cross-plugin discovery. Lower priority runs first; other plugins can find each other by slug via config.plugins without imports. Marked @internal for now. #16244

Hidden Slug Field Buttons on Read-Only — The Generate and Lock/Unlock buttons on slug fields are now automatically hidden when the field is read-only, removing controls that serve no purpose in that state. #14824

Agent Flag for CPA (cpa)create-payload-app now supports a --agent / -a flag (claude, codex, cursor) that downloads the Payload coding skill from GitHub and installs it in the correct directory for your agent. A root-level CLAUDE.md or AGENTS.md is written for discoverability. Use --no-agent to skip. #16278

UUIDv7 Support (drizzle) — New idType: 'uuidv7' option for Postgres and SQLite adapters generates time-ordered UUIDs that are friendlier for B-tree indexes than random v4 UUIDs, while using the same storage column type. IDs are generated in application code so older Postgres versions are supported. #16113

Custom Email Headers (email-resend) — The Resend adapter now passes custom headers from sendEmail options to the Resend API, enabling features like List-Unsubscribe headers that were previously silently dropped. #15645

await payload.sendEmail({
  from: "Test <test@domain.com>",
  to: "jimmybillbob@example.com",
  subject: "Email with custom headers",
  html: html,
  headers: {
    "List-Unsubscribe": "<https://domain.com/unsubscribe>",
    "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
  },
});

Custom Collection Views (next) — Register custom views at the collection level via admin.components.views[key] with a Component and path. Folders take routing precedence over custom views on upload collections. #16243

{
  slug: 'products',
  admin: {
    components: {
      views: {
        grid: {
          Component: '/components/GridView',
          path: '/grid',
          exact: true,
        },
      },
    },
  },
}

Checkbox Label Clarity (plugin-form-builder) — The form builder checkbox field label was changed from "Default Value" to "Checked by default" to eliminate confusion about whether the checkbox toggles a default value or sets the initial checked state. #15229

Extensible MCP Plugin (plugin-mcp) — External plugins can now extend plugin-mcp by finding it via slug in config.plugins and injecting custom MCP tools into its options. Also exports the MCPPluginConfig type for type-safe tool injection. #16245

View Override System for Custom Node Rendering (richtext-lexical) — ⚠️ Experimental. Override how any Lexical node type is rendered in the editor via view maps. Supports custom DOM, React components, or HTML strings. Works in both the admin editor and frontend JSX serialization for WYSIWYG consistency. #14244

export const myViews: LexicalEditorViewMap = {
  default: {
    heading: {
      createDOM() {
        const h2 = document.createElement('h2')
        h2.textContent = 'Custom Heading'
        return h2
      },
    },
    horizontalRule: {
      Component: () => <div className="custom-hr">---</div>,
    },
    link: {
      html: '<a href="#">Custom Link</a>',
    },
  },
}
{
  fields: [
    {
      name: 'content',
      type: 'richText',
      editor: lexicalEditor({
        views: '/path/to/views.tsx#myViews',
      }),
    },
  ]
}

Composite Prefixes for Storage Adapters (storage-*) — New useCompositePrefixes option combines collection and document prefixes instead of one overriding the other. Also fixes a bug where client uploads ignored document prefix entirely. Applies to S3, Azure, GCS, R2, and Vercel Blob. #16230

ModeCollection PrefixDoc PrefixResult
false (default)media-folderuser-123user-123/file.jpg
truemedia-folderuser-123media-folder/user-123/file.jpg
🐛 Bug Fixes
  • restore falling back to current document values for undefined fields (#16272) (4b4d61c)
  • enforce mimeTypes restriction when useTempFiles is enabled (#16255) (bb749a5)
  • prevent cron from permanently dying after handler errors (#16219) (c5e0e02)
  • use safe property assignment in deepMergeSimple (#16271) (2b23010)
  • handle concurrent autosave write conflicts gracefully (#16216) (e8502fa)
  • use instanceof instead of constructor name in formatErrors (#16089) (216d162)
  • parse JSON string where query param (#15745) (2a26b5a)
  • expose type for field's position (#14390) (d9b3c07)
  • default virtual fields to readOnly in admin UI (#16016) (72396f6)
  • localized array,group,blocks fields duplicate with empty values (#15849) (067e14f)
  • fixes importMap type in monorepo usage (#15203) (79f4cc7)
  • db-postgres: bump drizzle-orm to 0.45.2 to resolve an SQL injection vulnerability and pg to 8.20.0 (#16168) (af1a932)
  • drizzle: surface connection errors in beginTransaction instead of hanging forever (#16220) (1e1c591)
  • drizzle: ensure getPrimaryDb is used for all write operations (#16240) (aa44649)
  • email-resend: support path and preserve base64 content in mapAttachments (#16094) (57e71f5)
  • next: persist language cookie across browser sessions (#15081) (0acff80)
  • plugin-ecommerce: price not showing as 0 when explicitly set (#16289) (62aa42b)
  • plugin-ecommerce: priceInput does not respect required field status (#15783) (ed1c874)
  • plugin-import-export: hide invalid sortBy options (#11676) (9d6bf0b)
  • plugin-search: serialize reindexing to prevent locale data race conditions (#15917) (79d1b6b)
  • plugin-seo,richtext-lexical: add missing translations (#11859) (da27afc)
  • plugin-stripe: supports webhooks within serverless environments (#10890) (4179bf3)
  • translations: 'noResults' translation expected a singular label, rewrite sentence sine a plural label is injected. (#13360) (cb0ce1c)
  • translations: modified Spanish translations to be gender neutral (#15796) (a00267d)
  • translations: fall back to base language tag for Accept-Language matching (#15076) (cf95cad)
  • ui: usePreventLeave default message (#15042) (8de32a2)
  • ui: use i18n for live preview "Open in new window" tooltip (#16038) (173b453)
  • ui: preselect folder when bulk uploading from inside a folder (#16030) (71a6c60)
  • ui: prevent NaN aspect ratio in createThumbnail on svg files (#10488) (b332bff)
  • ui: thread cache tag to list view thumbnails (#11741) (5afcef5)
⚡ Performance
  • plugin-mcp: minify JSON in MCP tool responses (#15598) (976369d)
🛠 Refactors
  • simplify storage adapter handler pattern (#16231) (6690769)
  • clean up dead code and minor bugs in job queue system (#16234) (e49c224)
📚 Documentation
  • documents upload node markdown placeholder (#16135) (a9b0ca7)
  • change import to use type import for GlobalConfig (#11578) (289e2b6)
🧪 Tests
  • remove debug console.log left in SlugField overrides fields test suite (#16279) (22e2466)
  • plugin-multi-tenant: verify that tenant selector respects access control (#14916) (0516803)
📝 Templates
📓 Examples
⚙️ CI
  • consolidate docker service startup into start-services action (#16277) (4912005)
  • make build cache restore resilient to eviction (#16275) (d1837ad)
  • update actions to resolve Node.js 20 deprecation warnings (#16267) (04163ea)
  • run e2e tests using turbopack (#16237) (3a7c9f3)
🏡 Chores
🤝 Contributors
  • Elliot DeNolf (@denolfe)
  • Paul (@paulpopus)
  • Philipp Schneider (@philipp-tailor)
  • Riley Langbein (@rilrom)
  • Patrik (@PatrikKozak)
  • Ran (@eddieran)
  • Alessio Gravili (@AlessioGr)
  • Jens Becker (@jhb-dev)
  • Ruben Hutter (@ruben-hutter)
  • German Jablonski (@GermanJablo)
  • Sean Zubrickas (@zubricks)
  • Muhammad Aqib (@aqib-io)
  • Jarrod Flesch (@JarrodMFlesch)
  • Bob Bass (@robertjbass)
  • Said Akhrarov (@akhrarovsaid)
  • Mahmoud Hamdy (@mahmoodhamdi)
  • fdurackbrooks (@fdurackbrooks)
  • Jake Fletcher (@jacobsfletch)
  • David Murdoch (@dsm23)
  • Ossaid (@ossaidqadri)
  • Adrian Maj (@AdrianMaj)
  • Thijs Marinussen (@ThijsAtFreave)
  • roboin (@Robot-Inventor)
  • Jeremías Benitez (@jerebenitez)
  • Sebastian Blank (@blankse)
  • Sasha (@r1tsuu)
  • Yaniv (@y4aniv)
  • Marwin Hormiz (@marwinhormiz)
  • Jeffery To (@jefferyto)
  • Roman Ryzhikov (@yagee)
  • Hugo Duarte (@hugomeduarte)
  • Boyan Bratvanov (@bratvanov)
  • jakobpevec (@jakobpevec)
  • Siim Sams (@siimsams)
  • W1ckh3ad (@W1ckh3ad)
  • Shane Friedman (@smoores-dev)
  • Marius (@MariusMatu)
  • guoyangzhen (@guoyangzhen)
View originalPermalink
How v3.83.0 went

v3.82.1

Changed 1
  • Avoid getObject call in storage-s3 if ETag matches
Fixed 2
  • Use correct config key for disabling turbo server fast refresh in Next.js
  • Await populateBreadcrumbs in resaveChildren for plugin-nested-docs
v3.82.1 (2026-04-09)
🐛 Bug Fixes
  • next: use correct config key for disabling turbo server fast refresh (#16215) (11adc9d)
  • plugin-nested-docs: await populateBreadcrumbs in resaveChildren (#15582) (0554b50)
⚡ Performance
  • storage-s3: avoid getObject call if ETag matches (#15295) (7ccc3f0)
📚 Documentation
  • fix incorrect select syntax example in querying docs (#14590) (be6c443)
📝 Templates
  • bump to 3.82.0, remove --no-server-fast-refresh flag (#16212) (79c8d7e)
🤝 Contributors
  • William Ding (@wingding12)
  • Syazwan (@syazwanz)
  • Alessio Gravili (@AlessioGr)
  • Anders Semb Hermansen (@andershermansen)
View originalPermalink
How v3.82.1 went
View all

Discussion