This release introduces video subtitles management, improved authentication handling, and several navigation and asset visibility bugfixes.
You can now manage subtitles directly within the Media Library for your video assets. The new Subtitles view in the video sidebar lets you generate AI-powered subtitles in 22 languages, upload your own VTT or SRT files, and preview subtitle segments with timestamps. Generated subtitles are clearly marked so you can distinguish them from manually uploaded files.
The Media Library now handles token refreshes more gracefully. Previously, if your authentication token expired (for example, after your laptop woke from sleep), you might see authorization errors with no recovery. Now tokens are refreshed automatically, and any failed requests retry with the fresh token.
Changing an asset's visibility between public and private now works correctly even when the asset has unpublished draft changes. The visibility setting is always read from and applied to the published document, preventing drafts from accidentally overwriting your visibility preferences.
sanity-plugin-internationalized-array now stores the language identifier in a dedicated language field instead of using _key for this purpose.
When a field has outdated data a warning banner will render to alert users.
Sanity uses _key internally for array item identity, diffing, and reordering. Storing the language ID there caused issues with:
Before (v4):
{
"_key": "en",
"_type": "internationalizedArrayStringValue",
"value": "hello"
}
After (v5):
{
"_key": "randomKey",
"language": "en",
"_type": "internationalizedArrayStringValue",
"value": "hello"
}
sanity-plugin-internationalized-array now stores the language identifier in a dedicated language field instead of using _key for this purpose, and @sanity/document-internationalization has a direct dependency on this plugin to manage the translations.metadata files.
When a field has outdated data a warning banner will render to alert users.
Sanity uses _key internally for array item identity, diffing, and reordering. Storing the language ID there caused issues with:
Before (v4):
{
"_key": "en",
"_type": "internationalizedArrayStringValue",
"value": "hello"
}
After (v5):
{
"_key": "randomKey",
"language": "en",
"_type": "internationalizedArrayStringValue",
"value": "hello"
}
Read the full migration guide here for this plugin.
You can also read the migration guide for internationalized-array here.
The standalone sanity-import CLI binary has been removed from @sanity/import. Users relying on sanity-import as a one-off binary should migrate to sanity dataset import instead, which provides the same functionality as part of the Sanity CLI.
The sanity-import CLI binary has been removed.
Use sanity dataset import <file.ndjson> going forward.
Fixes an issue where studios would have no icon in the dashboard after deploying (regression in v5.14.0).
This release adds shareable release links, improves Studio reliability on unstable networks, fixes validation context inconsistencies, and resolves several crashes and display issues across the editor interface.
Content agent bundle versions now show as "Proposed changes" instead of raw IDs like agent-aBcXyZ. Other users' bundles are hidden from the UI.
You can now click the share icon on a release for quick access to a copy-able link to the release, the release ID, or release title.
The Hotspot and Crop tool now display the dimensions of the crop area in pixels.
Shoutout to @fvieira for the suggestion, and @wotan-allfather for the initial implementation ❤️
currentUser to validation contextAdds currentUser to the validation context. Fixes an issue where context.currentUser and context.hidden on the validation property in a schema was inconsistent and could return the wrong values.
useRouter (or similar) would cause the studio to crash.media is omitted from preview.prepare(). To opt out of the schema icon, return media: null or media: false.console.warn about hotkeys stability that fired on every render in the Portable Text input.operations.delete.execute() called without arguments caused a crash in custom components or document actions._key values for all nested items, not just the top-level item.@sanity/assist has been ported to the Sanity plugins monorepo. This major release brings several breaking changes as part of the migration, while keeping all existing plugin functionality intact.
Please review the list of breaking changes below before upgrading.
If you are not yet on Studio v5 or React 19, you should remain on @sanity/assist v4.x until you upgrade.
Sorting a collection by title and scrolling down could cause assets from outside the collection to appear. This has been resolved.
Libraries with large collections now load faster when browsing assets.
This release adds grid layout support for primitive type arrays, introduces a new blueprints plan feature to preview deployments, improves array size limit handling, and fixes issues with Word paste formatting and video field loading.
Previously, primitive type arrays allowed you to set a grid layout, but didn’t display it. They now show a grid layout as expected if the option is chosen in the schema.
New blueprints plan feature: this command outputs a summarized plan generated by the Blueprints API detailing what will happen during a deploy. It uses the same server-side logic as a real Stack update.
We’ve also updated the blueprints doctor output to be better organized and more specific to help diagnose issues locally and in the Stack deployment configuration.
There’s a new icon in the document pane that lets you copy a link to the document (in studio), or copy the document’s ID.
When unknown fields include a reference, the warning will now provide additional details about the reference itself to help with debugging.
When array fields reach their maximum valid size, the Studio UI now more clearly expresses this by disabling the ability to add new items to the array. Thanks to @wotan-allfather for this contribution! We ❤️ PRs from the community.
Studio will now show an improved warning when trying to view a release that no longer exists.
The DocumentLocation type now supports optional icon and showHref properties for customizing location entries in the Presentation tool.
resolve: {
locations: {
page: defineLocations({
select: { title: 'title', slug: 'slug.current' },
resolve: (doc) => ({
locations: [
{
title: 'Email Preview',
href: `/email/${doc?.slug}`,
icon: EnvelopeIcon, // Custom icon
showHref: false, // Hide URL
},
{
title: 'Web View',
href: `/pages/${doc?.slug}`,
// Defaults: DesktopIcon, URL visible
},
],
}),
}),
},
}
Existing configurations will continue to work without changes.
This month we’ve introduced a bunch of behind-the-scenes improvements to the documentation platform, surfaced more reference docs, and improved the Roles guide.
We’ve added more libraries to our typescript reference docs. You’ll now see @sanity/blueprints, next-sanity, and more libraries soon.
The roles and permissions API guide now uses the Access API instead of the older Roles APIs. You can still use the previous approach, but for new code we suggest the Access API.
We’ve migrated the entire Sanity docs site to Next 16, which unlocked a wide range of improvements including dramatically faster loads, better performance, improved UX, and reduced client-side errors. This refactor also lays the groundwork for upcoming cacheComponent support via next-sanity, ensuring Sanity docs continues to use the latest features and capabilities of our platform.
Are you a part of our Discord community? If so, you may have seen the #releases channel change from an RSS feed to our new releases bot. It’s built with Sanity Functions and should provide a better experience if you follow our updates through Discord. Perhaps you’re reading this there right now.
The Sanity docs now detect and respond to HTTP Accept headers with appropriate content and a matching Content-Type header. Most documentation pages support Accept: text/markdown, while our HTTP API Reference pages support Markdown, YAML, and JSON requests.
This feature ensures that Sanity docs properly handle incoming agentic AI / LLM requests and respond with the most performative content.
We’ve added broad categories to our changelog section and improved the sidebar filtering UI/UX. You can now explore changes by high-level category , or drill down into specific subsets of products.
Easily navigate between categories or related changelog entries with the new header breadcrumb, inline filtering, and “previous/next changelog” buttons.
The asset list search action has been renamed to “Find in view”, with a conditionally shown input and improved responsiveness on smaller screens. Empty results from search or filters now show clear feedback with a reset option instead of a blank space.
Fixed an issue where adding many assets to a collection (for example during bulk uploads) could trigger rate limits, causing some assets not to appear. Assets now load in batches, with placeholders shown in the grid during upload.
create_documents_from_json and patch_document_from_json, which ensure that requested changes conform to the deployed schema.This release makes the enhanced object dialog the default, adds AI CLI tool detection during setup, and fixes breadcrumb navigation issues.
enhancedObjectDialog is now the defaultThe beta.form.enhancedObjectDialog option has been removed. The enhanced object dialog is now always enabled and is now the default. If you previously used the beta config setting, you can safely remove it.
When setting up AI tooling with Sanity, users with Gemini CLI, GitHub Copilot CLI, or Codex CLI installed will now see them offered during sanity mcp configure and sanity init.
This release improves reference field creation filtering with dynamic options, fixes document publishing issues, and enhances the display of nested content and release titles.
It is now possible to apply dynamic document based filtering to the acceptable schema types from which to create a new reference field. When a document contains a reference field with a to that includes multiple schema types, by defining an options.creationTypeFilter callback, the available schemas when selecting Create can be restricted.
If creationTypeFilter returns [] then the create button will be hidden from the reference field. This is identical behavior to using options.disableNew: true
defineField({
name: 'participant',
title: 'Individual or team participant,
type: 'reference',
to: [{type: 'individual'}, {type: 'team'}],
options: {
creationTypeFilter: ({document}, toTypes) => {
if (document.participantType === 'individual') {
return toTypes.filter((t) => t.type === 'individual')
}
if (document.participantType === 'team') {
return toTypes.filter((t) => t.type === 'team')
}
return toTypes
},
},
})
markDefs) on some PTE nested objects, instead shows the content in the PTE’s previewInternal improvements to error handling and observability. No user-facing changes.
This release includes improvements to the editing experience with fixes for comment popovers and keyboard navigation in code editors.
Fixes asset editing issues by improving mutation handling and state management, resolving character duplication, array key conflicts, and concurrent editing inconsistencies.
This release announces the general availability of Sanity TypeGen, improves the Portable Text Editor, fixes critical issues with Media Library asset insertion and comment sharing links, resolves UI problems with timezone selection and dialog flickering, and enhances file upload handling.
Sanity TypeGen has reached general availability. TypeGen automatically generates TypeScript types from your Sanity schemas and GROQ queries, providing type safety throughout your content workflow.
Key features include automatic type generation during development, support for multiple file types (TypeScript, JavaScript, Astro, Svelte, Vue), utility types for working with complex schemas, and watch mode for separate repositories.
Learn more in the documentation, read the announcement blog post, or take the Sanity Learn course.
Using document types as reusable fields is considered an anti-pattern. The CLI now prints a warning if a document type is used as the type of a field.
Blocks and inline blocks in PTE now expose a changed props like all other PTE items.
discard_drafts for a clearer API.create_dataset, update_dataset, and list_datasets now support a description field.search_docs and read_docs tools for accessing Sanity documentation instead of web searches.params: null in JSON-RPC notifications (e.g. Claude Code, Cursor) would receive errors.preview field with a null select value.