⚠️ Breaking Change
Impact Score: 7/10
Directus v9.25.0 — Release Notes & Engineering Impact
Source available — automated, not human-reviewed
Component: directus · Channel: stable. Automated analysis, not a compatibility certification. How this works.
Analysis updated: 2026-11-01.
Breaking-change evidence from the source
⚠️ Potential Breaking Change(s) In this one, we've updated the API codebase from CJS to ESM. From our testing, this _should_ be backwards compatible with API-extensions created with the extensions-sdk. However, due to the finicky nature of this change in Node, please do **make sure to test your extensions before updating to this version**. If you're running into ESM-CJS import issues, try renaming your extension output to `.cjs` instead of `.js` or bundle it to native ESM.
⚡ Executive Summary (TL;DR)
Directus v9.25.0. Source highlight: ⚠️ Potential Breaking Change(s)
Who Does This Impact? (Role-Based Analysis)
💻 Software Engineers & Devs
Check the source notes against the package and APIs you use before upgrading.
📊 Product & Engineering Leads
Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.
⚙️ DevOps & Security
Verify the target version, runtime requirements and rollback procedure in the official documentation.
⚠️ Breaking Changes & Deprecations (1)
- ⚠️ Potential Breaking Change(s) In this one, we've updated the API codebase from CJS to ESM. From our testing, this _should_ be backwards compatible with API-extensions created with the extensions-sdk. However, due to the finicky nature of this change in Node, please do **make sure to test your extensions before updating to this version**. If you're running into ESM-CJS import issues, try renaming your extension output to `.cjs` instead of `.js` or bundle it to native ESM.
✨ New Features & Capabilities (6)
- #18131 Add register and update hooks for oauth2 and openid drivers (by @nicam)
- #18012 Autoconvert assets if browser supports it (by @Nitwel)
- #17303 Add support for `AVIF` image format (by @knulpi)
- #17535 Add max batch mutation (by @licitdev)
- #18118 Add items.sort to flow trigger events (by @rijkvanzanten)
- #17961 Add info about dependencies when deleting collection (by @Nitwel)
⚡ Performance & Enhancements (6)
- #18167 Only show message on just request/exec flow operations (by @ConnorSimply)
- #18154 Load Bundle Extension Types for local development (by @that1matt)
- #18147 Resend user invites (by @david-zacharias)
- #18084 serve rollup output chunks (by @bicouy0)
- #18080 Handle webhook request errors correctly (by @paescuj)
- #18156 New Crowdin updates (by @rijkvanzanten)
🔧 Bug Fixes & Patches (6)
- #18166 fix: Use Cloudinary explicit endpoint (by @jbmolle)
- #18010 Fix status on shutdown (by @Nitwel)
- #18009 Fix missing payload.iss when authorization_response_iss_parameter_supported OpenID metadata is true (by @Romakita)
- #16566 Enhance bug reporting from within the app (by @paescuj)
- #18143 Use lodash `set` to format error (by @rijkvanzanten)
- #18137 Fix updating payload on request.error filter (by @rijkvanzanten)
📄 View Raw Release Notes (Original Developer Log)
### ⚠️ Potential Breaking Change(s)
In this one, we've updated the API codebase from CJS to ESM. From our testing, this _should_ be backwards compatible with API-extensions created with the extensions-sdk. However, due to the finicky nature of this change in Node, please do **make sure to test your extensions before updating to this version**. If you're running into ESM-CJS import issues, try renaming your extension output to `.cjs` instead of `.js` or bundle it to native ESM.
### :sparkles: New Features
- **API**
- [#18131](https://github.com/directus/directus/pull/18131) Add register and update hooks for oauth2 and openid drivers (by @nicam)
- [#18012](https://github.com/directus/directus/pull/18012) Autoconvert assets if browser supports it (by @Nitwel)
- [#17303](https://github.com/directus/directus/pull/17303) Add support for `AVIF` image format (by @knulpi)
### :rocket: Improvements
- **API**
- [#18167](https://github.com/directus/directus/pull/18167) Only show message on just request/exec flow operations (by @ConnorSimply)
- [#18166](https://github.com/directus/directus/pull/18166) fix: Use Cloudinary explicit endpoint (by @jbmolle)
- [#18154](https://github.com/directus/directus/pull/18154) Load Bundle Extension Types for local development (by @that1matt)
- [#18147](https://github.com/directus/directus/pull/18147) Resend user invites (by @david-zacharias)
- [#18084](https://github.com/directus/directus/pull/18084) serve rollup output chunks (by @bicouy0)
- [#18080](https://github.com/directus/directus/pull/18080) Handle webhook request errors correctly (by @paescuj)
- [#18010](https://github.com/directus/directus/pull/18010) Fix status on shutdown (by @Nitwel)
- [#18009](https://github.com/directus/directus/pull/18009) Fix missing payload.iss when authorization_response_iss_parameter_supported OpenID metadata is true (by @Romakita)
- [#17535](https://github.com/directus/directus/pull/17535) Add max batch mutation (by @licitdev)
- **App**
- [#18156](https://github.com/directus/directus/pull/18156) New Crowdin updates (by @rijkvanzanten)
- [#18153](https://github.com/directus/directus/pull/18153) [Take 2] Register <drawer-collection> in Vue app for relational interface extensions (by @JoshTheDerf)
- [#18135](https://github.com/directus/directus/pull/18135) Translation dialogs: make fields full width / multiline (by @denkhaus)
- [#18130](https://github.com/directus/directus/pull/18130) Improve error message on failed import (by @rijkvanzanten)
- [#18118](https://github.com/directus/directus/pull/18118) Add items.sort to flow trigger events (by @rijkvanzanten)
- :warning: [#18107](https://github.com/directus/directus/pull/18107) Upgrade tinymce (by @rijkvanzanten)
- [#18035](https://github.com/directus/directus/pull/18035) throw an error on invalid file upload (by @br41nslug)
- [#18004](https://github.com/directus/directus/pull/18004) Migrate to Material Symbols (by @hanneskuettner)
- [#17961](https://github.com/directus/directus/pull/17961) Add info about dependencies when deleting collection (by @Nitwel)
- [#16566](https://github.com/directus/directus/pull/16566) Enhance bug reporting from within the app (by @paescuj)
- [#15806](https://github.com/directus/directus/pull/15806) If undefined collection, use item as relative url (by @u12206050)
### :bug: Bug Fixes
- **API**
- [#18143](https://github.com/directus/directus/pull/18143) Use lodash `set` to format error (by @rijkvanzanten)
- [#18137](https://github.com/directus/directus/pull/18137) Fix updating payload on request.error filter (by @rijkvanzanten)
- [#18101](https://github.com/directus/directus/pull/18101) Fix falsy default values when reading singleton collection (by @azrikahar)
- [#18066](https://github.com/directus/directus/pull/18066) Go back to `tsx` for `api` scripts for Windows compatibility (by @br41nslug)
- [#18048](https://github.com/directus/directus/pull/18048) Fix diff validation and apply (by @azrikahar)
- [#18010](https://github.com/directus/directus/pull/18010) Fix status on shutdown (by @Nitwel)
- [#18001](https://github.com/directus/directus/pull/18001) Fix too many SQL Variables (by @Nitwel)
- [#17927](https://github.com/directus/directus/pull/17927) Block refresh token of suspended users (by @diegoleme)
- [#16711](https://github.com/directus/directus/pull/16711) Users: Verify JWT on accept invitation (by @joselcvarela)
- **Misc.**
- [#18082](https://github.com/directus/directus/pull/18082) Windows compatibility for running migrations (by @br41nslug)
- **App**
- [#17984](https://github.com/directus/directus/pull/17984) Fix sort icons (by @Nitwel)
- [#17959](https://github.com/directus/directus/pull/17959) Load relational data from api on button-links (by @Nitwel)
- [#17939](https://github.com/directus/directus/pull/17939) O auth login is ignoring the redirect url (by @Paiman-Rasoli)
- [#17926](https://github.com/directus/directus/pull/17926) Fix dark theme color for emoji picker (by @azrikahar)
- [#17925](https://github.com/directus/directus/pull/17925) Refresh current user for Save and Stay action (by @azrikahar)
- [#17850](https://github.com/directus/directus/pull/17850) Make headers sticky again (by @Nitwel)
- [#17819](https://github.com/directus/directus/pull/17819) Fix rehydrating cache after flow save (by @Nitwel)
- [#17799](https://github.com/directus/directus/pull/17799) Fix tabular headers (by @Nitwel)
- [#17790](https://github.com/directus/directus/pull/17790) Disallow selecting singletons (by @Nitwel)
- [#15710](https://github.com/directus/directus/pull/15710) Fix default values (by @Nitwel)
### :sponge: Optimizations
- **Misc.**
- :warning: [#18134](https://github.com/directus/directus/pull/18134) Introduce new `directus` wrapper package (by @paescuj)
- [#18127](https://github.com/directus/directus/pull/18127) Add missing typescript devDep to composables (by @paescuj)
- [#18126](https://github.com/directus/directus/pull/18126) Move activity Action enum from types to constants package (by @licitdev)
- [#18122](https://github.com/directus/directus/pull/18122) Blackbox tests restructuring (by @paescuj)
- [#18106](https://github.com/directus/directus/pull/18106) Don't clear terminal screen on dev mode (by @rijkvanzanten)
- [#18099](https://github.com/directus/directus/pull/18099) Only create CLA message if there are actually missing contributors returned (by @paescuj)
- [#18093](https://github.com/directus/directus/pull/18093) Clean-up configs (by @paescuj)
- [#18086](https://github.com/directus/directus/pull/18086) Remove double bracket from CLA message (by @licitdev)
- [#18063](https://github.com/directus/directus/pull/18063) Add workflow for docs spellchecker (by @paescuj)
- [#18052](https://github.com/directus/directus/pull/18052) Move docs to monorepo (by @rijkvanzanten)
- **API**
- :warning: [#18014](https://github.com/directus/directus/pull/18014) The Great TypeScript Modernization Program Season 3 Episode 6: The Big One (by @rijkvanzanten)
- **App**
- [#17646](https://github.com/directus/directus/pull/17646) use DEFAULT_AUTH_DRIVER constant instead of hardcoded string (by @azrikahar)
### :memo: Documentation
- [#18152](https://github.com/directus/directus/pull/18152) Clarify SMTP configs (client / server) (by @paescuj)
- [#18140](https://github.com/directus/directus/pull/18140) Give the docs package a little bit ❤️ (by @paescuj)
- [#18133](https://github.com/directus/directus/pull/18133) Enhance local development setup instructions (by @that1matt)
- [#18117](https://github.com/directus/directus/pull/18117) Fix warning block accessibility for dark theme (by @azrikahar)
- [#18116](https://github.com/directus/directus/pull/18116) Remove wrong info that SAML metadata options can be URLs (by @paescuj)
- [#18102](https://github.com/directus/directus/pull/18102) Small typo on configuration options page in docs (by @paescuj)
- [#18073](https://github.com/directus/directus/pull/18073) Security in Headless CMS Guide (by @bryantgillespie)
- [#18062](https://github.com/directus/directus/pull/18062) Removed link to field schema, which doesn't exist (by @phazonoverload)
### :package: Dependency Updates
- [#18162](https://github.com/directus/directus/pull/18162) security update in the vm2 dependency (by @br41nslug)
- [#18119](https://github.com/directus/directus/pull/18119) Update keyv/redis (by @rijkvanzanten)
- [#18112](https://github.com/directus/directus/pull/18112) Security update vm2 (by @br41nslug)