Sanity Release Notes
136 release notes curated from 110 sources by the Releasebot Team. Last updated: Nov 7, 2026
- Nov 6, 2026
- Date parsed from source:Nov 6, 2026
- First seen by Releasebot:Nov 7, 2026
Insights works with @sanity/client 8.15
Sanity updates Context to use the supported client request method, restoring conversation saving and classification with client 8.15 or later.
@sanity/client 8.15.0 removed the client.context.conversations methods that @sanity/context 3.0.0 called. With that client, conversations weren't saved and classification failed, but your agent kept working and logged [sanity-insights] Failed to save conversation on each turn. This release uses client.context.request instead.
@sanity/context now needs @sanity/client 8.15 or later. Upgrade both with npm install @sanity/client@latest @sanity/context@latest. See Add insights to Sanity Context.
Original source - Nov 6, 2026
- Date parsed from source:Nov 6, 2026
- First seen by Releasebot:Nov 7, 2026
Studio plugin removed, cleaner Insights transcripts
Sanity removes the Context Studio plugin from Insights installs, adds React 18 support, and keeps saved AI transcripts free of provider metadata.
The Studio plugin (@sanity/context/studio) is removed, so installing @sanity/context for Insights no longer adds Studio to your app, and it works in React 18 apps. Still using the plugin? Stay on @sanity/context@^2, or see Migrate from the Context Studio plugin to the new Context app.
Saved transcripts now contain only user text, assistant text, and tool calls. On AI SDK v7, provider metadata was being saved as JSON in assistant messages. No code changes are needed if you only use Insights. See Add insights to Sanity Context.
Original source All of your release notes in one feed
Join Releasebot and get updates from Sanity and hundreds of other software products.
- Nov 3, 2026
- Date parsed from source:Nov 3, 2026
- First seen by Releasebot:Nov 4, 2026
v6.22.0
Sanity releases Studio v6.22.0 with smoother document navigation, updated releases and variants menus, and clearer warnings when uploaded assets don’t meet field requirements. The update also brings performance improvements and a range of bug fixes.
Sanity Studio v6.22.0
This release includes various improvements and bug fixes.
For the complete changelog with all details, please visit:
www.sanity.io/changelog/studio-Ni4yMS4w
Install or upgrade Sanity Studio
To upgrade to this version, run:
npm install sanity@latestTo initiate a new Sanity Studio project or learn more about upgrading, please refer to our comprehensive guide on Installing and Upgrading Sanity Studio.
📓 Full changelog
Author Message Commit @pedrobonamin fix(core): restore the releases classic navbar pill when variants are off (#15745) b42942c @pedrobonamin chore(structure): remove document target badges and onboarding hint (#15712) 68eeac4 cursor[bot] test(field): cover review changes revert edge cases (#14934) e9533eb cursor[bot] test(router): cover scoped search param bracket parsing (#15705) be5bc91 @jordanl17 feat(validation): warn when an asset does not match its field's accept option (#15673) 20d67d5 @pedrobonamin chore(vision): ignore disconnected vista symbols in knip (#15747) e9cf32d cursor[bot] test(field): cover review changes list grouping (#15310) 7d3ba79 @pedrobonamin chore(core): adds releases detail link in releases dropdown menu items (#15737) 0f366c2 @pedrobonamin feat(structure): add document panel navigation with a variants menu (#15706) 5975502 @pedrobonamin chore(structure): document navigation menu for releases (#15707) 7177d0e @pedrobonamin chore(structure): adds scheduled drafts form dropdown (#15711) da3ba56 cursor[bot] test(presentation): cover overlay schema helper edge cases (#15486) 7af7459 cursor[bot] test(storybook): add ui5 sentinels for filter empty state menu actions and validation icons (#15715) 23952d0 @juice49 fix(vision): temporarily remove Vista imports (#15744) 128cce1 @pedrobonamin fix(test): collect chromium garbage after every browser test file (#15730) 2d3f570 squiggler-app[bot] fix(deps): update sanity-sdk to ^3.12.0 (#15726) dab80c8 @juice49 chore(vision): narrow @pierre/diffs to 1.6.2 (#15742) ffe3b50 squiggler-app[bot] chore(tests): generate dts tests 🤖 ✨ (#15733) 9dd43e4 @stipsan chore(deps): remove leftover unused dependencies and knip workspace ignores (#14124) e92a787 @bjoerge fix(deps): upgrade @sanity/bifur-client to v3 (#15734) f89e9bc @joshuaellis feat(core): name the studio as the parent of federated asset sources (#15722) 9ab54e2 @jonahsnider fix(validation): allow release documents to reference documents in the same release (#15703) 0e387ce @rexxars fix(presence): stop reconnecting after authorization rejection (#15702) 80fc682 @jordanl17 fix(core): keep auth secrets out of the url when the studio fails to boot (#15337) c77bdc3 @juice49 fix(sanity): document inventory group overflow with scrolling ancestor (#15720) 1e0c803 @juice49 feat(sanity): refine document group inventory (#15713) 945d0bd squiggler-app[bot] chore(deps): update dependency @sanity-labs/groq-wasm to ^1.0.3 (#15586) 8516416 squiggler-app[bot] fix(deps): update portabletext (#15719) fce4307 @laurenashpole fix: remove trim from nested text (#15701) 9fd9464 squiggler-app[bot] fix(deps): update dependency xstate to ^5.33.3 (#15591) 2990658 squiggler-app[bot] chore(tests): generate dts tests 🤖 ✨ (#15714) b7b83ae squiggler-app[bot] fix(deps): update dev-non-major (#15592) cf8e208 @jordanl17 fix(releases): report release permissions correctly from the dry run (#15606) 4dffc69 squiggler-app[bot] chore(deps): update dependency @sanity/ui to ^4.4.10 (#15504) 75a40e9 squiggler-app[bot] chore(deps): dedupe pnpm-lock.yaml (#15710) ff44850 cursor[bot] test(storybook): add ui5 sentinels for object dialogs and failed schedules (#15640) 3af8d56 squiggler-app[bot] fix(deps): update sanity-sdk to ^3.10.0 (#15647) 9f0a730 @jordanl17 fix(form): render relative-only url fields as text inputs (#15692) c47a3e5 cursor[bot] test(form): cover array item schema type resolution (#15614) 416e36f squiggler-app[bot] chore(deps): update dependency ui5 to v5.0.0-alpha.19 (#15644) 0a59938 squiggler-app[bot] fix(deps): update dependency groq-js to ^2.0.1 (#15645) 19a70eb squiggler-app[bot] fix(deps): update dependency @sanity/cli to ^8.25.0 (#15648) eab12de @pedrobonamin feat(structure): open the document right away while intent links resolve (#15683) 890ddaf @jonahsnider feat(schema): upload encoded schema descriptors (#15681) a43dc62 @pedrobonamin chore(core): updates variants menu (#15641) 943a35a @pedrobonamin chore(core): allow creating from variants menu (#15650) cc66c84 @pedrobonamin chore(core): releases menu updates (#15653) 72c210d @pedrobonamin chore(core): rename GlobalPerspectiveMenu to ReleasesMenu (#15654) 6991a07 @pedrobonamin chore(core): variants and releases menu UX updates (#15655) 5c2af1f @pedrobonamin fix(core): move perspective pickers into the nav drawer on mobile (#15659) 5162998 squiggler-app[bot] chore(deps): update dependency @sanity/visual-editing-csm to ^3.0.19 (#15643) 0fe0052 claude[bot] fix(structure): promote custom first action as primary for live-edit documents (#15686) 1124da6 @pedrobonamin chore(core): move variants perspective selector into navbar (#15635) 40cd3e8 @jordanl17 feat(radar): store and show a core studio engine score beside the total (#15531) 88e9dc8 @jordanl17 fix(releases): hold the workspace release limit while releases load and on dialog submit (#15687) f26142a @jordanl17 feat(bench): add per-navigation soft-navigation stats and report rows (#15538) f2e1886 @jordanl17 feat(bench): add soft-navigation mode and scenario (#15537) d08ae23 @jordanl17 feat(radar): render soft-navigation web vitals in a navigation tab (#15535) 34f50e7 @jordanl17 ci(bench): run soft-navigation mode in the daily track-main suite (#15539) da0a5c0 @pedrobonamin docs(agents): require cloud agents to open pull requests as drafts (#15685) de002c9 @jordanl17 feat(sanity): add soft-navigation route descriptor util (#15532) 8c4cd64 @jordanl17 feat(core): add soft-navigation change classifier (#15536) d4b8f0e @jordanl17 feat(core): report soft-navigation web vitals from studio (#15534) 245a0c0 squiggler-app[bot] fix(deps): update portabletext (#15646) c0a0e7f @gu-stav fix(core): stop studio reloads from reloading workbench (#15443) a2b8c4c squiggler-app[bot] fix(deps): update dependency @sanity/client to ^8.13.0 (#15649) 45e94d2 @gu-stav feat(core): support auto-updating studios in workbench (#15553) 6fe51da @jordanl17 fix(releases): apply the workspace release limit wherever a release can be created (#15603) e23edf1 @RostiMelk perf(structure): preload the document so it is ready when its pane opens (#15675) 9964a63 @RostiMelk perf(structure): open intent links without resolving the whole structure (#15661) f3659de @RostiMelk perf(structure): search the structure without waiting for the document type (#15674) 6730c94 @jonahsnider fix(validation): cancel abandoned reference batches (#15652) 05ef2d9 @pedrobonamin fix(variants): use dated api version instead of vX (#15568) 1ada254 @pedrobonamin fix(router): accept intent links without params (#15639) 4e7479b Original source - Nov 3, 2026
- Date parsed from source:Nov 3, 2026
- First seen by Releasebot:Nov 4, 2026
Usage tools and safer schema editing
Sanity adds tools for viewing project, organization, and Media Library usage, improves project and schema workflows, and fixes schema preservation, deployment guidance, document patching, and release validation.
New Features
- usage_snapshot_get and usage_history_get tools: Read API request, document, AI, and other usage for projects, organizations, and Media Libraries.
Improvements
- create_project tool: Configure the appropriate default CORS origin when given a supported app-builder alias.
- get_schema tool: Deprecated the schemaId selector.
- list_workspace_schemas tool: Deprecated in favor of get_schema for inspecting the deployed schema.
Fixes
- schema_fields_patch and schema_types_delete tools: Preserve validation and other settings on fields and types you haven't edited, avoiding unrelated conversion-loss reports. The deprecated allowLossy parameter is now ignored.
- Schema deployment: Corrected guidance to distinguish registered Studio schemas from legacy schema documents, including the command for self-hosted Studios.
- patch_documents tool: Fixed patches with negative array indices being rejected when followed by additional unset operations.
- documents_validate tool: Accept references from a release document to documents in the same release, and flag references to documents the release unpublishes.
- Schema validation: Messages for undeclared document types and fields now say "error" when they block create_documents or patch_documents, and documents_validate reports those documents as invalid. These errors also explain that the deployed schema must be updated.
- Nov 3, 2026
- Date parsed from source:Nov 3, 2026
- First seen by Releasebot:Nov 4, 2026
Faster Structure Tool intent resolution, and bugfixes
Sanity opens documents immediately while intent links resolve, improves mobile release navigation and validation, adds Context MCP endpoint commands, and tightens release permissions and limits. It also fixes presence, URL validation, and intent-link handling.
Open the document right away while intent links resolve
Document links no longer wait for the structure tool to find the document's place in a slow custom structure. The document opens first, and the lists fill in around it.
🐛 Notable bugfixes and improvements
- The releases and variants pickers move into the navigation drawer on small screens, so the navbar stays usable on mobile.
- Studio no longer logs "WebSocket connection to '…' failed: Page entered Back-Forward Cache" when you navigate away, and presence works on a page restored with the browser's back button.
- @sanity/validation no longer reports references between documents in the same release as unpublished, and exports withReleaseReferences for custom getDocumentExists implementations. The requirePublishedReferences argument of useValidationStatus, useSetImmediateValidation and DocumentStore.pair.validation is deprecated and ignored.
- Release actions no longer report a missing permission after a dry run fails for another reason, such as reaching the plan release limit. Publish and Schedule are now disabled when the user can't publish one of the release's documents.
- Fixed url fields with Rule.uri({relativeOnly: true}) showing invalid styling on valid relative URLs.
- New sanity context mcp commands list, inspect, create, update, delete and check Context MCP endpoints. update and delete refuse endpoints a blueprint manages.
- The workspace release limit now also applies to creating a release from the Releases tool, duplicating a release, and reverting a release.
- useIntentLink and IntentLink can now omit params. The link resolves to /intent/, and intent handling treats the missing params as an empty object.
Similar to Sanity with recent updates:
- Anthropic release notes945 release notes · Latest Nov 7, 2026
- Figma release notes183 release notes · Latest Nov 6, 2026
- Obsidian release notes125 release notes · Latest Nov 3, 2026
- Shopify release notes800 release notes · Latest Nov 6, 2026
- Cloudflare release notes2425 release notes · Latest Nov 6, 2026
- Raycast release notes28 release notes · Latest Nov 4, 2026
- Nov 3, 2026
- Date parsed from source:Nov 3, 2026
- First seen by Releasebot:Nov 4, 2026
Set workspace, perspective, and semantic search on the endpoint
Sanity now shares MCP dataset settings across agents, keeps semantic search on by default, and adds a configuration-only endpoint URL version.
Workspace, perspective, and semantic search are now settings on an MCP endpoint's dataset source, so every agent that connects gets the same behavior. Semantic search stays on by default.
New endpoint URL version
Endpoint URLs now use v2026-11-03, which serves the endpoint's configuration only and refuses query parameters such as groqFilter or perspective with 400. URLs on v1 keep working as before, parameters included. To move an agent over, copy the endpoint URL from the Context app and set any parameters it used on the endpoint instead.
Original source - Oct 30, 2026
- Date parsed from source:Oct 30, 2026
- First seen by Releasebot:Nov 2, 2026
Context and KBs now power the Ask AI agent, plus new guides and improvements across the platform
Sanity expands its documentation with new guides across datasets, Studio, APIs, assets, agents, and billing, while upgrading the docs site’s Ask agent with Sanity Context and Knowledge Bases, page-aware questions, and improved code links.
This month we added new guides for dataset environments, upgrading older @sanity/client versions, and diagnosing API request spikes. The docs site also adds an improved “Ask agent” feature, powered by Sanity Context and Knowledge Bases.
New and updated docs
Datasets, environments, and limits
- New guide: Development, staging, and production environments explains how drafts, releases, preview, separate datasets, Cloud Clone, and export and import fit together across environments.
- How to use Hot Swapping for datasets now lists what doesn't work through a dataset alias, and scopes hot swapping to recovery and breaking migrations.
- Drafts and versions (previously Drafts) now covers both draft and version documents.
- Backups clarifies which plans include backups, that you turn them on per dataset, and how to confirm they're running.
- Technical limits adds the limit of 200 active releases per dataset, and clarifies that document limits are plan quotas counted across datasets.
Studio
- New guide: Archive documents without deleting them compares unpublishing, an archived field, deleting and restoring, and unpublishing in a release.
- New guide: Reorganize your structure without breaking links shows how to rename and move Structure Builder items without breaking saved URLs.
- New guide: Re-enable browser autocomplete on Studio fields covers per-field and studio-wide overrides.
- Validation shows how to restrict publishing by user role with context.currentUser.
- Handle intents in the Structure Tool explains how to route documents of the same type to different lists based on a field value.
Client libraries and APIs
- New guide: Upgrade @sanity/client from an older major version covers the breaking changes in each major version from v3 to v8.
- Advanced client patterns with @sanity/client adds error handling and routing requests through a proxy. Working with assets in @sanity/client adds upload progress tracking.
- New guide: Diagnose an API request spike helps you find the cause of unexpected API usage with your request logs.
- Add live content to your application covers private datasets, and the new Relay live draft updates through your server guide shows how to get draft-aware live updates without a token in the browser.
- Command Line Interface (CLI) now lists the CLI's requirements, including the hosts to allowlist on restricted networks.
Media Library and assets
- New guide: Update an asset to a new version with the API.
- New guide: Use Media Library with AI agents covers the Media Library tools in the Sanity MCP server, including uploading files from your computer.
- Working with video shows how to get static MP4 renditions of Media Library videos.
- Assets and Keeping your data safe clarify that dataset assets are always public on the asset CDN, even in private datasets.
Functions, Blueprints, and App SDK
- New guide: Manage stacks covers listing, inspecting, and removing Blueprints stacks. The stack limit is now correctly listed as 10 per scope.
- Add environment variables to functions documents the 4KB size limit, and Functions cheat sheet shows how to keep functions from running during an import or sync.
- Create a PubSub function explains that PubSub functions only run when another function invokes them.
- App SDK deployment shows how to turn on auto-updates for App SDK apps, and warns against putting secrets in SANITY_APP_ environment variables.
- App SDK and TypeGen is rewritten for the typegen.resources workflow, with a new Migrate from experimental TypeGen in the App SDK guide.
Sanity Context and Content Agent
- Context MCP tools adds the knowledge_base_search tool. The Context MCP no longer reads a tools URL parameter, so Context MCP reference and Inline initial context into your system prompt now cover filtering tools on the client side.
- Content Agent for Linear is now in the Content Agent navigation, and the Slack and Linear guides explain when the agent can publish.
- Get started with Sanity Content Agent adds the registration step for self-hosted studios.
Organizations, billing, and access
- New: Spending alerts explains how to get notified as your organization's overage spending grows.
- New: Export activity to Google Cloud Storage and the Activity Feed Export data reference.
- Set up single sign-on with SAML explains that role mapping is additive, applies at first login, and doesn't remove users who leave your identity provider.
- Document mutation patterns and Build a custom role with the Access API explain that purging history requires the editHistory permission, which no predefined role grants.
Astro
The Astro docs now recommend the Sanity-maintained @portabletext/astro package (a fork of the community package), and Configuring @sanity/astro documents the clients option added in @sanity/astro 3.6.0.
Platform updates
Ask agent, powered by Sanity Context
The docs site's AI assistant is now powered by Sanity Context and Knowledge Bases, the same tools we document for building your own agents.
- Open it from the “Ask agent” button.
- Use Ask about this page on any article to ask a question with that page as context.
- Type a question into search and send it to the Ask agent.
Smaller improvements
- Code blocks have a Copy link button, so you can link straight to an example.
- Deep links to a code block or heading that is otherwise not rendered (hidden inside a tab, collapsed inside a snippet, etc) will automatically show and render on load.
- We now check the docs for broken internal and external links on a schedule, and block redirects that would break existing pages.
- Oct 30, 2026
- Date parsed from source:Oct 30, 2026
- First seen by Releasebot:Nov 2, 2026
Requires the App SDK 3.11.0 and is MIT licensed
Sanity releases a collaboration package update requiring SDK 3.11.0 or later and adding an MIT license. Documentation guides developers through connecting it to the Sanity App SDK and rendering a comments panel.
This release requires @sanity/sdk and @sanity/sdk-react 3.11.0 or later and adds a license.
Breaking changes
- @sanity/sdk and @sanity/sdk-react 3.11.0 or later are required. 3.11.0 is the first release with the collaboration entry points that @sanity/collaboration/sdk is built on. If you installed a preview build of the SDK, remove the override and install 3.11.0.
Improvements
- The package is MIT licensed and ships its LICENSE file.
Related documentation
Get started with comments
Install @sanity/collaboration, connect it to the Sanity App SDK, and render a working comments panel on one document.
Original source - Oct 29, 2026
- Date parsed from source:Oct 29, 2026
- First seen by Releasebot:Nov 2, 2026
Comments on the organization Comments API and OAuth sessions that stay signed in
Sanity adds beta organization-backed comment hooks with reactions, inline and document comments, and GROQ queries, while OAuth sessions now refresh tokens without interrupting listeners. The SDK also improves app cleanup, organization checks, and message-bus errors.
This release adds beta comment hooks that read and write the same organization-level comments the Studio uses, and keeps OAuth sessions signed in by refreshing the access token before it expires. No code changes are needed. If your OAuth app reads the token from client.config().token, switch to await client.getAuth().
Comments backed by the organization Comments API (beta)
@sanity/sdk-react/collaboration exports comment hooks backed by the organization Comments API, the store the Studio reads. They keep the names of the comment hooks on the package root: useComments, useCommentThreads, and useCommentActions. The framework-agnostic functions are in @sanity/sdk/collaboration. Comments use the organization that owns the project, so there is nothing to configure.
The collaboration hooks also add:
- useCommentsQuery reads comments that match a GROQ filter across documents, and buildCommentThreads groups its flat result into threads. The filter runs across the whole organization, so add a condition to it if your query should stay on one dataset.
- Reactions, with addReaction and removeReaction.
- Inline comments anchored to a run of text in a Portable Text field. updateCommentAnchor moves an anchor without marking the comment as edited.
- Comments on a whole document: call createComment without a fieldPath. The Studio's comments inspector lists field comments only, so these don't appear there.
- An error field on read results. It is set when the live connection drops after comments have loaded, and the list stays on screen as it last stood.
The comment hooks on the @sanity/sdk-react root read the comments add-on dataset. They are deprecated and will be removed in the next major. Don't switch until your Studio reads the Comments API and your existing comments are migrated, or your app and your Studio will show different comments. Moving over takes more than a new import; the migration guide lists the other changes, and the collaboration guide covers every hook and action.
OAuth sessions stay signed in
In OAuth apps, @sanity/sdk now refreshes the access token shortly before it expires. Requests made during a refresh wait for the new token instead of failing with a 401. A refresh no longer restarts listeners or refetches documents and queries: listeners resume where they left off. Tabs on the same origin take turns refreshing, so one tab never uses a refresh token another tab just rotated.
Clients in OAuth apps now follow the current token instead of being recreated on each refresh, so client.config().token no longer holds it. Read it with await client.getAuth() instead. Other auth modes keep a fixed token on each client, so client.config().token still works there.
🐛 Notable bugfixes and improvements
- organizationId on the Sanity config names the organization for apps running outside the Dashboard; organization user lists use it, and AuthBoundary checks it against each project's organization. It is unrelated to auth.oauth.organizationId.
- When the Dashboard removes your app, for example by closing its panel, ResourceProvider disposes its Sanity instance and closes the app's message bus connection, while an app the Dashboard only hides keeps both.
- An SDK call that reaches the message bus after the Dashboard removed your app now throws instead of opening a connection that never closes, so stop timers and pending calls when your app unmounts.
- When the Dashboard refuses a message from your app, the MessageBusError that emit() or query() rejects with can include fix and docsUrl to say how to resolve it.
- Oct 29, 2026
- Date parsed from source:Oct 29, 2026
- First seen by Releasebot:Nov 2, 2026
New send shortcut, Cancel that clears the draft, and a discard action for failed comments
Sanity refines comment input behavior with clearer keyboard shortcuts, draft cancellation and failed-post recovery, while improving send feedback, inline highlights, and comment list alignment.
This release refines how the comment input sends, cancels and recovers from a failed post. Some of these change the behavior of @beta components.
Behavior changes
- Send shortcut: CommentInput and the other comment inputs send on Cmd+Enter, or Ctrl+Enter outside Apple platforms. Enter starts a new paragraph and Shift+Enter a new line. Neither sends while the mention menu is open or while an input method is composing text.
- Cancel: CommentInput always shows Cancel beside the submit control. Cancel empties the draft, including its stored copy, releases focus, so a composer with expandOnFocus folds back, and then calls onDiscard. Escape still calls onDiscard and keeps the draft, and so does an input unmounting, for example when the user switches threads. With confirmDiscard, both ask first. This applies to the reply box, the panel's new-thread composer, InlineCommentInput and the edit box in Comment, where Cancel drops the edited text and keeps the saved message.
- Failed comments: a comment that failed to post (state.type === 'createError') no longer gets the actions menu. Its only action is a discard button that calls onDelete without asking for confirmation. The new optional labels.actions.discard names it and defaults to "Discard". The notice's "Try again" still retries.
Improvements
- Sending a message drops empty lines at either end, and the input clears to one empty line.
- The submit control shows a spinner while busy is set or while a submit is in flight.
- A selected CommentBadge uses the inline highlight's yellow instead of the gray button fill. In dark mode it uses the selected highlight's solid yellow with white text.
- Inline comment highlights fill exactly the line box at any text size and line height, so the bands of a wrapped run meet without overlapping.
- The list's loading text and empty text sit at the same height.
- Oct 29, 2026
- Date parsed from source:Oct 29, 2026
- First seen by Releasebot:Nov 2, 2026
Document-level comments, multi-document panels and DOM styling props
Sanity expands collaboration comments with document-level and multi-document threads, always-visible actions, and improved composer behavior. The update also renames SDK components and changes styling and comment APIs, requiring updates to some existing integrations.
This release lets a comment belong to a whole document, groups comments from several documents in one list or panel, and replaces Sanity UI layout props with plain DOM attributes. It also renames the SDK components after their @sanity/collaboration/ui counterparts. Several of these changes break CommentsPanel and styling code written for 0.1.0.
New features
- Document-level comments: a thread can be on a document as a whole, not only on one of its fields, with fieldPath: ''. compose={{fieldPath: ''}} starts one from CommentsPanel, whose composer then prompts "Comment on the document…". CommentList heads these threads with the document when it names documents, and otherwise with the new labels.list.document (default "Document"). The Sanity Studio comments inspector doesn't list document-level comments. Document-level comments need @sanity/sdk and @sanity/sdk-react 3.11.0 or later.
- Multi-document lists: CommentList and CommentsPanel group comments from several documents. Groups are one field of one document, keyed on the new optional CommentData.documentId (and documentType). Once the threads span more than one document, each heading names the document as well as the field. documentTitle(group) names a group's document, renderFieldHeading and renderFieldAction receive the group's documentId, and scrollToField takes a CommentTarget as well as a field path.
- Always-visible actions: Comment and CommentThread take actions: 'hover' | 'always'. 'always' keeps the action row in view instead of revealing it on hover or focus. The default is 'hover'.
- SDKCommentsPanel takes onCommentCreated(comment), called once a new thread is created, as on SDKPortableTextComments. Use it to close a composer opened with compose or to select the new thread.
- useSDKThreadCallbacks also accepts a function from a thread to its document's handle.
Improvements
- In development, CommentsPanel warns when the threads span several documents and compose has no documentId.
- panel.composerPlaceholder receives the full target, so you can name the document as well as the field.
- Multi-document headings truncate the document title before the field, and show the full heading in a tooltip when needed.
- The inline comment button opens from the bottom-right corner of the selection and runs right, or left when it doesn't fit, instead of centered under the selection. The placement prop on InlineCommentInput still overrides it.
Breaking changes
- SDK component names: DocumentCommentsPanel is now SDKCommentsPanel (with SDKCommentsPanelProps and SDKCommentsPanelAction), and InlineCommentsPlugin is now SDKPortableTextComments (with SDKPortableTextCommentsProps). Props and behavior are unchanged, so update the imports.
- Styling props: Comment, CommentThread, CommentList and CommentBadge no longer accept Sanity UI props (padding, radius, tone, border, shadow, gap, mode, fontSize and others). Each takes the DOM attributes of the element it renders: className, style, id, aria-* and event handlers. Style them through the Sanity UI theme, and use className or style for placement. The data-* attributes in the rendered DOM aren't a styling API and can change in any release. See Theme the components.
- onThreadCreate(fieldPath, message) is now onThreadCreate(target, message), and labels.composerPlaceholder(fieldPath) is now composerPlaceholder(target). target is the new CommentTarget, {fieldPath, documentId?}, exported from the root entry.
- draftKey is removed. Drafts are always kept per target, so they survive a composer unmounting and carry between panels over the same document. The new optional draftScope string prefixes their keys, to keep two panels over one document apart.
- The fieldPath prop on CommentsPanel is replaced by compose: {fieldPath, documentId?, onDiscard?}. documentId says which document the composer writes to, and onDiscard makes it a composer opened on request: it takes focus when it mounts, and Cancel or Escape calls onDiscard. SDKCommentsPanel takes compose without documentId, since its document is the handle's.
- renderFieldHeading(group) is now renderFieldHeading(group, {heading}) on both CommentList and CommentsPanel, where heading is the built-in heading. Both components now read the result the same way: null renders no heading and undefined renders the built-in one.
- The composer above the list remounts when its target changes, so unsent text stays with the field and document it was written for.
- Oct 29, 2026
- Date parsed from source:Oct 29, 2026
- First seen by Releasebot:Nov 2, 2026
Fix MCP client OAuth discovery
Sanity limits OAuth discovery documentation redirects to browser navigation and HTML or Markdown requests.
Fixes
- OAuth discovery: Limit documentation redirects to browser navigations and requests for HTML or Markdown.
- Oct 29, 2026
- Date parsed from source:Oct 29, 2026
- First seen by Releasebot:Nov 2, 2026
v6.21.0
Sanity releases Studio v6.21.0 with faster document validation, configurable metadata fields for release forms, and new document inspector tools. The update also fixes issues across forms, search, and editing workflows.
Sanity Studio v6.21.0
This release includes various improvements and bug fixes.
For the complete changelog with all details, please visit:
www.sanity.io/changelog/studio-Ni4yMC4w
Install or upgrade Sanity Studio
To upgrade to this version, run:
npm install sanity@latestTo initiate a new Sanity Studio project or learn more about upgrading, please refer to our comprehensive guide on Installing and Upgrading Sanity Studio.
📓 Full changelog
Author Message Commit @jonahsnider perf(validation): remove RxJS from reference batching (#15628) 126f2bd @jonahsnider perf(validation): use promises for validation traversal (#15629) 82ad285 @jonahsnider test(validation): make benchmark independent of Studio build (#15631) d04c200 @juice49 fix(sanity): tag cors probe requests (#15637) 8736bf8 @bjoerge fix(core): limit /check/cors probes to one per 10 seconds (#15638) 23b9a5e @gu-stav fix(core): restore favoriting in workbench (#15494) 1cc28af @skogsmaskin feat(form): use the federated Media Library asset source view by default (#15624) fb31eee @pedrobonamin fix(structure): allow publishing leftover drafts of live-edit document types (#15634) aec6c26 @jonahsnider perf(schema): allow skipping manifest validation and cloning (#15625) 64ad107 @jonahsnider perf(schema): use structuredClone for manifests (#15627) 89696ee @laurenashpole chore: migrate text in core components (#15618) 4a1847e @laurenashpole chore: migrate text in structure (#15607) 51fa60e squiggler-app[bot] chore(tests): generate dts tests 🤖 ✨ (#15605) 23f6fb8 @stipsan fix(test-studio): disable css code splitting with sanity cli-build 7.0.1 (#15572) a19012b @jordanl17 feat(releases): add configurable metadata fields to release forms (#15424) ffc1e56 squiggler-app[bot] fix(deps): update typescript-tooling to ^0.23.2 (#15593) 2ec60a4 squiggler-app[bot] fix(deps): update dependency motion to ^14.6.0 (#15595) 3d2966f squiggler-app[bot] fix(deps): update panda-css monorepo to ^2.4.0 (#15597) 37c8422 squiggler-app[bot] fix(deps): update dependency @sanity/client to ^8.11.0 (#15584) 49f70f2 squiggler-app[bot] chore(deps): update dependency @tanstack/react-virtual to ^3.14.22 (#15588) b6c9107 squiggler-app[bot] chore(deps): update dependency oxlint-tsgolint to ^7.0.2005 (#15589) d6878f4 squiggler-app[bot] chore(deps): update dependency @sanity/pandacss-tsdown-plugin to ^0.3.1 (#15587) 1714b98 squiggler-app[bot] chore(deps): update dependency @pierre/diffs to ^1.6.1 (#15585) f431656 squiggler-app[bot] fix(deps): update codemirror (#15590) 69f0921 @stipsan fix(lint): keep empty export in css typing stubs from being autofixed away (#15601) 829ca0a cursor[bot] fix(structure): clear review changes after discarding a draft (#14128) 3a7b188 @stipsan refactor(structure): avoid duplicate params stabilization (#13920) c5842aa @stipsan feat(vision): prefill query params from the referenced $names in the JSON editor (#15578) 60f7c5b cursor[bot] test(store): cover media library access policy fetch (#15160) e93a735 @stipsan fix(vision): run pasted and linked query URLs right away and show AI credits in the redesign (#15446) b647163 @stipsan test(core): drain comlink teardown before vitest restores postMessage (#15573) 8d881ee @laurenashpole chore: migrate text in misc dev directories (#15530) 6d1720e @laurenashpole chore: migrate text structure/panes (#15564) e379955 @laurenashpole chore: migrate text in misc directories in core (#15566) ace7a51 @stipsan test(canvas): add visual coverage for canvas and feedback dialogs (#15103) 8548303 @stipsan fix(core): drop --made-with-panda marker from shipped css (#15576) 2e0ded7 @stipsan fix(core): make dialog breadcrumbs focus fields and scroll dialogs to top (#15481) 271ebf1 squiggler-app[bot] fix(deps): update dependency @sanity/cli to ^8.22.1 (#15569) 3ddb17b @stipsan fix(structure): migrate document group css modules to panda css (#15570) 209fafb @laurenashpole chore: migrate text in misc directories in core/form/inputs (#15466) 4722dfe @stipsan refactor(css): replace vanilla-extract with CSS modules outside the sanity package (#15406) 6fba85e @pedrobonamin fix(form): make the whole header row toggle collapsible fieldsets and object fields (#15556) a92664c @stipsan fix(vision): hide the variant option where the workspace has variants switched off (#15459) 3b3cd7b @pedrobonamin fix(form): stop grid arrays leaking grid item renderer into nested arrays (#15490) e40bd97 squiggler-app[bot] chore(deps): update dependency oxc-transform-react to ^0.155.0 (#15511) f080c31 @pedrobonamin test(storybook): snapshot release document status icons (#14861) 36193da @juice49 feat(sanity): add document group inventory inspector (#15519) 69b0020 @juice49 feat(sanity): refine document group inventory layout for document inspector (#15519) 28d85f2 @juice49 feat(sanity): add imperative API for DocumentGroupInventory (#15519) 09a4ac4 @juice49 feat(sanity): move feedback action to document inspector header (#15519) 523b162 @juice49 feat(sanity): add version management action to document panel header (#15519) 27f505c @hermanwikner feat(comments-v2): send anchor instead of range for inline comments (#15088) 0a8e2f2 @stipsan fix(deps): update @tanstack/react-virtual to ^3.14.21 (#15559) 4538849 squiggler-app[bot] chore(deps): update dependency oxfmt to ^0.74.0 (#15512) 31a7e14 @pedrobonamin test(e2e): reproduce text typed into a new block being lost when leaving the document (#15342) d0cce08 squiggler-app[bot] chore(deps): update dependency vite to ^8.3.5 (#15506) b0c6a86 @stipsan refactor(core): migrate from vanilla-extract to Panda CSS (#15396) 14749af @jordanl17 feat(bench): observe soft navigations and add a navigate step (#15533) 1c6e955 @stipsan test(form): make the FormBuilder suspense warning test independent of test order (#15561) e20a6af @pedrobonamin chore(form): point form suspense skill at agent-toolkit (#15551) 6424929 @stipsan test: consolidate visual coverage from open test-only PRs (#15528) 6050264 @stipsan chore(deps): drop stale sentry release-age excludes (#15548) 7b3cba8 squiggler-app[bot] chore(deps): update dependency oxc-parser to ^0.155.0 (#15510) edf2db7 squiggler-app[bot] chore(deps): update dependency @pierre/diffs to ^1.6.0 (#15509) 7fcf7aa squiggler-app[bot] chore(deps): update dependency oxlint to ^1.89.0 (#15513) 3baf6f9 squiggler-app[bot] fix(deps): update dev-non-major (#15517) 7e7a1b3 @pedrobonamin fix(form): give every field and array item a suspense boundary and warn when a form component suspends (#15474) dac77d0 squiggler-app[bot] chore(deps): update dependency @sanity-labs/groq-wasm to ^1.0.1 (#15500) eeae199 squiggler-app[bot] chore(deps): update pnpm to v12.14.0 (#15514) 7e73462 @pedrobonamin test(test-studio): add custom inputs that suspend to reproduce stuck document creation (#15472) efa8b9e squiggler-app[bot] chore(deps): update dependency @sanity/tsdown-config to ^0.31.2 (#15503) 0520c77 squiggler-app[bot] fix(deps): update dependency @sanity/client to ^8.10.1 (#15516) 0d23353 squiggler-app[bot] chore(deps): update dependency ui5 to v5.0.0-alpha.16 (#15505) c059a2f squiggler-app[bot] fix(deps): update portabletext (#15508) e6e7336 squiggler-app[bot] fix(deps): update dependency get-it to ^9.6.2 (#15507) 272da18 squiggler-app[bot] fix(deps): update dependency @sanity/cli to ^8.22.0 (#15515) f54afd0 squiggler-app[bot] fix(deps): update dependency motion to ^14.3.0 (#15440) e5066fc squiggler-app[bot] chore(deps): update dependency @sanity/functions to ^1.9.0 (#15441) b9e870a squiggler-app[bot] chore(deps): update dependency @sentry/react to ^11.8.0 (#15442) 300afda @jonahsnider feat(validation): expose document validation completeness (#15495) 1fc5a24 squiggler-app[bot] chore(tests): generate dts tests 🤖 ✨ (#15529) 453c2ac @laurenashpole chore: migrate text in dev/test-studio (#15487) fe53638 @laurenashpole chore: migrate text in miscellaneous core/studio/components directories (#15464) 3ce653a @laurenashpole chore: migrate text in structure/panes/document/documentPanel (#15479) 342942e @laurenashpole chore: migrate text in misc directories in core/form/inputs (#15383) c7607a9 squiggler-app[bot] chore(deps): dedupe pnpm-lock.yaml (#15493) 86ec229 @jordanl17 feat(radar): record a weekly engine confidence score (#15445) 0e7eb57 @pedrobonamin fix(core): respect partial index excluded fields in studio search (#15502) 7166aac @juice49 feat(sanity): expose resolved beta config to document inspector resolvers (#15522) b7bd517 @jordanl17 fix(releases): align release detail row menu gating with the document footer (#14354) 7044eb4 @gu-stav fix(core): prevent cors failure for agent proposed changes (#15498) 3d46a10 @juice49 test: update dts export fixtures (#15497) 5930b99 @jonahsnider fix(schema): preserve built-in validators in serialized schemas (#15492) 7015662 @jonahsnider perf(validation): improve performance of document validation (#15158) 8f95050 @jonahsnider test(validation): add document validation benchmarks (#15157) b9fb472 @jordanl17 refactor(form): extract shared form state from document form (#15425) fdb1d90 @stipsan feat(structure): focus the title field from the document title (#15454) 72c9187 @pedrobonamin fix(util): keep keyed paths with periods or brackets from crashing the structure tool (#15463) 9b447f8 @oleg1357 feat(core): download the schema from the diagnostics dialog (#15430) 3583116 cursor[bot] test(form): cover formState member error classification (#14941) aa97365 @jordanl17 feat(bench): add a long-session soak on the article document (#15426) 0a29ddd @jordanl17 feat(radar): add the sqrl studio quality score and trends banner (#15427) d39cfac @stipsan fix(search): exclude content agent versions from raw perspective search (#14250) 81d3d9c @gu-stav fix(structure): reload only the structure tool on errors (#15431) 9144735 @pedrobonamin fix(form): show the correct day for date fields in review changes (#15462) aabb8b4 @jonahsnider feat(validation): add validateDocuments for batch validation (#15144) b54a6d8 Original source - Oct 28, 2026
- Date parsed from source:Oct 28, 2026
- First seen by Releasebot:Nov 2, 2026
Studio workflow improvements, and bug fixes
Sanity releases a broad Studio and CLI update, moving Content Variants version management into a document inspector while improving navigation, search, loading states, and stability. New CLI tools support Dashboard migration, organization tokens, user identity checks, and schema and type generation watch modes.
This release moves version management to a document inspector for variants users, improves breadcrumb navigation and field interactions, fixes search functionality issues, and enhances overall stability with better loading states and error handling.
Download the schema from the diagnostics dialog
The Studio diagnostics dialog can now download the workspace schema to share with Sanity support.
Move version management to document inspector
For Content Variants beta users, version management now lives in a document inspector. Open it with the "Manage versions" action in the document panel header. The inspector gives the interface more room and lets editors share a link directly to the version list.
🐛 Notable bugfixes and improvements
- Breadcrumbs in nested object and array item dialogs now do what their label suggests. Clicking a field name scrolls to that field and focuses it, and clicking an item (a dialog title) scrolls that dialog back to the top. Clicking the title of the dialog that is already open no longer closes it.
- Collapsible fieldsets and collapsible object fields can now be expanded or collapsed by clicking anywhere in their header row, not just the title.
- Vision no longer shows its Variant option, nor sends a variant with queries, in workspaces where variants are switched off (beta.variants.enabled not set), matching the rest of the studio, which shows no variant selector there either.
- Arrays that use the grid layout no longer force nested arrays to render as grid tiles. A nested array keeps its own item component and custom input, including inside an image dialog opened from a grid.
- Every field and array item gets its own loading boundary again. If a custom form component (components.input, components.field, components.item, or a plugin's form.components) suspends, for example on an App SDK hook such as useDocumentProjection for a document that has not been created yet, only that field or array item shows a loading skeleton, instead of the whole document form staying on "Loading" (a regression in 6.17.0). Studio also logs a console warning naming the component, field path and document type, explaining how to add a Suspense boundary whose fallback reserves the component's space, so the form does not shift when it loads.
- Studio search no longer fails with score() function received unexpected expression when search.unstable_partialIndexing.enabled is on and the dataset's partial index excludes a field that search would boost, such as a preview title, or when a slug field sits at the dataset's maximum field depth. Those fields are no longer boosted, and matching documents are still returned.
- In a release's document list, Unpublish and Discard version now name your roles when you do not have permission to use them, matching the document footer.
- Fixes Content Agent proposed changes not loading in a Studio inside Workbench when the page origin isn't a CORS origin with credentials on the project.
- Fixes a crash in the Structure tool after reloading or switching perspectives while an array item whose _key contains a period or a closing bracket was open.
- Studio search no longer lists Content Agent document versions when querying across all versions. Those versions were often duplicates of the real document and opened as an empty document for anyone who was not the author.
- The Reload button on the structure tool's error screen now reloads only the structure tool instead of the whole page. It retries the structure; picking up a newly deployed Studio still needs a page reload.
- Review changes now shows the same calendar day that is stored on a date field. Previously, in timezones behind UTC, the diff could show the previous day.
- sanity schema extract --watch now re-extracts when you edit your schema or sanity.config file. Previously, it ran the first extraction and then never ran again, without reporting an error.
- sanity typegen generate --watch now works with typegen.resources (beta). Previously, the command exited with "Watch mode does not support typegen.resources yet". A change to any resource's query files or local schema file regenerates every resource. A resource without a local schema uses the schema deployed to its dataset, which is fetched once when the watcher starts, so restart the watcher to pick up a newly deployed schema.
- New sanity codemod dashboard command moves an existing Studio or SDK app onto the Dashboard. It rewrites sanity.cli.ts to wrap app in defineApplication, looks up the organization from the project, and prompts for a title and slug. The existing deployment stays live. The codemod warns when deployment.appId would make the first Dashboard deploy overwrite the existing app, and when the installed sanity version is too old for defineApplication.
- sanity codemod no longer ends every run with an ExitError stack trace, even successful ones. It now waits for the codemod to finish and exits with its exit code, so a failed run is reported as a failure.
- sanity tokens create can now create organization tokens, the same kind of token the Add API token dialog in Manage creates. One token can hold organization permissions (such as Context, Blueprints, and Media Library) and roles on several projects. Interactive runs show a single checklist of everything the token can access, then print the equivalent flags for use in CI, for example sanity tokens create ci --grant context=developer --grant project:=editor. Existing --project-id and --role usage still creates a project token. Unattended runs with no grant and no project now fail with a usage error (exit code 2) instead of exit code 1.
- sanity tokens list and sanity tokens delete accept --organization , so you can find and revoke organization tokens from the CLI.
- New sanity whoami command prints the user or API token the CLI is authenticated as: name, email, ID, login provider, and where the token came from (the CLI config file, the SANITY_AUTH_TOKEN environment variable, or the CLI execution context). SAML SSO logins also show the organization. Pass --json for machine-readable output. The command exits with code 1 when you aren't logged in.
- Commands that support --json now return argument and runtime errors as JSON, and exit with a nonzero code when they fail. Successful responses keep their existing shape, and -j aliases still work. In help output, --json now appears with the global flags.
- sanity deploy now refuses to deploy a Studio that is referenced by a Blueprint, and tells you to deploy it with sanity blueprints deploy instead.
- The Dashboard links that sanity deploy and sanity undeploy print, including in dry runs and --json output, now use the app or Studio's configured slug instead of its application ID. Deployments without a slug still link by ID.
- For Dashboard apps without an app view (panel-only apps), sanity deploy and its dry run now link to your organization's Dashboard. Previously, they printed an /applications/ URL that returned a 404.
- Background services in Dashboard apps can now respond to event topics. bus.subscribe(topic, (message) => message.reply(value)) works in a worker as it does on the page, so a worker can answer requests from its app's views.
- sanity deploy now uses the federation manifest from the build it just ran, and reads it from the output directory only when the build is skipped. A federated build that doesn't write a federation manifest now fails with an error naming the missing file.
- Oct 28, 2026
- Date parsed from source:Oct 28, 2026
- First seen by Releasebot:Nov 2, 2026
Safer document mutations and schema management
Sanity adds deployed-schema validation for document mutations and improves live-edit document handling, MCP tool selection, and schema removal. The update helps prevent invalid changes while making document workflows and cleanup more reliable.
New Features
- Document mutations: Creates, patches, and publishes are now validated against an unambiguously identified deployed schema, blocking invalid mutations. If a schema cannot be selected, the mutation continues with a warning; projects without a deployed schema continue without a warning.
Improvements
- Tool selection: Prefer dedicated MCP tools over equivalent Sanity CLI commands when both are available.
- Live-edit documents: Create and patch document types with liveEdit enabled directly at their published IDs, preventing mutations from leaving incompatible drafts.
Fixes
- undeploy_schema tool: Can now remove an MCP-managed schema whose workspace name is shared with a Studio deployed outside MCP, leaving the Studio schema in place. Its instructions for removing Studio schemas with the Sanity CLI no longer suggest flags that sanity schemas list does not accept.
Curated by the Releasebot team
Releasebot is an aggregator of official release notes from hundreds of software vendors and thousands of sources.
Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.