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