What directus/directus shipped
Written by FoxPlug from the repository's own releases; not affiliated with Directus. Paste your own repository in the box below and FoxPlug writes the same weekly update for your product. This page is an automatic summary of the releases, pull requests and commits in github.com/directus/directus; Directus did not write it and does not use or endorse FoxPlug. Every line links to the change it describes.
Get a weekly update like this for your product, free
Week of November 2, 2026
What shipped
- The WYSIWYG interface gains an Allowed Link Protocols option so text and image links with custom URL schemes are kept instead of being dropped. Pull request #28447
- The WYSIWYG editor gets an opt-in option that keeps the source markup for bold and italic instead of rewriting it and changing fields nobody edited. Pull request #28474
- The WYSIWYG editor now converts a div with inline content into a paragraph while preserving its class, id, data attributes and alignment. Pull request #28458
- Sandboxed extension requests now have their granted URL scopes enforced on redirects, not just on the initial URL. Pull request #28457
- Login redirect validation in the API and app now rejects relative redirects that normalize into a protocol-relative path. Pull request #28456
- API hook extensions now receive the extensions.unload event before being unregistered, so they can clean up their resources. Pull request #28421
- Run Script no longer fails with illegal access when flow data contains errors, which are now converted into plain objects. Pull request #28441
- Environment Sync now syncs
directus_presetsas a presets resource, limited to global and role presets, with personal presets never pulled. Pull request #28357 - Search on a many-to-many list now matches the related fields shown in the table instead of returning no items or matching parent and related IDs. Pull request #28422
- Version 12.6.1 is released with the Allowed Link Protocols option for the WYSIWYG interface. Release
Why it matters
This week's changes mostly harden behavior that people hit in day-to-day use: the WYSIWYG editor preserves markup it used to lose, sandboxed extension requests enforce their URL scopes on redirects, and login redirects reject protocol-relative paths. It also fixes Run Script failing when flow data contains errors and makes many-to-many list search match what the table displays. Version 12.6.1 shipped with the custom link protocol option.
Changelog entry
- Release v12.6.1 with the Allowed Link Protocols option for the WYSIWYG interface. Release
- Allow custom link protocols in WYSIWYG text and image links, with an error shown for disallowed schemes. Pull request #28447
- Add an opt-in WYSIWYG option that keeps and source tags instead of rewriting them. Pull request #28474
- Keep div class, id, data attributes and alignment when the WYSIWYG editor converts a div to a paragraph. Pull request #28458
- Enforce sandbox request URL scopes on redirects. Pull request #28457
- Block protocol-relative paths in login redirects in the API and app. Pull request #28456
- Emit extensions.unload so API hook extensions can clean up, and log synchronous handler errors. Pull request #28421
- Fix Run Script illegal access errors by serializing errors in flow data into plain objects. Pull request #28441
- Sync global and role presets in Environment Sync, excluding personal presets. Pull request #28357
- Fix many-to-many list search to match displayed related fields. Pull request #28422
- Update vue-i18n, joi and follow-redirects dependencies. Pull request #28451
- New Crowdin translation updates. Pull request #28427
Directus 12.6.1 is out. The WYSIWYG editor keeps custom link protocols and preserves div and source markup, sandboxed request scopes are enforced on redirects, and login redirects reject protocol-relative paths. Run Script and many-to-many list search got fixes too.
Directus 12.6.1 is out. The WYSIWYG editor now has an Allowed Link Protocols option so links with custom schemes are kept, keeps div attributes when converting to a paragraph, and can keep bold and italic source markup. Sandboxed extensions have their request URL scopes enforced on redirects, and login redirect validation now rejects protocol-relative paths. Run Script no longer fails when flow data contains errors, Environment Sync covers global and role presets, and many-to-many list search matches the related fields shown in the table.
Week of October 26, 2026
What shipped
- Released v12.6.0, which brings updated default allowed AI models and removes deprecated LLM models from providers, so AI assistant settings should be rechecked. Release
- Added a richtext app extension type so extensions can contribute Tiptap nodes, marks and toolbar buttons to the WYSIWYG editor. Pull request #28384
- Fixed directus init failing before creating.env by passing the migration's knex instance to getSchema() instead of relying on the global database. Pull request #28405
- Fixed bootstrapping on mssql, where adding multiple foreign key references with ON DELETE SET NULL errored. Pull request #28403
- Fixed a DOMPurify hook leak in md(), where a hook was added on every call and never removed, slowing later sanitize calls across the app. Pull request #28416
- License warnings for invalid keys, activation limits, URL mismatches and an unreachable licensing service now appear in the sidebar, not only in settings. Pull request #28394
- Renamed the OpenRouter migration to avoid a collision with the exports-folder migration. Pull request #28408
- The public page shader background now only mounts when the art panel is visible, so it no longer runs on narrow screens where it is hidden. Pull request #28432
- V-table row selection checks now use a prebuilt set instead of scanning the full selection on every call. Pull request #28438
- Dependency updates include dompurify and basic-ftp security bumps and a Vite update. Pull request #28406
Why it matters
This week ships v12.6.0 with updated default AI model lists and removed deprecated models, plus a new extension type for the WYSIWYG editor. Several fixes target setup and operations: directus init no longer fails before writing.env, mssql bootstrap works, and license warnings are more visible. Performance and security also got attention in table selection, the public page shader, and sanitization hooks.
Changelog entry
- Release v12.6.0 with updated default allowed AI models and removed deprecated LLM models. Release
- Add richtext extensions for the WYSIWYG editor. Pull request #28384
- Fix directus init failing before creating.env. Pull request #28405
- Fix bootstrapping on mssql with multiple SET NULL foreign keys. Pull request #28403
- Fix DOMPurify hook leak in md(). Pull request #28416
- Show license warnings in the sidebar. Pull request #28394
- Give the OpenRouter migration a unique key. Pull request #28408
- Skip the public page shader on narrow screens where it is hidden. Pull request #28432
- Use a set for v-table row selection checks. Pull request #28438
- Replace per-instance CSS v-bind() with inline styles. Pull request #28435
- Restore checkbox card keyboard navigation and polish previews. Pull request #28436
- Dependency updates. Pull request #28406
V12.6.0 is out with updated default AI model lists and deprecated models removed. This week also adds a richtext extension type for WYSIWYG fields, fixes directus init and mssql bootstrap, stops a DOMPurify hook leak, and shows license warnings in the sidebar.
V12.6.0 shipped this week with updated default allowed AI models and removed deprecated LLM models, so check your AI assistant settings. A new richtext extension type lets extensions add Tiptap nodes, marks and toolbar buttons to WYSIWYG fields. Setup and operations fixes include directus init no longer failing before.env is written and mssql bootstrapping working. License warnings now show in the sidebar. Smaller changes reduce re-renders in table selection and skip the public page shader on narrow screens.
Week of October 19, 2026
What shipped
- Released v12.5.1 with dependency bumps for nodejs, dompurify, follow-redirects, ip-address and hono in the app and api packages. Release
- Kept flow status in sync between the editor and the settings drawer so saving from either place uses the new status. Pull request #28392
- Fixed flows to send only changed fields on save, so editing an existing flow no longer fails with a limit exceeded error. Pull request #28260
- Added a Default Exports Folder project setting and improved export handling and messaging. Pull request #28333
- Updated the endpoint to return 405 Method Not Allowed for authenticated GET and HEAD requests instead of a 500. Pull request #28360
- Fixed SDK custom endpoint requests with FormData bodies defaulting to JSON, now letting fetch set the multipart content type and boundary. Pull request #28339
- Fixed duplicate scrollbars in the rich-text formats dropdown. Pull request #28375
- Fixed redactObject skipping a key path when an earlier path matched the same key. Pull request #28212
- Updated telemetry and compliance URL defaults to telemetry.directus.com. Pull request #28385
- Renamed the OpenAPI schema x-metadata to Metadata so it follows the OpenAPI specification extensions rule. Pull request #28323
Why it matters
This week fixes several issues that affected day-to-day use: flow saves now send only changed fields and keep status in sync across the editor and drawer, SDK form-data requests keep their multipart content type, and the rich-text formats dropdown no longer shows duplicate scrollbars. It also adds a Default Exports Folder setting, returns the correct method error on GET and HEAD requests, and moves telemetry defaults to a single domain. Release 12.5.1 packages dependency updates for the app and api.
Changelog entry
- Released v12.5.1 with dependency bumps for nodejs, dompurify, follow-redirects, ip-address and hono. Release
- Flow status stays in sync between the editor and the settings drawer. Pull request #28392
- Flows send only changed fields on save. Pull request #28260
- Added a Default Exports Folder project setting and improved export handling and messaging. Pull request #28333
- Authenticated GET and HEAD requests now return 405 Method Not Allowed. Pull request #28360
- Fixed SDK custom endpoint requests with FormData bodies defaulting to JSON. Pull request #28339
- Fixed duplicate scrollbars in rich-text formats dropdown. Pull request #28375
- Fixed redactObject skipping a key path when an earlier path matched the same key. Pull request #28212
- Updated telemetry and compliance URL defaults to telemetry.directus.com. Pull request #28385
- Renamed OpenAPI schema x-metadata to Metadata. Pull request #28323
- Fixed WYSIWYG font and color pickers closing the Show More menu. Pull request #28370
- Richtext extension labels can now use $t: strings resolved from Settings Translations. Pull request #28382
V12.5.1 is out with dependency bumps. Flows now send only changed fields on save and stay in sync between editor and drawer. SDK form-data requests keep their multipart content type. A Default Exports Folder setting is added. GET and HEAD requests now return 405.
Directus v12.5.1 is out with dependency updates for the app and api. Flow saves now send only changed fields, so editing an existing flow no longer fails with a limit exceeded error, and flow status stays in sync between the editor and the settings drawer. Other fixes: SDK custom endpoint requests with FormData bodies no longer default to JSON, duplicate scrollbars are gone from the rich-text formats dropdown, and authenticated GET and HEAD requests now return 405 instead of 500. New this week: a Default Exports Folder project setting, and telemetry URL defaults moving to telemetry.directus.com.
Week of October 5, 2026
What shipped
- Release v12.5.0 shipped with a potential breaking change: TFA enforcement now uses effective permissions and accounts for policies with an IP allow list, and a failed license request keeps the current license in effect and is retried. Release
- License boot no longer holds a lock for all of startup; a new runExclusive utility lets one instance reconcile the license on a short lease while others wait for its result, and the same path is used at boot and by the scheduled check so they cannot overlap. Pull request #28331
- License states are now exposed to the app, keys are no longer discarded on auto failure states, downgrade only happens when explicitly requested, and the app is told apart a downgrade from a renewal warning. Pull request #28241
- SetDeep no longer walks into an inherited proto: segment reuse is gated on Object.hasOwn and segments are created and assigned with Object.defineProperty, so a proto segment becomes an own key. Pull request #28211
- Fixed a foreign key violation in the retention schedule when a revision's parent was already deleted, where
directus_revisions.parentself-references without an ON DELETE action whiledirectus_revisions.activitycascades. Pull request #28223 - Fixed requests failing after a process was stopped during schema building, and removed CACHE_SCHEMA_MAX_ITERATIONS. Pull request #28316
- The module navigation's scroll position is now kept across route changes instead of resetting to the top when a route backed by a different component mounts a fresh scroll container. Pull request #28269
- Fixed two Norwegian date-fns format strings that had their tokens translated in the latest Crowdin sync, so TT:mm is now HH:mm and tt:mm:ssa is now h:mm:ssa. Pull request #28332
- Directus-extension validate no longer passes or crashes on missing extension paths; the async forEach loops in checkBuiltCode and checkDirectusConfig were replaced with synchronous for loops. Pull request #28320
- SchemaBuilder can now create snapshots that can be applied to the database, and TypeScript type export was added, with e2e tests serving as an example of how the feature could improve the e2e suite. Pull request #28309
Why it matters
This week brought a new release, v12.5.0, along with license handling changes that keep a license in effect when a request fails and expose license states to the app. Several fixes address stability and correctness: schema building when a process is stopped, retention schedule foreign key violations, and setDeep walking into an inherited proto. Extensions also got more richtext capabilities and a stable class to style nodes with their own CSS.
Changelog entry
- Release v12.5.0 with TFA enforcement using effective permissions and IP allow list policies accounted for. Release
- License boot no longer holds a lock for all of startup; runExclusive lets one instance reconcile while others wait. Pull request #28331
- Expose license states to the app and stop discarding keys on failure states. Pull request #28241
- Fix setDeep walking into an inherited proto. Pull request #28211
- Fix foreign key violation in retention schedule when a revision's parent is already deleted. Pull request #28223
- Fix requests failing after a process was stopped during schema building. Pull request #28316
- Keep the module navigation's scroll position across route changes. Pull request #28269
- Fix Norwegian date-fns time format patterns. Pull request #28332
- Fix directus-extension validate passing or crashing on missing extension paths. Pull request #28320
- Add snapshot and TypeScript type generation to SchemaBuilder. Pull request #28309
- Add stable richtext-content class for extension CSS. Pull request #28341
- Share all @tiptap/pm subpaths with richtext extensions. Pull request #28335
V12.5.0 is out, with TFA enforcement using effective permissions and IP allow list policies. This week also fixed schema building after a stopped process, a retention schedule foreign key violation, and setDeep walking into an inherited proto.
V12.5.0 is out. TFA enforcement now uses effective permissions and accounts for policies with an IP allow list, and a failed license request now keeps the current license in effect and is retried. License states are also exposed to the app, keys are no longer discarded on auto failure states, and downgrades only happen when explicitly requested. This week fixed requests failing after a process was stopped during schema building, a foreign key violation in the retention schedule when a revision's parent was already deleted, and setDeep walking into an inherited proto. The module navigation also keeps its scroll position across route changes now, and Norwegian date-fns time formats were corrected.
Week of September 28, 2026
What shipped
- Added confirmation dialogs when modifying the Public policy to warn about changes to system collections. Pull request #28311
- Added persistent warning notices on the Public policy edit page linking to security best practices documentation. Pull request #28310
- Added bulk actions to activate or deactivate multiple flows at once from the Flows overview. Pull request #28321
- Fixed TFA enforcement to use effective permissions including inherited role policies and IP access filtering. Pull request #28176
- Isolated failing richtext extensions so they no longer break the editor or other extensions. Pull request #28302
- Added paste warnings in the WYSIWYG editor when clipboard HTML contains unsupported markup. Pull request #28238
- Fixed GraphQL to correctly mark NOT NULL columns with default values as non-nullable in queries. Pull request #28280
- Fixed filtering and GraphQL typing of geometry subtype fields like Point, LineString, and Polygon. Pull request #28308
- Improved cache clear performance by adding Redis hash support and increasing scan batch size. Pull request #28214
- Fixed tooltips to appear on keyboard focus in wrapped elements like v-button. Pull request #28263
Why it matters
This week improves security around public policies with warnings and confirmations, fixes several GraphQL type and filtering issues that affect API usage, and hardens richtext extensions to prevent editor breakage. Performance improvements to cache clearing and better accessibility for tooltips also ship.
Changelog entry
- Added confirmation dialog when saving Public policy changes affecting system collections Pull request #28311
- Added persistent warning notice on Public policy edit page Pull request #28310
- Improved storage path validation for local driver to prevent file placement in Directus system directories Pull request #28077
- Added bulk activate/deactivate actions for multiple flows Pull request #28321
- Fixed TFA enforcement to use effective permissions including inherited policies Pull request #28176
- Isolated failing richtext extensions to prevent editor breakage Pull request #28302
- Fixed GraphQL to correctly mark NOT NULL fields with defaults as non-nullable in queries Pull request #28280
- Fixed filtering and GraphQL typing of geometry subtype fields Pull request #28308
- Improved cache clear performance with Redis hash support Pull request #28214
- Made richtext extension loading order deterministic across deployments Pull request #28306
- Fixed GraphQL fragments on union types for M2A fields Pull request #28305
- Fixed tooltips appearing on keyboard focus in wrapped elements Pull request #28263
This week: public policy warnings, bulk flow toggling, TFA effective permissions, safer richtext extensions, GraphQL type fixes, and cache performance gains.
Notable fixes in this week's Directus update: confirmation dialogs and warnings when editing public policies for better security awareness, bulk actions for flows, proper TFA enforcement with inherited permissions, isolated richtext extensions to prevent editor breakage, GraphQL type corrections for NOT NULL fields with defaults and geometry subtypes, improved cache performance with Redis hash support, and keyboard focus accessibility for tooltips.
Week of September 21, 2026
What shipped
- Version 12.4.0 released with MapLibre GL JS updated from 1.15.3 to 6.9.0, now requiring WebGL2 support. Release
- Flows moved to its own top-level module with folder organization support and a new type column to distinguish flow folders from file folders. Pull request #28206
- Added
preview_base_urlsetting to allow configuring a base URL for collection previews via a new $preview_base_urlvariable. Pull request #28227 - Images in the WYSIWYG editor can now carry links with href, target, and rel attributes stored on the image node. Pull request #28289
- Richtext extension type ported to integration branch with authors importing Tiptap directly instead of through SDK re-exports. Pull request #28261
- License boot no longer holds store locks during startup, with a new generic runExclusive utility to manage exclusive function execution. Pull request #28215
- Fixed Oracle year() function to return calendar year using YYYY format mask instead of ISO week-numbering year. Pull request #28257
- Fixed Oracle JSON comparison to return unquoted strings by prioritizing JSON_VALUE over JSON_QUERY. Pull request #28264
- Fixed folders endpoint crash when non-admin users attempted to read, which was writing to a frozen object. Pull request #28286
- Updated vitest to v4.1.11 and related packages, addressing security advisory GHSA-82fw-gwwq-j7x9. Pull request #28249
Why it matters
Version 12.4.0 introduces significant structural improvements with Flows as a top-level module and enhanced preview capabilities, while also addressing database compatibility issues with Oracle and improving startup performance. Multiple quality-of-life features for content editors and extension developers ship this week.
Changelog entry
- ⚠️ BREAKING: MapLibre GL JS upgraded to 6.9.0, now requires WebGL2 (Safari 14 and older Android devices not supported) Release
- Flows module moved to top-level navigation with folder organization and type classification for flow vs file folders Pull request #28206
- Added
preview_base_urlsetting and $preview_base_urlvariable for preview URL configuration Pull request #28227 - Images in WYSIWYG editor now support links with href, target, and rel attributes Pull request #28289
- Richtext extension type added with direct Tiptap import pattern for extension authors Pull request #28261
- License boot no longer holds store locks during startup with new runExclusive utility Pull request #28215
- Fixed Oracle year() function to return calendar year instead of ISO week-numbering year Pull request #28257
- Fixed Oracle JSON comparison to return unquoted scalar strings Pull request #28264
- Fixed folders endpoint crash for non-admin users Pull request #28286
- Updated vitest to v4.1.11, addressing security advisory GHSA-82fw-gwwq-j7x9 Pull request #28249
Directus 12.4.0 is out. Flows get their own module, images in WYSIWYG can now link, preview URLs are configurable, and startup is faster. MapLibre GL JS upgraded to v6.9.0 (WebGL2 required).
Directus 12.4.0 is available. This release reorganizes Flows into a dedicated top-level module with folder support, adds configurable preview base URLs, enables linking in WYSIWYG image blocks, and improves startup performance by eliminating lock contention during boot. We also upgraded MapLibre GL JS to v6.9.0, which requires WebGL2 support. Oracle users benefit from fixes to year() and JSON comparison functions.
Week of September 14, 2026
What shipped
- Flows moved out of Settings into a dedicated module with its own navigation bar and folder browsing support. Pull request #28221
- Blackbox tests fully migrated to E2E test suite with new utils for sandbox ports, collaborative editing, and websockets testing. Pull request #28226
- Disabled collections now stay in schema while blocking CRUD operations, with new CollectionInactiveError for proper error handling. Pull request #27792
- MinIO replaced with RustFS in e2e sandbox and blackbox stacks to resolve Docker Hub registry issues. Pull request #28234
- Maplibre-gl updated from 1.15.3 to 6.9.0 with type renames and mechanical updates across five major versions. Pull request #28216
- Relational fields now export in the requested order instead of always appearing last. Pull request #28197
- Block editor no longer flickers while editing a version by removing unwanted _user and _date markers from delta objects. Pull request #28105
- Duplicate update entries no longer lose translation edits when useRelationMultiple.update() is called twice for the same row. Pull request #28247
- Concurrent local KV increments and maximum updates fixed by reading synchronously before writes. Pull request #28194
- Stream-json bumped from 1.9.1 to 3.6.0 to resolve GHSA-528h-pc64-c93x security advisory. Pull request #28251
Why it matters
This week focused on infrastructure improvements and bug fixes. The test suite migration to E2E provides better testing coverage, while the Flows module reorganization improves user navigation. Several critical fixes address data integrity issues in relational fields, block editors, and concurrent operations.
Changelog entry
- Flows moved from Settings to dedicated module at /flows with folder navigation and module bar entry Pull request #28221
- Blackbox tests fully migrated to E2E suite with utils for sandbox ports, collaborative editing, and websockets Pull request #28226
- Disabled collections retained in schema with new CollectionInactiveError for CRUD blocking Pull request #27792
- MinIO replaced with RustFS (1.0.0-rc.6) in e2e sandbox and blackbox stacks Pull request #28234
- Maplibre-gl updated from 1.15.3 to 6.9.0 Pull request #28216
- Relational fields now export in requested order instead of always appearing last Pull request #28197
- Block editor no longer flickers when saving versions Pull request #28105
- UseRelationMultiple.update() now replaces existing entries instead of duplicating for same primary key Pull request #28247
- Concurrent local KV increments and setMax() fixed with synchronous read-before-write Pull request #28194
- Row context menus no longer stay open when another row's menu is opened Pull request #28191
- /schema/apply no longer drops collections when first diff entry is nested meta delete Pull request #27880
- Foreign key constraints no longer dropped when updating relations with partial payloads Pull request #28137
- Flows list columns improved with better sizing and Folder column repositioned before Status Pull request #28225
- @unhead/vue updated to 3.4.1 resolving GHSA-g5xx-pwrp-g3fv and GHSA-95h2-gj7x-gx9w Pull request #28248
- Stream-json bumped to 3.6.0 resolving GHSA-528h-pc64-c93x Pull request #28251
- Joi updated to 18.2.9 and express updated resolving multiple low-severity advisories Pull request #28242
This week: Flows gets its own module, blackbox tests migrate to E2E, disabled collections handled properly, relational export ordering fixed, and maplibre-gl updated to v6.
This week's updates bring significant improvements to Directus. Flows is now a dedicated module with full folder support. The test infrastructure fully migrated to E2E, providing better coverage. Critical fixes ensure relational fields export in correct order, block editors render smoothly, and concurrent KV operations work reliably. Infrastructure updates replace MinIO with RustFS and modernize maplibre-gl to v6.