5.61.0 (2026-11-04)
π New feature
- audit-logs: record history restores, discarded drafts, settings updates and media events (#28178)
π₯ Bug fix
- admin: add missing english keys and french translations (#28354)
- admin: package exports point to source files that do not exist (#28326)
- admin: make action provider registerMany all-or-nothing (#28324)
- content-manager: offscreen required uids lose their default value when saving after load (35ce71beb2)
- content-manager: edit view rows mounted for an error unmount once the errors are cleared (26272dd9c6)
- content-manager: send a single relation search when the combobox first opens (be34c0e8ff)
- content-manager: only replace a single relation once its saved relation is loaded (0886987f6f)
- content-manager: list view crashes when a content type has an attribute named ref (cf1cffdbcc)
- content-manager: history version restore answers 500 for an unknown version id (#28198)
- content-manager: relations return 500 instead of 403 on field read denial (#28194)
- content-manager: publish actions return 500 on content types without draft and publish (#28189)
- content-manager: findContentTypesByKind type rejects the kind string it needs (#28187)
- content-manager: history versions declare a componentsSchemas field they never store (#28255)
- content-manager: relation endpoints return 500 for morph-to fields (#28270)
- content-manager: update, clone and publish return 200 with empty data for a deleted document (#28269)
- content-manager: history restore fails when a component id no longer belongs to the document (#28195)
- content-releases: action validity not refreshed after attribute change (#28126)
- content-releases: sync entry validation awaited inside Promise.all (#28256)
- content-releases: duplicate webhooks when publishing a release (#27909)
- content-type-builder: changes to a component named admin are not saved (#28200)
- content-type-builder: count documents, not rows, before switching to single type (#28278)
- content-type-builder: content type update without draftAndPublish disables draft and publish (#28203)
- content-type-builder: editing an unknown content type throws a TypeError (#28260)
- content-type-builder: kind change does not emit the content-type.update event (#28205)
- content-type-builder: log a failing schema event listener instead of crashing (#28279)
- content-type-builder: create content type honours options.draftAndPublish (#28287)
- content-type-builder: guard update-schema against switching to single type with many documents (#28284)
- content-type-builder: keep stored schema options keys on content type edit (#28285)
- content-type-builder: is-development-mode middleware crashes when referenced by name (#28323)
- content-type-builder: stop waiting for schema event listeners after a timeout (#28329)
- content-type-builder: count rows without documentId in the single type guard (#28333)
- core: required fields of a new component are not enforced on update (#28236)
- core: limit MCP tool input elements (#28179)
- create-strapi-app: example seed uploads files without their original name (#28325)
- database: moving a relation to the start fails on MySQL/MariaDB (#28289)
- documentation: login answers 500 when no password hash is stored (#28249)
- documentation: bootstrap crashes when users-permissions is not installed (#28186)
- documentation: override service registers yaml that is not an object (#28259)
- graphql: named resolver middlewares do not run as registered strapi middlewares (#28257)
- i18n: locales content api response schema rejects region codes and real document ids (#28252)
- i18n: return not found when a locale disappears during update (#28275)
- review-workflows: assigning a workflow drops other content manager configuration options (#27864)
- review-workflows: workflows can be created or renamed with a name that already exists (#28201)
- review-workflows: stage lookup returns a stage from another workflow (#28193)
- review-workflows: locale created through an update has no review stage (#28202)
- review-workflows: assigned documents widget shows an empty stage after its workflow is deleted (#28273)
- review-workflows: deleting a stage can leave its entries without a stage (#28271)
- review-workflows: deleting or unassigning a workflow with an orphaned content type returns 500 (#28237)
- tooling: jest unit preset runs test helper files as test suites (#28248)
- types: allow null on optional document input attributes (#27902)
- upload: replacing an image with a non-image file keeps the image width, height and formats (#28233)
- upload: avif images are stored without dimensions or responsive formats (#28170)
- utils: concurrent provider registrations of one key bypass the duplicate check (#28322)
π Documentation Changes
- document edit view progressive mounting, lazy validation schema and createContext re-renders (386d4f0a20)
βοΈ Chore
- drop Node 20 support (#26631)
- merge back release 5.60.0 (#28330)
- link v5.60.0 tag into develop history (5ba94ee6b4)
- link main 5.60.0 squash into develop history (cdf4309ab6)
- admin: remove the unused use-context-selector dependency (eedc2d144b)
- admin: type the meta argument the list view passes to cellFormatter (ec09de346c)
- admin: migrate backend unit tests from jest to vitest (#28055)
- core: migrate backend unit tests from jest to vitest (067374ca4a)
- core: migrate tests added on develop to vitest (fd7e0c9388)
- create-strapi-app: migrate backend unit tests from jest to vitest (#28057)
- create-strapi-app: align template typescript lib with node 22 (#28328)
- deps: bump qs from 6.16.0 to 6.16.1 (#28316)
- deps: bump webpack-dev-middleware to 7.4.6 (#28208)
- documentation: migrate backend unit tests from jest to vitest (#28056)
π Enhancement
- admin: only re-render context consumers whose selected value changed (302021fb0b)
- content-manager: build the document validation schema once, when it is needed (619e402016)
- content-manager: render edit view rows progressively (591419942c)
- content-manager: only fetch relations of fields near the viewport (5ca1e44e4e)
- upload: new asset picker and image drop in the rich text editors (#28176)
- upload: content manager asset details drawer (#28283)
β€οΈ Thank You
- Adrien L @Adzouz
- Adrien Lepoutre @Adzouz
- Ben Irvin
- Cedric Robert
- Christopher Pruijsen @cpruijsen
- ELABBASSI Hicham
- Gonzalo Andres Garcia @gonbaum
- HichamELBSI
- Jamie Howard
- jasleenkaur-qed42 @jasleenkaur-qed42
- Markus Murakaru @mmurakaru
- mathildeleg @mathildeleg
- Nico AndrΓ©
- Simen @Eventyret