# Directus v12.3.0 - Product: Directus (https://whatsnew.fyi/product/directus) - Vendor: Directus - Date: 2026-08-18 - Version: v12.3.0 - Original notes: https://github.com/directus/directus/releases/tag/v12.3.0 - Permalink: https://whatsnew.fyi/product/directus/releases/v12.3.0 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **fixed** — Fixed storage connections leaking when asset requests were cancelled or a transformation failed, which eventually made every asset request return a permission error until Directus was restarted - **changed** — exists() now throws when the lookup itself fails, for example on a timeout, a connection error or rejected credentials, instead of reporting false - **changed** — Update Items and Delete Items operations now return null instead of affecting every item in a collection when given an empty or missing key or query - **changed** — Update Items and Delete Items operations now throw an error when both key and query are defined - **changed** — Update Items operation now throws an error when key or query is combined with a batch payload - **changed** — Updated ASSETS_TRANSFORM_IMAGE_MAX_OUTPUT_DIMENSION to 6000 px to match ASSETS_TRANSFORM_IMAGE_MAX_DIMENSION - **changed** — Docker images now boot via CMD ["node", "docker-entrypoint.cjs"] and use the pm2 bundled with @directus/api instead of installing a separate copy - **added** — Added search-first AI tool discovery for chat and MCP tools with schema pinned as a root chat tool - **added** — Added a caption field to the WYSIWYG image drawer, which wraps the image in a figure with a figcaption - **added** — Added the collection name appended to display template in item and drawer headers - **added** — Introduced @directus/cli (d6s / directus-cli) — a client-side CLI that syncs schema and configuration between Directus instances through committed JSON files - **changed** — Updated outdated type definitions for directus_files, directus_collections, directus_deployments, directus_settings, and directus_users ###### ⚠️ Potential Breaking Changes **Fixed storage connections leaking when asset requests were cancelled or a transformation failed, which eventually made every asset request return a permission error until Directus was restarted ([#28076](https://github.com/directus/directus/pull/28076))** `exists()` now throws when the lookup itself fails, for example on a timeout, a connection error or rejected credentials, instead of also reporting `false`. Callers that relied on a `false` result for any failure need to handle the error. Note that S3 answers 403 rather than 404 for a missing object when the credentials cannot list the bucket, so granting `s3:ListBucket` is needed to keep getting a clean "missing" answer. **Fixed "Update Items" and "Delete Items" operations affecting every item in a collection when given an empty or missing key or query ([#27759](https://github.com/directus/directus/pull/27759))** **Nothing to target is a no-op** "Update Items" and "Delete Items" operations now return `null` instead of falling back to every item whenever the configuration doesn't target anything — that is, when `key` is empty or missing (e.g. `[]`, `""`) and `query` is empty or missing (e.g. `{}`). "Update Items" additionally returns `null` when there is nothing to write, i.e. an empty or missing `payload` (e.g. `{}`, or `[]` for a batch payload). Flows that relied on the previous fallback to every item can use `{"limit": -1}`. **Contradictory options error** "Update Items" and "Delete Items" operations now throw an error when both `key` and `query` are defined. "Update Items" also throws when `key` or `query` is combined with a batch payload. **Updated `ASSETS_TRANSFORM_IMAGE_MAX_OUTPUT_DIMENSION` to match `ASSETS_TRANSFORM_IMAGE_MAX_DIMENSION` (`6000` px) ([#28111](https://github.com/directus/directus/pull/28111))** The default maximum output dimension is now `6000` px. Users who rely on the previous limit of `3000` px can explicitly configure `ASSETS_TRANSFORM_IMAGE_MAX_OUTPUT_DIMENSION`. **Used the `pm2` bundled with `@directus/api` in the Docker images instead of installing a separate copy, so its dependencies follow the versions pinned by the workspace ([#28120](https://github.com/directus/directus/pull/28120))** If you extend the Docker image: it now boots via `CMD ["node", "docker-entrypoint.cjs"]`, which runs the same `bootstrap` then `pm2-runtime` sequence as before. `pm2-runtime` is no longer on the `PATH`, so a custom `CMD` that called it directly should hand off to `docker-entrypoint.cjs` instead. `pm2` itself remains on the `PATH` for `docker exec` diagnostics. - **@directus/api** - Fixed "Update Items" and "Delete Items" operations affecting every item in a collection when given an empty or missing key or query ([#27759](https://github.com/directus/directus/pull/27759) by @ComfortablyCoding) - **@directus/storage-driver-cloudinary** - Fixed storage connections leaking when asset requests were cancelled or a transformation failed, which eventually made every asset request return a permission error until Directus was restarted ([#28076](https://github.com/directus/directus/pull/28076) by @dstockton) - **@directus/storage-driver-s3** - Fixed storage connections leaking when asset requests were cancelled or a transformation failed, which eventually made every asset request return a permission error until Directus was restarted ([#28076](https://github.com/directus/directus/pull/28076) by @dstockton) - **@directus/storage-driver-local** - Fixed storage connections leaking when asset requests were cancelled or a transformation failed, which eventually made every asset request return a permission error until Directus was restarted ([#28076](https://github.com/directus/directus/pull/28076) by @dstockton) - **@directus/storage-driver-supabase** - Fixed storage connections leaking when asset requests were cancelled or a transformation failed, which eventually made every asset request re _[Truncated at 4000 characters — full notes: https://github.com/directus/directus/releases/tag/v12.3.0]_