⚠️ Breaking Change
Impact Score: 7/10
Directus v10.4.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 Changes There's a couple potentially breaking changes in this release that you should be aware of:
There's a couple potentially breaking changes in this release that you should be aware of:
⚡ Executive Summary (TL;DR)
Directus v10.4.0. Source highlight: ⚠️ Potential Breaking Changes
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 (2)
- ⚠️ Potential Breaking Changes There's a couple potentially breaking changes in this release that you should be aware of:
- There's a couple potentially breaking changes in this release that you should be aware of:
✨ New Features & Capabilities (6)
- **@directus/data-driver-postgres**
- Implemented sorting in PostgreSQL driver (#18954 by @jaads)
- Added limit and offset support for postgres driver (#18894 by @jaads)
- **@directus/data-sql**
- Added limit and offset support for postgres driver (#18894 by @jaads)
- Implemented sort conversion in SQL middleware (#18938 by @jaads)
🔧 Bug Fixes & Patches (6)
- Fixed archive status in sidebar when clicking on same collection again (#18995 by @AshishBarvaliya)
- Fixed kanban layout not rendering certain images (#18904 by @ConnorSimply)
- Fixed an issue that could cause an infinite loop on fetching large permissions sets (`e5992b59b` by @rijkvanzanten)
- Added notice about case sensitivity for new collection creation (#18979 by @rijkvanzanten)
- Fixed issue that could cause the export drawer to hang on export (#19004 by @u12206050)
- Fixed issue where App was not fully taking rate limit into consideration (#18940 by @joselcvarela)
📄 View Raw Release Notes (Original Developer Log)
### ⚠️ Potential Breaking Changes
There's a couple potentially breaking changes in this release that you should be aware of:
#### Consolidated environment variables for Redis use
Directus had various different functionalities that required you to use Redis when running Directus in a horizontally scaled environment (like caching/rate-limiting). With the release of 10.3, two more functionalities were added (websockets/flows). In 10.4, the configuration for these different parts will be combined into a single set of `REDIS` environment variables that are reused across the system.
<details><summary>Migration / Mitigation</summary>
<div>
Combine all the `*_REDIS` environment variables into a single shared one as followed:
_Before_
```
CACHE_STORE="redis"
CACHE_REDIS_HOST="127.0.0.1"
CACHE_REDIS_PORT="6379"
...
RATE_LIMITER_STORE="redis"
RATE_LIMITER_REDIS_HOST="127.0.0.1"
RATE_LIMITER_REDIS_PORT="6379"
...
SYNCHRONIZATION_STORE="redis"
SYNCHRONIZATION_REDIS_HOST="127.0.0.1"
SYNCHRONIZATION_REDIS_PORT="6379"
...
MESSENGER_STORE="redis"
MESSENGER_REDIS_HOST="127.0.0.1"
MESSENGER_REDIS_PORT="6379"
```
_After_
```
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
CACHE_STORE="redis"
RATE_LIMITER_STORE="redis"
SYNCHRONIZATION_STORE="redis"
MESSENGER_STORE="redis"
```
</div>
</details>
#### Dropped support for Memcached
Directus used to support either memory, Redis, or Memcached for caching and rate-limiting storage. Since the 10.3 release, Redis has been used more integrated as part of WebSockets / Subscriptions and the ability to synchronize flows across containers. Given this deeper integration with Redis, and the low overall usage/adoption of Memcached across Directus installations, we've decided to sunset Memcached in favor of focussing on Redis as the primary solution for pub/sub and hot-storage across load-balanced Directus installations.
#### Updated Errors structure for Extensions
A [new `@directus/errors` package](https://www.npmjs.com/package/@directus/errors) is available that allows you to create custom DirectusErrors for use in extensions. Errors created through this package will be treated the same as errors thrown by the Directus API, which means you can use proper HTTP status codes, error extensions, codes, and messages. This does also mean that extensions no longer get an `exceptions` options passed in that contains some preconfigured errors.
<details><summary>Migration / Mitigation</summary>
<div>
Replace any system exceptions you extracted from `exceptions` with new errors created within the extension itself. We recommend prefixing the error code with your extension name for improved debugging, but you can keep using the system codes if you relied on that in the past.
_Before_
```js
export default (router, { exceptions }) => {
const { ForbiddenException } = exceptions;
router.get('/', (req, res) => {
throw new ForbiddenException();
});
};
```
_After_
```js
import { createError } from '@directus/errors';
const ForbiddenError = createError('MY_EXTENSION_FORBIDDEN', 'No script kiddies please...');
export default (router) => {
router.get('/', (req, res) => {
throw new ForbiddenError();
});
};
```
</div>
</details>
### ✨ New Features & Improvements
The New SDK is available in beta! We've been working hard on redesigning the SDK from the ground up to solve for / improve on some of the most often brought up pain points / shortcomings of the SDK. You can try it out by installing from the `beta` tag: `npm install @directus/sdk@beta`. Please tell us any and all feedback in [the #new-sdk channel on Discord](https://discord.com/channels/725371605378924594/1121094628037361768)! We'll be pushing out more beta releases of the SDK during the next couple weeks. Docs will be continuously updated on https://docs.directus.io/guides/sdk/getting-started.html
- **@directus/app**
- Fixed archive status in sidebar when clicking on same collection again ([#18995](https://github.com/directus/directus/pull/18995) by @AshishBarvaliya)
- **@directus/data-driver-postgres**
- Implemented sorting in PostgreSQL driver ([#18954](https://github.com/directus/directus/pull/18954) by @jaads)
- Added limit and offset support for postgres driver ([#18894](https://github.com/directus/directus/pull/18894) by @jaads)
- **@directus/data-sql**
- Added limit and offset support for postgres driver ([#18894](https://github.com/directus/directus/pull/18894) by @jaads)
- Implemented sort conversion in SQL middleware ([#18938](https://github.com/directus/directus/pull/18938) by @jaads)
- **@directus/data**
- Implemented sort conversion in SQL middleware ([#18938](https://github.com/directus/directus/pull/18938) by @jaads)
### 🐛 Bug Fixes & Optimizations
- **@directus/app**
- Fixed kanban layout not rendering certain images ([#18904](https://github.com/directus/directus/pull/18904) by @ConnorSimply)
- Fixed an issue that could cause an infinite loop on fetching large permissions sets ([`e5992b59b`](https://github.com/directus/directus/commit/e5992b59bdbf9e0333e3e1f39a7a615052d37ade) by @rijkvanzanten)
- Added notice about case sensitivity for new collection creation ([#18979](https://github.com/directus/directus/pull/18979) by @rijkvanzanten)
- Fixed issue that could cause the export drawer to hang on export ([#19004](https://github.com/directus/directus/pull/19004) by @u12206050)
- Fixed issue where App was not fully taking rate limit into consideration ([#18940](https://github.com/directus/directus/pull/18940) by @joselcvarela)
- Fixed an issue that would prevent items with a comma in the ID from being rendered in the app ([#18978](https://github.com/directus/directus/pull/18978) by @rijkvanzanten)
- Create and use new @directus/errors package for standardized errors across the Directus ecosystem. ([#18797](https://github.com/directus/directus/pull/18797) by @rijkvanzanten)
- Fixed issue that caused changes to flows to not be reflected in the inline edidtor. ([#18960](https://github.com/directus/directus/pull/18960) by @ConnorSimply)
- **@directus/api**
- Added support for plain query flags for boolean & geo filter operators ([#18888](https://github.com/directus/directus/pull/18888) by @paescuj)
- Added WebSocketService to available services for extensions ([#18943](https://github.com/directus/directus/pull/18943) by @br41nslug)
- Ensured all caches are flushed when applying diff ([#18986](https://github.com/directus/directus/pull/18986) by @licitdev)
- Fixed resolving $CURRENT_USER in permissions for websocket authentication ([#18901](https://github.com/directus/directus/pull/18901) by @br41nslug)
- Fixed API not properly validating against documented filename restrictions for custom migrations ([#18971](https://github.com/directus/directus/pull/18971) by @rijkvanzanten)
- **@directus/validation**
- Create and use new @directus/errors package for standardized errors across the Directus ecosystem. ([#18797](https://github.com/directus/directus/pull/18797) by @rijkvanzanten)
- **@directus/errors**
- Create and use new @directus/errors package for standardized errors across the Directus ecosystem. ([#18797](https://github.com/directus/directus/pull/18797) by @rijkvanzanten)
- **@directus/types**
- Create and use new @directus/errors package for standardized errors across the Directus ecosystem. ([#18797](https://github.com/directus/directus/pull/18797) by @rijkvanzanten)
- Expose case-insensitive variants of `_starts_with` and `_ends_with` filter operators ([#18941](https://github.com/directus/directus/pull/18941) by @gitstart)
- **@directus/utils**
- Create and use new @directus/errors package for standardized errors across the Directus ecosystem. ([#18797](https://github.com/directus/directus/pull/18797) by @rijkvanzanten)
- Expose case-insensitive variants of `_starts_with` and `_ends_with` filter operators ([#18941](https://github.com/directus/directus/pull/18941) by @gitstart)
- Fixed issue that would prevent JSON string from being treated as GeoJSON in filtering operations ([#18976](https://github.com/directus/directus/pull/18976) by @rijkvanzanten)
- **@directus/storage**
- Improved the type signature for Range headers ([#18970](https://github.com/directus/directus/pull/18970) by @rijkvanzanten)
- **@directus/extensions-sdk**
- Fixed `v-table` allowing radio buttons to have multiple selection values when the `show-select` prop was set to `one` ([#18931](https://github.com/directus/directus/pull/18931) by @Philippe-cheype)
- **@directus/stores**
- Fixed Broken Doc Links and Added License to @directus/stores ([#18988](https://github.com/directus/directus/pull/18988) by @ConnorSimply)
### 📝 Documentation
- Fixed Broken Doc Links and Added License to @directus/stores ([#18988](https://github.com/directus/directus/pull/18988) by @ConnorSimply)
- Revised Docker Guides ([#18956](https://github.com/directus/directus/pull/18956) by @phazonoverload)
### 📦 Published Versions
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`
- `@directus/[email protected]`