Global draft versions across every collection, an AI Assistant that reads images and documents, deployments with role-based access and real-time status updates, and a new way to query into JSON fields. v11.16 rounds out a lot of the foundations we've been building leading up to v12, and every piece here makes the day-to-day noticeably better. Let's get into it.
Breaking Changes
🟡 (Low risk) Visual Editor field permissions and versioning: The Visual Editor now enforces field-level permissions and version access checks. If you're using @directus/visual-editing, update to v2.0.0 or later to maintain compatibility.
🟡 (Low risk) Global draft version standardization: If you have an existing content version with the key draft and a custom display name, the custom display name will be standardized to "Draft" to support the new global draft system. Your version content and functionality are unchanged.
🟡 (Low risk) Password reset for external auth users: requestPasswordReset now returns a Forbidden error for users managed by external auth providers (LDAP, OAuth, etc.) instead of silently sending an email that can't be used.
Global Draft Versions: Every Collection, No Setup Required
If you've used content versioning in Directus, you know the friction. You enable versioning on a collection, and then you have to manually create a draft version for each item before you can stage changes. For teams working across dozens of collections and hundreds of items, that adds up fast.
v11.16 changes the model. When you enable versioning on a collection, every item automatically gets a global draft version. No manual setup, no per-item version creation. Open any item, switch to the draft, make your changes, and promote when you're ready.
This also extends into the Visual Editor. You can now select which version you're editing directly in the live preview, and the Visual Editor enforces field-level permissions so users only see and edit what their role allows. Draft a homepage update in the visual editor, preview it live, and publish it, all without touching the main version until you're ready.
Under the hood, the draft version uses a reserved draft key. If you already had a version with that key, the display name gets standardized to "Draft" but nothing else changes. Your content stays exactly where it was.
The bottom line: Every versioned item gets a draft by default. Stage changes, preview them, and publish when ready, without creating versions by hand.
Learn more in our docs → Content Versioning | Directus Docs
AI Assistant: Now With Eyes
The AI Assistant shipped to GA in v11.15 with multi-provider support and content awareness. v11.16 gives it the ability to actually see things.
You can now upload images and PDFs directly into an AI conversation. Drag and drop a file, pick one from your local machine, or pull it straight from the Directus File Library. The assistant processes the file through your configured provider and can answer questions about what's in it.
The practical applications are immediate. Upload a product photo and ask the assistant to write alt text. Drop in a PDF contract and ask it to summarize the key terms. Attach a design mockup and ask for copy suggestions based on the layout. Instead of describing what you're looking at, you just show it.
This works across all three major providers: OpenAI, Anthropic, and Google Gemini, each through a native adapter that handles the provider's file API directly. The server validates files with a 50MB limit and supports images, PDFs, text, audio, and video. File thumbnails show up in your conversation history so you can track what was shared.
One thing to note: if you upload files in a conversation, you can't switch providers mid-thread. Provider file references are session-specific, so the assistant locks to your current provider once files are in the context. Start a new conversation if you need to switch.
The assistant also picks up a new Ask User tool in this release. Instead of guessing at ambiguous requests, the AI can now ask you clarifying questions before acting. It's a small addition that makes the responses noticeably more useful.
The bottom line: Your AI Assistant can process images, PDFs, and other files natively. Show it what you're working on instead of describing it.
Learn more in our docs → AI Assistant | Directus Docs
Deployment Module: Open It Up to the Team
When the deployment module launched in v11.15, it was admin-only. Useful, but it meant the people who actually publish content couldn't trigger their own deploys. They had to ask an admin, or wait.
v11.16 adds role-based access control to deployments. Admins can now create roles with specific deployment permissions, so your content team, your marketing lead, or a designated deployment manager can trigger builds without needing full admin access. The UI adapts to the user's role, showing only the actions they're allowed to take.
The other big upgrade is provider webhooks. In v11.15, Directus polled the provider API to check deployment status. Now, Vercel and Netlify push status updates directly to your instance via webhooks. Deployments update in real time, without polling delays and without burning through provider API rate limits. Vercel webhooks use HMAC-SHA1 signature verification, and Netlify uses JWS-based authentication, so the updates are cryptographically verified before they hit your database.
There's also a new deployment dashboard with stats and build time analytics per project, so you can track how your deployments are performing over time.
One setup note: provider webhooks require a publicly accessible URL (your PUBLIC_URL environment variable). If you're running locally, you'll need something like ngrok for the webhooks to reach your instance.
The bottom line: Your team can deploy without asking an admin, and deployment status updates in real time instead of polling.
Learn more in our docs → Deployment Permissions
JSON Field Selection: Query What You Need
If you store structured data in JSON fields, you've probably run into this: you need one value from a nested object, but the API returns the entire JSON blob. For small objects that's fine. For large, deeply nested structures, it's wasteful.
v11.16 adds a json() function that lets you extract specific values from JSON columns. The syntax is straightforward: json(field, path.to.value). Dot notation for nested objects, bracket notation for arrays. So json(metadata, dimensions.width) pulls just the width, and json(data, items[0].name) grabs the first item's name.
It works across every supported database: PostgreSQL, MySQL, SQLite, MSSQL, Oracle, and CockroachDB, each using native JSON functions under the hood. Extracted values preserve their original types (strings stay strings, numbers stay numbers), and missing paths return null instead of erroring.
You can also query into JSON fields on related items, which opens up filtering and selection patterns that previously required pulling entire objects client-side. In future releases, we will build on this with full support for JSON filtering, sorting, and aliasing.
The bottom line: Pull specific values from JSON columns at the API level. Less data over the wire, less parsing on the client.
Learn more in our docs → The json(field, path) Function
Other Improvements
Persisted table column widths: Column widths in table layouts now persist to localStorage. Resize them once, and they stay that way.
MIME type restrictions for file interfaces: File and file selection interfaces now support MIME type restrictions, so you can enforce that an image field only accepts images, or a document field only accepts PDFs.
Auth audit hooks: Login attempts (e.g. erroneous accounts) are now tracked via auth audit hooks, giving you a log of authentication activity for compliance and security monitoring.
MySQL lower_case_table_names support: Directus now respects the lower_case_table_names MySQL setting, fixing compatibility with MySQL instances configured for case-insensitive table names.
Navigate to Item on read-only relational fields: The "Navigate to Item" button now works on relational fields you don't have edit permission for. You can follow the relationship even if you can't change it.
Querystring array limit increased: The default QUERYSTRING_ARRAY_LIMIT has been bumped from 100 to 500, supporting larger filter arrays without custom configuration.
Bug fixes: Fixed batch editing translations creating duplicate junction rows, block editor deleting blocks on save-and-stay, GeoJSON performance degradation in forms, datetime picker not closing after selection, tags interface not resolving variables in raw editor mode, decimal and BigInteger display formatting, and more.
Check out the full release notes on GitHub for the complete changelog.
Directus v11.16 is Available Now
Update your instances to get global draft versions, multimodal AI, role-based deployments, JSON field selection, and everything else in this release.
As always, back up your database before upgrading.