Skip to content

Releases: payloadcms/payload

v3.62.1

03 Nov 16:27
14537f7

Choose a tag to compare

v3.62.1 (2025-11-03)

🐛 Bug Fixes

The KV implementation was requiring all postgres users to have to create a new migration. The following fix prevents that.

  • disable lockedDocuments if the kv adapter uses a collection (#14453) (6930aaf)

v3.62.0

30 Oct 18:09
d401424

Choose a tag to compare

v3.62.0 (2025-10-30)

🚀 Features

Jobs Access Control

Adds role-based access control for job queue and cancel operations, allowing you to restrict who can manage background jobs in your application. Both operations now support overrideAccess parameter and respect custom access control functions defined in your jobs configuration. #14404

// Configure access control
jobs: {
  access: {
    queue: ({ req }) => req.user?.roles?.includes('admin'),
    cancel: ({ req }) => req.user?.roles?.includes('admin'),
  }
}

// Use in Local API
await payload.jobs.cancel({
  where: { workflowSlug: { equals: 'sync' } },
  overrideAccess: false,
  req,
})

Per-Field Timezone Configuration

Date fields can now have individual timezone settings, allowing different date fields to support their own list of supported timezones with custom default values. This enables more flexible date handling across your application. #14410

{
  name: 'date',
  type: 'date',
  timezone: {
    defaultTimezone: 'America/New_York',
    supportedTimezones: [
      { label: 'New York', value: 'America/New_York' },
      { label: 'Los Angeles', value: 'America/Los_Angeles' },
      { label: 'London', value: 'Europe/London' },
    ],
  },
}

You can also enforce a specific timezone by specifying just one with a default value:

{
  name: 'date',
  type: 'date',
  timezone: {
    defaultTimezone: 'Europe/London',
    supportedTimezones: [
      { label: 'London', value: 'Europe/London' },
    ],
  },
}

KV Storage Adapters

Introduces a new key-value storage system with multiple adapter options (Database, In-Memory, Redis) for enhanced data persistence and performance. This provides the foundation for the upcoming Realtime API and other features requiring fast key-value access. #9913

Access the KV store via payload.kv with the following interface:

interface KVAdapter {
  /**
   * Clears all entries in the store.
   * @returns A promise that resolves once the store is cleared.
   */
  clear(): Promise<void>

  /**
   * Deletes a value from the store by its key.
   * @param key - The key to delete.
   * @returns A promise that resolves once the key is deleted.
   */
  delete(key: string): Promise<void>

  /**
   * Retrieves a value from the store by its key.
   * @param key - The key to look up.
   * @returns A promise that resolves to the value, or `null` if not found.
   */
  get(key: string): Promise<KVStoreValue | null>

  /**
   * Checks if a key exists in the store.
   * @param key - The key to check.
   * @returns A promise that resolves to `true` if the key exists, otherwise `false`.
   */
  has(key: string): Promise<boolean>

  /**
   * Retrieves all the keys in the store.
   * @returns A promise that resolves to an array of keys.
   */
  keys(): Promise<string[]>

  /**
   * Sets a value in the store with the given key.
   * @param key - The key to associate with the value.
   * @param value - The value to store.
   * @returns A promise that resolves once the value is stored.
   */
  set(key: string, value: KVStoreValue): Promise<void>
}

Configure the adapter using the kv property:

buildConfig({
  kv: adapter()
})

Database KV adapter (default) - Uses your existing database with a hidden payload-kv collection:

import { databaseKVAdapter } from 'payload'

buildConfig({
  kv: databaseKVAdapter({
    kvCollectionOverrides: {
      slug: 'custom-kv',
      ...(process.env.DEBUG === 'true' && {
        admin: { hidden: false },
        access: {},
      }),
    },
  }),
})

In Memory KV adapter - Fast memory-based storage for development:

import { inMemoryKVAdapter } from 'payload'

buildConfig({
  kv: inMemoryKVAdapter(),
})

Redis KV Adapter - Production-ready Redis integration:

pnpm add @payloadcms/kv-redis
import { redisKVAdapter } from '@payloadcms/kv-redis'

buildConfig({
  kv: redisKVAdapter({
    keyPrefix: "custom-prefix:", // defaults to 'payload-kv:'
    redisURL: "redis://127.0.0.1:6379" // defaults to process.env.REDIS_URL
  }),
})

Configurable Toast Position

Toast notifications can now be positioned anywhere on the screen (top-left, top-center, top-right, bottom-left, bottom-center, bottom-right), giving you control over where important messages appear to your users. This is particularly useful for applications with large screens or specific UI layouts. #14405

The position configuration is a direct pass-through of the Sonner library's position options, with 'bottom-right' remaining the default.

Feature PRs

🐛 Bug Fixes

  • globals with versions return _status field when access denied (#14406) (b766ae6)
  • custom dashboard component causes runtime error on create-first-user and account views (#14393) (d5f4e72)
  • claude: remove invalid frontmatter fields (#14411) (118d005)
  • db-*: findMigrationDir in projects without src folder (#14381) (059185f)
  • db-mongodb: migration fails for cosmosDB (#14401) (10a640c)
  • db-mongodb: type error with prodMigrations (#14394) (8e5e23a)
  • db-mongodb: duplicate ids in sanitizeQueryValue (#11905) (36bb188)
  • db-postgres: hasMany relationship/number/text fields inside blocks are incorrectly returned when using select (#14399) (850cc38)
  • drizzle: number fields in generated schema with defaultValue (#14365) (8996b35)
  • plugin-multi-tenant: remove unused syncTenants from useEffect deps (#14362) (906a3dc)
  • richtext-lexical: do not run json.parse if value is undefined or null (#14385) (09a6140)
  • richtext-lexical: prevent TS CodeBlocks from sharing Monaco model (useId) (#14351) (5caebd1)
  • storage-*: update the client cache to use a map instead with cache keys per bucket config (#14267) (38f2e1f)
  • ui: where builder crashing with invalid queries (#14342) (6c83046)

🛠 Refactors

  • deprecate job queue depth property (#14402) (1341f69)
  • ui: simplify ConfigProvider, improve useControllableState types and defaultValue fallback (#14409) (255320e)

⚙️ CI

  • add claude as valid scope (560f2f3)

🤝 Contributors

v3.61.1

24 Oct 21:25
bc6228c

Choose a tag to compare

v3.61.1 (2025-10-24)

🐛 Bug Fixes

  • ui: ask before closing doc drawer with edits (#14324) (c1d017a)
  • filteredLocales in the client config are stale (#14326) (5a37909)
  • db-*: querying joins with $exists on mongodb and improve performance when querying multiple times on postgres (#14315) (1f166ba)
  • db-postgres: regression in migrations in the _rels table (#14341) (a2b1c9b)
  • plugin-search: add locale to key in syncedDocsSet (#14289) (c29e1f0)
  • ui: account for array values in transformWhereToNaturalLanguage (#14339) (f2cabe7)
  • ui: preview button not responding to conditional URL (#14277) (ad0e7b2)
  • ui: use depth: 0 for publish specific locale request (#14313) (b68715e)

📚 Documentation

🤝 Contributors

v3.61.0

23 Oct 15:46
32479f2

Choose a tag to compare

v3.61.0 (2025-10-23)

🚀 Features

  • @payloadcms/plugin-mcp Released (BETA) - New plugin that enables Payload to function as an MCP server, allowing AI models to interact with your collections through a standardized protocol. The plugin provides built-in tools for CRUD operations on collections and supports custom tools. #13674

🐛 Bug Fixes

  • user updatedAt modified during session operations (#14269) (a1671ec)
  • document header text clipping (#14291) (db973e9)
  • typescript requires fields when draft: true despite passing draft: true (#14271) (1016cd0)
  • blocks access control not respecting update access whether on collection or on a per field basis (#14226) (88cb687)
  • allow slugField to accept localized argument and fixed slug generation with custom field names (#14234) (2ced43d)
  • db-postgres: limit index and foreign key names length (#14236) (a63b4d9)
  • drizzle: folders with trash enabled don't display documents in polymorphic joins (#14223) (6d3aaaf)
  • plugin-form-builder: display full textarea content in form submissions (#14161) (24dad01)
  • plugin-multi-tenant: block references issue (#14320) (4f8b7d2)
  • plugin-search: exclude skipped drafts in reindex handler (#14224) (0dc782c)
  • richtext-lexical: ensure block node form displays up-to-date value when editor remounts (#14295) (f8e6b65)
  • richtext-lexical: node replacements ignored for block, inline block, upload, unknown and relationship nodes (#14249) (1561853)
  • richtext-lexical, ui: ui errors with Slash Menu in Lexical and SearchBar component in RTL (#14231) (fed3bba)
  • ui: document locked modal blocks interaction after clicking Go Back (#14287) (5782a41)
  • ui: change password button being hidden and unlock button being shown incorrectly on account page (#14220) (bcb4d8e)

⚡ Performance

  • richtext-lexical: decrease size of field schema, minor perf optimizations (#14248) (e25ce1c)
  • richtext-lexical: do not return i18n from editor adapter (#14228) (54224c3)

🛠 Refactors

  • richtext-lexical: ensure classNames of all nodes can be customized (#14294) (e1ef1d2)

📚 Documentation

  • improve slate to lexical migration docs (#14309) (6838c56)
  • db indexes - code example missing const (#14171) (3b37f4a)
  • add explanation about re-renders in useFormFields (#14288) (8cdb5dc)
  • add jsdocs to RichText adapter (#14246) (8b0ac01)
  • clarify admin.timezones list configuration with example (#14238) (de5f3db)
  • fix link to slug-overrides in text.mdx (#14211) (8136a84)
  • add mention of the useUploadHandlers error and steps to remedy it with a mention to monorepos (#14233) (8663024)

🔨 Build

🏡 Chores

🤝 Contributors

v3.60.0

16 Oct 16:48
b26129c

Choose a tag to compare

v3.60.0 (2025-10-16)

🚀 Features

  • accept multiple locales in fallbackLocale (#13822) (623a1b8)
  • adds settingsMenu to admin navigation sidebar (#14139) (ee8b3cf)
  • plugin-multi-tenant: allow collection access to be overridden via callback (#14127) (c40eec2)
  • plugin-multi-tenant: allow hasMany on tenant field overrides (#14120) (fb93cd1)
  • plugin-multi-tenant: user collection access overrides (#14119) (38b7a60)
  • richtext-lexical: add collection filtering to UploadFeature, refactor relationship hooks (#14111) (6defba9)
  • richtext-lexical: client-side block markdown shortcuts, code block (#13813) (07a1eff)

Localization

  • Multiple fallback locales - fallbackLocale now accepts an array of locales for queries and locale configs. Payload will check each locale in order until finding a value, eliminating the need for manual fallback handling. #13822

    /** Local API **/
      await payload.findByID({
        id,
        collection,
        locale: 'en',
        fallbackLocale: ['fr', 'es'],
      })
    
    /** REST API **/
      await fetch(`${baseURL}/api/${collectionSlug}?locale=en&fallbackLocale[]=fr&fallbackLocale[]=es`)
    
    /** GraphQL **/
      await restClient.GRAPHQL_POST({
        body,
        query: { locale: 'en', fallbackLocale: ['fr', 'es']},
      })
    
    /** Locale Configs **/
      locales: [
        {
          code: 'en',
          label: 'English',
          fallbackLocale: ['fr', 'es'],
        },
      ]

Admin UI

  • Settings menu in navigation - New admin.components.settingsMenu config option adds a gear icon above the logout button. Click to open a popup menu with custom admin-level utilities and actions that don't fit into collection or global navigation. #14139

    Screenshot 2025-10-14 at 11 43 37 AM

Multi-Tenant Plugin

  • Collection access overrides - New accessResultOverride callback allows modifying multi-tenant access control results per operation (read, create, update, delete, readVersions, unlock). Enables custom logic like allowing shared content across tenants. #14127

    multiTenantPlugin<ConfigType>({
      collections: {
        posts: {
          accessResultOverride: async ({ accessResult, accessKey, req }) => {
            // here is where you can change the access result or return something entirely different
            if (accessKey === 'read') {
              return {
                or: [
                  {
                    isShared: {
                      equals: true,
                    }
                  },
                  accessResult
                ]
              }
            } else {
              return accessResult
            }
          }
        }
      }
    })
  • Multiple tenants per document - Tenant field overrides now support hasMany relationships, allowing documents to belong to multiple tenants. #14120

  • User collection access overrides - New usersAccessResultOverride callback enables customizing access control on the users collection, overriding default tenant privacy when needed. #14119

    usersAccessResultOverride: ({
      accessKey: 'read', // 'create', 'read', 'update', 'delete', 'readVersions', 'unlock'
      accessResult: AccessResult, // the `AccessResult` type
      ...args, // AccessArgs
    }) => {
      // this is where you could adjust what gets returned here.
      if (accessKey === 'read') {
        return true // over simplified example
      }
    
      // default to returning the result from the plugin
      return accessResult
    }

Lexical Rich Text

  • Upload collection filtering - UploadFeature now supports disabledCollections and enabledCollections to control which collections appear in the upload drawer. Also refactors enabled relationships logic with cleaner useEnabledRelationships hook. #14111

  • Client-side markdown shortcuts & code blocks - Blocks with admin.jsx now support markdown shortcuts on the client (previously server-only). Includes pre-made CodeBlock component for use in BlocksFeature. Also fixes readOnly handling across nested fields. #13813

    Screenshot.2025-10-01.at.10.14.54.mp4

🐛 Bug Fixes

  • findDistinct by explicit ID paths in relationships and virtual fields (#14215) (2b1b6ee)
  • hasMany / polymorphic relationships to custom number IDs (#14201) (a3b3865)
  • hide fields with read: false in list view columns, filters, and groupBy (#14118) (bcd40b6)
  • validate Point Field to -180 to 180 for longitude and -90 to 90 for latitude (#14206) (13a1d90)
  • urls in upload sizes are not encoded (#14205) (747a049)
  • restoring trashed drafts with empty required fields fails validation (#14186) (3317207)
  • db-d1-sqlite: add missing blocksAsJSON property (#14103) (f14a38e)
  • db-mongodb: documents not showing in folders with useJoinAggregations: false (#14155) (e613a78)
  • db-mongodb: improve check for ObjectId (#14131) (32e2be1)
  • graphql: bump tsx version to get around esbuild vulnerability (#14207) (d7ec48f)
  • next: custom views not overriding built-in single-segment routes (#14066) (691f810)
  • plugin-multi-tenant: object reference mutations in addFilterOptionsToFields (#14150) (e62f1fe)
  • richtext-lexical: state key collisions when multiple TextStateFeatures are registered (#14194) (f01a6ed)
  • richtext-lexical: editor throws an error if OrderedList is registered but not UnorderedList or CheckList (#14149) (1fe75e0)
  • richtext-lexical: editing a copied inline block also modifies the original (#14137) (5bacb38)
  • richtext-lexical: correctly type field property of RenderLexical (#14141) (cd94f8e)
  • richtext-lexical: improve type autocomplete and assignability for lexical nodes (#14112) (a46faf1)
  • sdk: pagination is not passed to search params (#14126) (ee9f160)
  • storage-gcs: bump @google-cloud/storage for vulnerability (#14199) (1077aa7)
  • storage-r2: uploads with prefix don't work, add test/storage-r2 (#14132) (4fd4cb0)
  • templates: encoding and decoding slugs in website template (#14216) (cacf523)
  • templates: ecommerce seeding issue (#14196) (d65b8c6)

#...

Read more

v3.59.1

07 Oct 20:12
fcaafaa

Choose a tag to compare

v3.59.1 (2025-10-07)

🐛 Bug Fixes

⚙️ CI

  • update activity notification channels (72be9d3)

🏡 Chores

🤝 Contributors

v3.59.0

07 Oct 14:23
c58d556

Choose a tag to compare

v3.59.0 (2025-10-07)

🚀 Features

  • slug field (#14007) (b09ae67)
  • support any depth for relationships in findDistinct (#14090) (e4f8478)
  • adds disableGroupBy to fields admin props (#14017) (537f58b)
  • allow findDistinct on fields nested to relationships and on virtual fields (#14026) (9d6cae0)
  • bundle types (#14020) (9bcb7b0)
  • cpa: add cloudflare template to create-payload-app command (#14091) (e8140ed)
  • db-*: adds support for readReplicas in D1 adapter config (#14040) (5a6f361)
  • db-mongodb,drizzle: add atomic array operations for relationship fields (#13891) (7eacd39)
  • next: export views, pass all props to custom dashboard view (#14094) (abebd24)
  • plugin-nested-docs: pass collection config as an arg to generateURL and generateLabel (#14086) (db6ec30)
  • ui: add support for disabling join field row types (#12738) (cd546b3)
  • ui: live preview conditions (#14012) (2be6bb3)

🐛 Bug Fixes

  • add detection for --experimental-https flag (#14085) (3cf3f93)
  • missing cross-env in deploy:database (#14076) (709ee58)
  • support USE_HTTPS for local hmr (#14053) (feaa395)
  • update packages list for pnpm payload info (#14030) (4b6b0c5)
  • autosave: true doesn't work on payload.update with where (#14001) (5d86d5c)
  • db-d1-sqlite: avoid bound parameter limit when querying relationships and inserting rows (#14099) (444ca0f)
  • db-mongodb: localized blocks with fallback and versions (#13974) (1e654c0)
  • db-postgres: drizzle doesn't recognize types from the generated types (#14058) (ef84b20)
  • db-postgres: querying multiple hasMany text or number fields (#14028) (95bdffd)
  • db-postgres: joins count with hasMany relationships (#14008) (1510e12)
  • drizzle: generate DB schema syntax is deprecated (#14031) (ef57d24)
  • graphql: error querying hasMany relationships when some document was deleted (#14002) (48e9576)
  • next: force inactive live preview after passing conditions (#14048) (ca3f054)
  • next: prevent locale upsert when not authenticated (#13621) (ece5a95)
  • plugin-ecommerce: variants validateOptions errors with SQLite when creating a new variant (#14054) (3b9e759)
  • plugin-multi-tenant: rm chalk dep (#14003) (d017499)
  • plugin-search: handle trashed documents in search plugin sync (#13836) (de352a6)
  • richtext-lexical: field.admin overrides were ignored in RenderLexical helper (#14024) (810da54)
  • richtext-lexical: slash menu arrows keys not respected when block nearby (#14015) (54b6f15)
  • sdk: incorrect fetch initialization on cloudflare (#14009) (a5c8b5b)
  • storage-r2: upload with the correct contentType (#13988) (066997d)
  • storage-uploadthing: hide key field from filters and columns (#14004) (2ce6e13)
  • templates: ignore wrangler when bundling to fix template styles (#14067) (c135bf0)
  • templates: added missing CLOUDFLARE_ENV in cloudflare template when optimizing database (#14064) (9fcd1fa)
  • templates: don't use remote bindings in cloudflare template when developing locally (#14063) (9d3e540)
  • templates: ecommerce wrong links in readme and docs and issue with missing graphql dependency (#14045) (e4f90a2)
  • templates: correct typo in footer text (#14021) (a938ad6)
  • translations: refine Persian (fa) translations for clarity and natural tone (#14082) (990603c)
  • translations: fixes to Icelandic translations (#14038) (7088d25)
  • translations: fixes to Swedish translation (#13994) (4b193da)
  • ui: phantom fields when duplicating rows with rows (#14068) (08f6d99)
  • ui: invalid time value error when document locking with autosave enabled (#14062) (394000d)
  • ui: undefined access with polymorphic joins and fix joins test config (#14057) (cb7a24a)
  • ui: popup list controls overlap with table in list view (#13967) (1e23882)
  • ui: upload dropzone error when collectionConfig is undefined (#14043) (62fcf18)
  • ui: saving empty code editor throw error (#14019) (bffb9ef)
  • ui: add support back for custom live preview components (#14037) (d826159)
  • ui: array fields not respecting width styles in row layouts (#13986) (accd95e)

⚡ Performance

  • graphql: select only the requested columns (#13711) (c819083)
    ...
Read more

v3.58.0

30 Sep 13:30
5b64e12

Choose a tag to compare

v3.58.0 (2025-09-30)

🚀 Features

Ecommerce plugin and template (#8297) (ef4874b)

The Ecommerce Template and Plugin is now ready in beta, you can get started by running the Payload CPA command below

pnpx create-payload-app my-project -t ecommerce

Full docs are available on our website

Payload SDK package (#9463) (92a5f07)

Allows querying Payload REST API in a fully type safe way. Has support for all necessary operations, including auth, type safe select, populate, joins properties and simplified file uploading. Its interface is very similar to the Local API.

import { PayloadSDK } from '@payloadcms/sdk'
import type { Config } from './payload-types'

// Pass your config from generated types as generic
const sdk = new PayloadSDK<Config>({
  baseURL: 'https://example.com/api',
})

// Find operation
const posts = await sdk.find({
  collection: 'posts',
  draft: true,
  limit: 10,
  locale: 'en',
  page: 1,
  where: { _status: { equals: 'published' } },
})

New Cloudflare D1 SQLite adapter, R2 storage adapter and Cloudflare template (#12537) (99043ee)

You can now deploy directly to Cloudflare using our 1-click template or click the deployment button below

Deploy to Cloudflare

🐛 Bug Fixes

  • ensure blocks filterOptions are awaited (#13960) (41aa201)
  • sanitize collection labels to inherit defaults when only a partial config is provided (#13944) (1752043)
  • avoid relying on Function.prototype.name to detect react components (#13931) (4652bd0)
  • next: static live preview url corrupt after save (#13949) (3c4f8a3)
  • plugin-multi-tenant: properly localize labels (#13943) (2cc34d1)
  • richtext-lexical: editor re-mounting on save due to json key order not being preserved in postgres (#13962) (6a2e814)
  • ui: query preset where field not displaying array values (#13961) (9248fc4)
  • ui: move collection description below title in document view (#13946) (ae34b6d)

⚙️ CI

  • add @payloadcms/sdk to publish list (#13964) (f9743b4)
  • add cron to activity notifications [skip ci] (#13959) (6d995ff)
  • proper path for activity notifications [skip ci] (2514e4d)
  • activity-notifications debug inputs (ba33f2f)
  • github activity slack notifications (#13955) (4562df7)

🏡 Chores

🤝 Contributors

v3.57.0

25 Sep 16:55
71c684e

Choose a tag to compare

v3.57.0 (2025-09-25)

🚀 Features

  • adds admin.formatDocURL function to control list view linking (#13773) (1d1240f)
  • conditional blocks (#13801) (d8dace6)
  • support hasMany virtual relationship fields (#13879) (1072171)
  • next: regenerate live preview url on save (#13631) (00a673e)
  • plugin-form-builder: allow creating form submissions from the admin panel (#11222) (104a5fc)
  • plugin-multi-tenant: improves tenant assignment flow (#13881) (fcb8b5a)
  • richtext-lexical: support copy & pasting and drag & dopping files/images into the editor (#13868) (59414bd)
  • richtext-lexical: utility render lexical field on-demand (#13657) (1c89291)
  • translations: add Tamil translations (#13788) (7975fe3)

🐛 Bug Fixes

  • server component readonly state issues with document locking (#13878) (512a8fa)
  • make input/output encoding explicit in auth/crypto's encrypt/decrypt (#13710) (7f35213)
  • pagination returning duplicate results when timestamps: false (#13920) (062c1d7)
  • add missing translation key (#13902) (39143c9)
  • findDistinct with polymorphic relationships (#13875) (e99e054)
  • admin.hidden not respected for RSCs, render-field server function not respecting field-overrides client-side (#13869) (228e8f2)
  • exits handlers loop if response is returned (#13866) (425172c)
  • support hasMany: true relationships in findDistinct (#13840) (d0543a4)
  • removes select argument from create operation db calls (#13841) (a26d8d9)
  • db-postgres: localized relationships inside blocks (#13760) (22ae9fa)
  • db-sqlite: exists operator in createJSONQuery (#13907) (f980a86)
  • graphql: graphql tab schema not handling tabs correctly (#13850) (83b6e37)
  • next: clear bfcache on forward/back (#13913) (f868ed9)
  • next: groupBy for polymorphic relationships (#13781) (9c20eb3)
  • plugin-import-export: collectionSlug field regression from hidden field changes (#13917) (96c6612)
  • plugin-multi-tenant: ensure relationship filter filters based on doc.tenant (#13925) (cbbf98e)
  • plugin-multi-tenant: improve Norwegian translation for "tenant" (#13923) (dea91f3)
  • plugin-search: transaction state errors in parallel reindex operations (#13915) (79b2557)
  • plugin-search: returns doc instead of empty return (#13916) (68882aa)
  • plugin-seo: allow number ids & resolved relations for image auto-generation (#13906) (abbe38f)
  • richtext-lexical: remove unexpected spaces in link html converter (#13924) (c230005)
  • richtext-lexical: richtext field duplicates description custom component (#13880) (66f5d14)
  • richtext-lexical: prevent disallowed headings to be pasted (#13765) (207caa5)
  • translations: adjust some zh translations (#13867) (ae7b75a)
  • translations: correct Ukrainian language translations (#13639) (5b5eaeb)
  • translations: missing noLabelGroup translation key for Tamil translations (#13896) (cb23aaf)
  • ui: opening relationship field with appearance: "drawer" inside rich text inline block closes drawer (#13830) (7bbd07c)
  • ui: corrects url for publish specific url (#13922) (662bab2)
  • ui: array field state to return empty array instead of 0 (#11283) (3f5c989)
  • ui: folder filters hidden behind results (#13908) (5c81342)
  • ui: custom folder slug in browse-by (#13909) (4975b8d)
  • ui: query folder children with depth and select (#13910) (984f1b3)
  • ui: revert-to-published button showing on new drafts (#13897) (82d98ab)
  • ui: bulk upload with locale param (#13865) (667c4f1)
  • ui: ensures visible list view thumbnails with enableListViewSelectAPI (#13864) (82aade2)
  • ui: respect editorOptions, prevent field from flashing on save (#13848) (5241113)
  • ui: set prefetch false on Link buttons (#13846) (33228d9)

⚡ Performance

  • graphql: use depth 0 in auth/apiKey for graphQL requests (#13895) (9a59562)
  • ui: use select API in RelationshipProvider to speed up load times in RelationshipCell (#13832) (77cac30)

🛠 Refactors

  • richtext-lexical: new upload node design (#13901) (bea77f2)
  • translations: correct i18n translation for Norwegian (#13854) (b7f6e3c)

📚 Documentation

  • corrects link for experimental features topic (#13862) (b1e5bd9)
  • clarify ...
Read more

v3.56.0

17 Sep 13:35
ae3b923

Choose a tag to compare

v3.56.0 (2025-09-17)

🚀 Features

  • pass args to task onSuccess and onFail callbacks (#13269) (3acdbf6)
  • crons for all bin scripts, new jobs:handle-schedules script, more reliable job system crons (#13564) (cdeb828)
  • expose multipart/form-data parsing options (#13766) (8282031)
  • global beforeOperation hook (#13768) (3af546e)
  • ui: export FieldPathContext (#13806) (a3acfeb)

🐛 Bug Fixes

  • add missed pagination property to findVersions and findGlobalVersions and handle it properly (#13763) (a955392)
  • skip validation when trashing documents with empty required fields (#13807) (3b13867)
  • versions created with incomplete data when using select parameter (#13809) (faed3aa)
  • error accessing sanitizedPermissions during docAccess operation: "Cannot read properties of undefined" (#13800) (c7795fa)
  • typo in the description of the isTemp field of query presets (#13728) (e75bfb0)
  • fully sanitize unauthenticated client config (#13785) (e2632c8)
  • client config context inheritance (#13790) (dfb0021)
  • db-mongodb: support 2x and more relationship sorting (#13819) (24ace70)
  • db-mongodb: localized arrays inside blocks with versions (#13804) (09dec43)
  • examples: secure mt example users collection (#13810) (9a841df)
  • live-preview: client-side live preview failed to populate localized fields (#13794) (b34e5ea)
  • live-preview: reset cache per subscription and ignore invalid preview messages (#13793) (b62a30a)
  • next: unnamed, unlabeled groups displayed without label in version view (#13831) (8d3b146)
  • next: sparse block and arrays diffs were not rendered correctly (#13829) (433c513)
  • next: exclude permissions from page response when unauthenticated (#13796) (8113d3b)
  • next: richtext field is read-only for expired lock (#13789) (4278e72)
  • next: login redirect crashes page (#13786) (13af91f)
  • next: resolve filterOptions by path (#13779) (8a7124a)
  • translations: use correct Dutch terms for "clear" and "close" (#13748) (fce94d6)
  • ui: pass locale arg in query params for folder operations (#13837) (c0684e3)
  • ui: correct field path in inline create drawer for auth fields (#13815) (91e7f0c)
  • ui: populate nested fields for enableListViewSelectAPI (#13827) (dc732b8)
  • ui: cross-domain server-side live preview throws postMessage error (#13825) (731c4fb)
  • ui: undefined operators for virtual field with unsupported field types (#13820) (5c02d17)
  • ui: prevent form validation after draft submit error (#12918) (a2c31fa)
  • ui: show loading state in relationship field during search and pagination (#13805) (555228b)
  • ui: safely access preferences when loading list view (#13771) (4482eaf)

📚 Documentation

  • improvements and fixes to blocks documentation (#13782) (3c5aa1b)

📝 Templates

  • fix experimental-build-mode compile generating invalid code (#13828) (ba2ab2f)

⚙️ CI

  • adjust audit-dependencies cron time (898e937)

🤝 Contributors