Version 12
Version 12.0.0
Jump to:
License Enforcement
Directus 12 introduces active license enforcement. Self-hosted instances run on the core tier by default. Higher limits and additional features are unlocked by configuring a license. See Licensing for a full explanation.
Post-upgrade Grace Period
The grace period exists to ensure uninterrupted service for existing customers who upgrade before obtaining a license. If your instance is above core tier limits when you upgrade to Directus 12, you enter a 30-day grace period during which everything continues to operate normally. Admins see a reminder on every login.
If you are not an existing customer and do not intend to add a license, reduce usage to within core limits before the grace period ends. Note that free commercial use may be available through the Open Innovation Grant.
If the grace period ends with usage still above core limits, the resolution flow is triggered on next admin login and certain APIs are locked down until resolved.
Locked-Down Behavior
When an instance is over its entitlement limits and the grace period has elapsed:
- The REST
/items,/files, and/flowsendpoints are disabled. - The GraphQL, WebSockets, and MCP APIs are disabled.
/loginis blocked for non-admin users.- SSO continues to work for admins so the license can be resolved.
No data is deleted as a result of enforcement — access is restricted via deactivation or blocking only.
status Field Added to Collection and User Responses
GET /collections responses now include a status of active or inactive in each item's meta object. Inactive collections are those deactivated by license enforcement.
GET /users responses can now return a new inactive-license status in addition to the existing user statuses (draft, invited, unverified, active, suspended, archived). Users with this status have been deactivated because the instance is over its seat entitlement.
Draft Publishing Workflow
Published items in versioned collections are now locked from direct editing
In collections with content versioning enabled, published items can no longer be edited directly. To make changes, switch to the draft version using the new header action button. The Studio also handles this transition automatically:
- Creating a new item in a versioned collection opens a virtual draft. The URL takes the form
collection/+?version=draft. - Editing a published item in a versioned collection automatically switches the editor context to draft mode.
?version=main renamed to ?version=published
The query parameter used to retrieve the published version of an item is now ?version=published. The previous ?version=main value continues to work, so existing integrations are not broken — but new code should use ?version=published.
Collection status replaced with an archived boolean
The collection-level status string has been replaced with an archived boolean for newly created collections. Existing collections that use the string-based status field continue to work as before, so no migration is required.
Publishing a version no longer requires a second confirmation
Publishing a version previously required two confirmations — one in the comparison modal, and a second confirmation dialog after it. The second dialog has been removed: confirming the changes in the comparison modal now publishes the item directly.
Extension Compatibility
The Studio has had a design refresh in Directus 12. Most extensions are unaffected, but theme and interface extensions may need updates. The following notices are grouped by area.
Removed and replaced theme properties
The following theme properties have been removed. Theme extensions that reference them will continue to load but the affected styling will no longer have any effect.
| Removed | Replacement |
|---|---|
navigation.background, navigation.backgroundAccent, navigation.borderWidth, navigation.borderColor | shell.background, shell.backgroundAccent, shell.borderWidth, shell.borderColor |
header.background, header.borderWidth, header.borderColor | Same shell.* tokens as above |
header.headline.foreground, header.headline.fontFamily | Removed without replacement |
headerShadow, sidebarShadow (LayoutConfig, defineLayout()) | Removed without replacement |
boxShadow (header theme rules schema) | Removed without replacement |
section.toggle.borderWidth, section.toggle.borderColor | Section-level border tokens |
navigation.project.borderColor, navigation.project.borderWidth, navigation.project.background | Removed without replacement |
borderColorFocus, boxShadowHover, boxShadowFocus | Migrate to focus ring tokens (see below) |
CSS variable migrations:
--theme--navigation--*and--theme--header--*→--theme--shell--*--theme--form--field--input--border-color-focusand--theme--form--field--input--box-shadow-focus→--theme--form--field--input--focus-ring-color
The focus ring is now implemented via the CSS outline property rather than border/box-shadow.
Component deprecations
The following components and props have been deprecated. Existing usage continues to function — extensions will see Volar hints — but should be migrated.
<v-resizeable>— migrate to@directus/vue-split-panelor an alternative.<v-breadcrumb>— deprecated globally.<v-drawer>: thesubtitleprop,subtitleslot,header:appendslot, andactions:appendslot. Use the newactions:primaryslot for primary call-to-action components.v-buttonroundedprop — removed. Existing usage continues to function but buttons render as rounded rectangles instead of circles.
Slot deprecations on the header bar
The private view header bar has changed:
- The
#headlineslot has been deprecated. - The
actions:appendslot has been deprecated. Existing usage still renders in the secondary-actions zone, but should be migrated to the newactions:primaryslot.
Get once-a-month release notes & real‑world code tips...no fluff. 🐰