releases.shpreview
Home/Sanity
Sanity

Sanity

$npx @buildinternet/releases get sanity
May 11, 2026

Field labels in Canvas

Field labels replace the previous content mapping approach with a direct, visible connection between what you write and where it goes in Studio.

When you set a content type on a Canvas document, field labels appear inline as purple headings that correspond to fields in your schema. You can see and adjust the structure of your document as you write, without switching to a separate panel.

What changed

Structure is now part of the document. Content mapping previously lived in a side panel you had to open to check the state of your document. Field labels sit inline, so structure is visible as you write.

Content-to-field assignment works differently. The background AI process that continuously mapped content is gone. Field labels can be applied in two ways: manually using the = slash command, or automatically via AI labeling that you trigger when you’re ready. After AI labeling runs, you can always review and adjust the results.

Inclusion replaces content/context toggling. Instead of marking blocks as “content” or “context,” you now toggle individual blocks between “included in Studio” and “excluded” using an eye icon in the margin. Excluded blocks stay in the document and will not be sent to Studio.

Delivering to Studio is an explicit action. Previously, connecting a Canvas document to Studio started a continuous sync. Now you first select a content type, then choose “Create new Studio document” or “Update Studio document” when you’re ready. Setting a content type alone doesn’t create anything in Studio.

Studio documents are never locked. Content mapping blocked Studio editing while a Canvas document was linked. With field labels, Studio documents can always be freely edited. When you push an update from Canvas, it flags any fields that have changed in Studio since your last update so you can review conflicts before overwriting.

Applying field labels

Field labels can be applied to an entire document or a selected range. AI reads your content against the selected content type, sorts it according to the schema, and applies labels for you to review.

This is especially useful when bringing existing content into Canvas from tools like Google Docs or Notion and structuring it for Studio quickly.

For finer control, use the = slash command to assign a label to any block manually. You can also select text and pick “Label this content” from the context toolbar to label a specific section.

Including and excluding content

Within any field label, toggle individual blocks between included and excluded using the eye icon. Only included content flows to Studio when you create or update a document.

Excluded blocks are useful for keeping editorial notes, content briefs, reviewer comments, or alternative drafts inline without cluttering the Studio document. You can draft multiple variations within a field label and toggle which one to include before sending to Studio.

Sending to Studio

Open the content type panel and select “Create new Studio document” to send labeled content as a new draft. If your team uses Content Releases, you can create the document directly into an existing release.

Once created, the Studio document stays connected to the Canvas document. Continue refining in Canvas and push updates when ready. If fields have been edited in Studio since your last update, Canvas flags the conflicts before anything is overwritten.

What stays the same

The writing experience (editor, formatting, slash commands, Markdown shortcuts), AI assistance (ghostwrite, show options, rewrite), notes (context, fact, style, inspiration), and real-time collaboration all remain unchanged. Field labels re-imagine how structure is surfaced and how content moves from Canvas to Studio.

May 8, 2026
MCP server v2.19.0: MCP-managed schemas and deploy_studio tool

New Features

  • deploy_studio tool: Deploys a hosted Sanity Studio bound to an MCP-managed schema. Given an appHost, the tool provisions or redeploys a Studio at https://<appHost>.sanity.studio/ that renders the managed schema and is available in Sanity Dashboard.
  • MCP-managed schemas: Schemas deployed via deploy_schema are now owned and resolved by the MCP server directly, rather than relying on a Studio codebase to publish them. get_schema, list_workspace_schemas, and the document tools read from this managed source first, falling back to Studio-deployed and legacy schemas when no managed schema exists for a workspace.

Fixes

  • Legacy schema adoption: Better handles invalid legacy schema manifests by returning clear recovery guidance instead of leaking raw validation errors.

Enterprise organizations managing large teams on Sanity can now use User Attributes to create parameterized roles that adapt to each user automatically. Instead of creating a separate custom role for every combination of location, department, or language, you define a small number of roles that resolve dynamically based on who the user is.

How it works

User Attributes are key-value pairs attached to a user's profile within an organization (ex: location="london", department="editorial", language="french"). Attributes come from two sources:

  • SAML (automatic): Captured from identity provider assertions during SSO login. Refreshed on every authentication.
  • Sanity (manual): Set by administrators through Manage or the Management API. Used to supplement IdP data or override specific values.

When both sources provide the same attribute, the Sanity value takes precedence. Removing the override reveals the SAML value again.

Parameterized roles with GROQ filters

Attributes can be referenced in content resource filters using the user::attributes() function. Instead of creating a separate role for each branch office, define a single role with a filter like:

_type == "post" && branch == user::attributes().branch

Reducing role complexity at scale

Organizations managing dozens of locations, markets, or business units have been forced to create a separate custom role for every permutation of access. User Attributes reduces this complexity. Your roles become more powerful because they adapt to each user's context rather than requiring a static definition for every combination.

Attributes also support temporary reassignments. An administrator can override a user's location attribute in Sanity without modifying the identity provider. When the override is removed, the SAML value takes effect again on the next login.

Important details

  • Fail-closed security: If a user is missing an attribute that a content resource filter references, the filter denies access by default.
  • Supported types: string, integer, number, boolean, and array variants of each (except boolean).
  • Enterprise plans: User Attributes is available on certain Enterprise plans.
May 7, 2026
Sanity React App SDK v2.11.0: New organization hooks and expanded useProjects options

This release adds two new React hooks for working with organization metadata, expands the parameter options on the projects store, and moves the SDK to a single shared Sanity instance.

New hooks for organization metadata

Use useOrganization to get metadata for a single organization. Pass includeMembers: true to include members, or includeFeatures: true to include features.

function OrganizationName({organizationId}: {organizationId: string}) {
  const organization = useOrganization({organizationId})

  return 

# {organization.name}

}
const organizationWithMembers = useOrganization({organizationId, includeMembers: true})
const organizationWithFeatures = useOrganization({organizationId, includeFeatures: true})

Use useOrganizations to get metadata for every organization the current user can access.

const organizations = useOrganizations()

return (
  
    {organizations.map((organization) => (
      {organization.name}
    ))}
  
)

useOrganizations accepts the same options, plus includeImplicitMemberships.

const organizationsWithMembers = useOrganizations({includeMembers: true})
const organizationsWithFeatures = useOrganizations({includeFeatures: true})
const organizationsIncludingImplicit = useOrganizations({includeImplicitMemberships: true})

Both hooks support suspense. The release also exports new public types: Organization, OrganizationBase, OrganizationMember, and OrganizationsOptions.

More options on useProjects

The useProjects hook now accepts includeFeatures, onlyExplicitMembership, and organizationId as typed options. Use organizationId to scope results to a single organization, onlyExplicitMembership to exclude implicit memberships, and includeFeatures to include feature data on each project.

This release also exports new public types: Project, ProjectBase, ProjectMember, ProjectMemberRole, ProjectMetadata, and ProjectsOptions.

Single Sanity instance

The SDK now uses one shared Sanity instance internally.

Blueprint stacks now support organization scope.

Some resource types, starting with Scheduled Functions, exist only at the organization level and cannot be deployed from a project-scoped stack. Organization-scoped stacks reach across multiple projects from a single blueprint, so they grow with your Sanity footprint. Project-scoped stacks remain a fine default when your work focuses on a single project, or when you don't have org-level permissions.

Create a new organization-scoped stack

If you're starting fresh, use blueprints init rather than promoting. The new scope wizard asks which organization you're working in, whether to scope the new stack to that organization or to a single project, and, if you pick project scope, which project. Every choice is editable: back up to change an answer and the rest of the wizard updates to match.

Promote with one command

Promoting a stack lifts an existing stack from a single project to its parent organization, so one stack can manage resources that span projects (including the new Scheduled Functions) without disturbing any of the project-scoped resources you already deploy.

Run blueprints promote on an existing project-scoped stack. The CLI performs a single atomic operation that switches the scope, preserves the original project ID so existing resources keep resolving, and updates your local .sanity/blueprint.config.json file.

npx sanity@latest blueprints promote

Existing resources keep working

Promotion does not redeploy or rewrite anything that’s already deployed. Document functions, webhooks, CORS origins, and other project-scoped resources continue to work. The stack remembers its original project and resolves project-scoped resources against it.

Mix scopes in one blueprint

After promoting, the same blueprint can declare both project-scoped and organization-scoped resources side by side. Add an explicit project attribute on a resource to target a different project from the same stack.

import {
  defineBlueprint,
  defineDocumentFunction,
  defineScheduledFunction,
} from '@sanity/blueprints'

export default defineBlueprint({
  resources: [
    // Project-scoped resource, resolves against the stack’s default project
    defineDocumentFunction({
      name: 'on-publish',
      event: {on: ['create', 'update']},
    }),

    // Organization-scoped resource, enabled by promotion
    defineScheduledFunction({
      name: 'daily-digest',
      event: {expression: '0 9 * * *'},
    }),
  ],
})

Requirements

  • Administrator or the new Blueprints Deployer role on the organization the stack will live under. Project-level roles alone are not sufficient.
  • To promote a stack, its project must belong to an organization. Standalone projects cannot be promoted.
  • No active deployments or operations on the stack at the time of promotion.
  • Deploying an organization-scoped stack requires an organization admin or blueprints deployer role. Alternatively, use a Blueprints Deployer token, created from the organization’s Manage interface or with the blueprints mint-deploy-token command.

Promotion is one-way but risk-free. The command is also idempotent, so it’s always safe to retry. The promotion event will be listed in the logs for that stack; use the blueprints logs command to see your stack’s history.

Get started

Read Promote a stack to organization scope for a full walkthrough, or revisit the Blueprints introduction to learn how stacks fit into the bigger picture.

Scheduled Functions are now available. They run on a timer instead of in response to document events. Use them for daily digests, cache expiration, periodic content syncs, or any task that needs to happen on a fixed cadence.

Run code on a schedule

Define a scheduled function with defineScheduledFunction from @sanity/blueprints. Schedules accept either a UNIX cron expression or an explicit object with minute, hour, dayOfWeek, month, and dayOfMonth fields.

import {defineBlueprint, defineScheduledFunction} from '@sanity/blueprints'

export default defineBlueprint({
  resources: [
    defineScheduledFunction({
      name: 'expire-cache',
      event: {expression: '0 0 * * *'},
    }),
  ],
})

Inside the function, the scheduledEventHandler helper from @sanity/functions gives you typed access to the run context.

import {scheduledEventHandler} from '@sanity/functions'

export const handler = scheduledEventHandler(async ({context}) => {
  const time = new Date().toLocaleTimeString()
  console.log(`👋 Your Sanity Function was called at ${time}`)
})

Get started

Add a scheduled function with the CLI:

npx sanity@latest functions add --name expire-cache --type scheduled-function --language ts

Scheduled functions run independently of any single project, so they require an organization-scoped blueprint stack. If your stack is project-scoped, run npx sanity@latest blueprints promote before deploying.

Read the Create a Scheduled Function quickstart for a step-by-step walkthrough, or browse the Functions documentation.

Content Agent Provider v0.8.2: Mixing client and server tools, act-and-answer, and bug fixes

Mixing client and server tools in your integrations

The new ContentAgent class lets you combine your own client tools with Content Agent's server tools in a single agent loop. Server-executed tools (like Media Library access or content mutations) forward their results back to your client tools automatically, so the agent can act on both sides without you writing the orchestration. It is our implementation of the AI SDK Agent abstraction, preconfigured with safe defaults for the agent loop.

Migrate from streamText() to ContentAgent to pick this up:

Before:

streamText({ model: provider.agent(threadId) })

After:

new ContentAgent({ provider, threadId })

Act-and-answer: With this orchestration in place, the agent can call a tool and return its final answer in the same step, delivering faster results for action-oriented queries (for example, "update the issue and confirm it is done").

Notable bug fixes and improvements

  • Fixed an issue where mutations could ignore validation warnings.
  • Resolved errors that could occur when working with arrays containing items of a single type.
  • Improved how the agent resolves references to documents in unsaved drafts.
  • Translation tasks now correctly handle internationalized content in the latest schema versions.
  • URL validation now respects relative URLs where allowed.
  • Fixed an issue where some operations could fail with API parameter errors.
  • Restored the confirmation flow for content edits.
  • Recovered text content that could be orphaned during certain edit operations.
  • File uploads now accept a wider range of file types.

Media Library support

Content Agent can now query, organize, and update assets and collections in your Media Library. Ask the agent to find specific assets, batch-update metadata, or rearrange collections directly from the chat. Results link back to the relevant assets and collections so you can verify changes in context.

Additional features

  • Better search results: the agent now combines keyword matching with semantic search, returning more accurate results when you reference specific terms or names.
  • Smoother navigation in custom-domain Studios: the agent now uses Studio’s intent-aware navigation, fixing issues with multi-workspace and custom-domain setups.

Notable bug fixes and improvements

  • Fixed an issue where mutations could ignore validation warnings.
  • Resolved errors that could occur when working with arrays containing items of a single type.
  • Improved how the agent resolves references to documents in unsaved drafts.
  • Translation tasks now correctly handle internationalized content in the latest schema versions.
  • URL validation now respects relative URLs where allowed.
  • Fixed an issue where some operations could fail with API parameter errors.
  • Restored the confirmation flow for content edits.
  • Recovered text content that could be orphaned during certain edit operations.
  • File uploads now accept a wider range of file types.
May 6, 2026

Media Library now supports folders, a nested hierarchy for organizing your assets, and shortcuts that let a single asset appear in more than one folder. Folders are powered by a new beta hierarchy primitive in Content Lake that you can also use programmatically via the API.

Organize assets into folders

Create, update, and navigate folders using a familiar file-system UI. Multi-user updates are real-time: when a teammate creates, renames, or moves a folder, you see the change immediately.

Upload directly into a folder

The upload modal now offers a folder picker so you can choose where files land before they’re uploaded. The same option is available programmatically through a new parent query parameter on the upload endpoint.

You can also drag files from your operating system directly onto the Media Library window, the upload starts immediately and lands in the folder you’re currently viewing.

When you upload a file that already exists in the library, the modal flags the duplicate and offers a one-click action, either create a shortcut into your current folder if the asset lives elsewhere, or add the existing asset to your current folder if it isn’t filed yet.

Shortcuts: one asset, many folders

Sometimes the same asset belongs in more than one place. Create a shortcut from the asset menu and the asset appears in the destination folder with a small badge to indicate it’s a shortcut.

You can also move an existing shortcut to a different folder from the asset sidebar. The original asset is unaffected, and only the shortcut’s home folder changes.

If you delete an asset or remove it from a folder in the app, the Media Library cleans up every shortcut to it automatically. Moving an asset between folders preserves its shortcuts.

Move, rename, and delete with confidence

Move and rename folders from the sidebar’s folder actions menu. Delete dialogs warn of any assets in use or when removing an asset will also clean up shortcuts in other folders.

Filter and search by folder

Search has a new Location facet with folder operators, so you can scope a search to a specific folder, its descendants, or the entire library.

Studio plugin remembers your location

When you open the Media Library asset picker from a Sanity Studio, it now returns to the folder you were last in, no more re-navigating from the root every time.

Use folders programmatically

Folders are built on a new hierarchy primitive in Content Lake, sanity.tree, sanity.directory, and sanity.symlink that you can drive from the standard /mutate and /query endpoints. See the folders guide for the full setup.

Filter assets by draft status

A new Status facet in the filter menu lets you filter assets by whether they have a draft. Combine it with the Location filter to scope a search to drafted assets within a specific folder, or use it on its own across the whole library.

May 5, 2026

Sanity Studio v5.24.0

This release includes various improvements and bug fixes.

For the complete changelog with all details, please visit: www.sanity.io/changelog/studio-NS4yMy4w

Install or upgrade Sanity Studio

To upgrade to this version, run:

npm install sanity@latest

To 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

AuthorMessageCommit
@jordanl17feat(core): make document action keys extensible via declaration merging (#12768)eebdb17d97bba5a3ea793d20e7a1aa57f67f59c6
@bjoergechore: replace pnpx with pnpm and add pkg-pr-new dependency (#12783)3d66c1fb7a43f35bddab609336c39804344cf4a9
@bjoergechore(turbo): remove unused env var (#12781)f8111fce700584f23572f5956d991c7a2e34ebda
@bjoergechore(ci): use pnpm whoami instead of npm whoami (#12780)2308d145b94a9484817253850ff929f65bf3d81f
@RitaDiastest: add tests for createCallbackResolver (#12779)5625f37c276b7717396cba145f5ebf4f98fd6650
squiggler-app[bot]fix(deps): update dependency @sanity/cli to ^6.5.0 (#12778)f3d306c7bacfc0c2d95d5ff3cf8fd4efc2daf020
@bjoergefix: restore workspace hidden property (#12775)8f4e6b0f4f1b761b240ec15d0314e3d54d388659
@pedrobonaminfix(core): add version into documentEvents observable (#12772)b511ef939d0ae031505208d45f0f8f6e8ae5fb54
@bjoergechore(ci): switch to package build for lefthook (#12767)838e3556fe1637c2da8a32fce6286f709fb87eae
@bjoergechore: remove pre-commit husky hook (#12766)752aaf67457c91d2a7c0564eb38bc528a8ddb161
@bjoergechore: replace husky + lint staged with lefthook (#12755)fcbdbdb66d51bc92507b1fd1131e2311a2d2a729
@bjoergechore: upgrade pnpm to 11.0.0 (#12759)50a185bc76c2df32d112b9a75915f0cb2b37b2c2
@bjoergechore(ci): drop node 20 from test matrix (#12760)8bc9911c100dac9cf679714075bff01d93af3be9
squiggler-app[bot]chore(deps): update dependency @tanstack/react-virtual to ^3.13.24 (#12657)c4954c51a626b5dbd8ebd6bf0a399b3754d48e63
@jordanl17chore: adding telemetry to track when feedback dialog is opened and closed (#12749)6b16652d7c67e8b10f05112f7978d93126cf7748
@pedrobonaminfix(core): reset calendar focused date when setting to current time (#12753)ff8a7d492affa4aebd531e1ce0363940115461a9
@pedrobonaminchore(core): cleanup decision parameters schema (#12751)aa8980b861c73a9f243e26eec71c0f0b18559d24
Agent Context v0.5.0: Add opt-in telemetry for conversation classification insights

Agent Insights now includes optional telemetry to help us improve both Agent Context MCP, and also Agent Context Insights itself. You can choose to share metadata only (scores, sentiment, content gaps, token usage) or full conversation content with Sanity for model improvements. All telemetry sharing is disabled by default.

messages parameter in classifyConversation is now required.

Sanity Studio v5.24.0: Hidden workspace fix, date picker improvements, and CLI updates

This release fixes several issues including hidden workspace visibility, date picker calendar display, and improves CLI configuration handling.

🐛 Notable bugfixes and improvements

  • Removes a TypeScript limitation that prevented plugins from cleanly adding custom document actions.
  • cli**: **init respects --project and --dataset flags for app templates.
  • cli**:** pass schemaExtraction config through to build.
  • cli: sanity init now defaults to TypeScript in unattended mode.
  • cli**:** replace preferred-pm with local implementation.
  • Fixes a regression where workspace hidden config was ignored, causing hidden workspaces to appear.
  • Include version in document events observable.
  • Fixed the date picker calendar display after using “Set to current time”.
May 4, 2026
Agent Context v0.4.0: Introducing Agent Context Insights for conversation tracking and analysis

Track and analyze your Agent Context conversations. A telemetry integration captures conversations as they happen, a scheduled Sanity Function runs AI classification to extract success scores, sentiment, and content gaps, and a new Studio dashboard gives you visibility into how your agent is performing.

Getting started takes a few minutes: update the package, wire up telemetry in your agent, and set up the classification function. The create-agent-with-sanity-context skill can show you – or check our docs.

May 1, 2026
MCP server v2.18.2: Stability improvements

This release includes behind-the-scenes stability improvements. No action is needed to update to the latest version of the MCP server.

Sanity React App SDK v2.10.0: Automatic chunk-load recovery and login error fixes

This release improves reliability with automatic recovery from chunk-load errors, along with two fixes to login error handling in standalone apps.

Automatic reload on chunk-load errors

The app now reloads automatically when a JavaScript chunk fails to load. This commonly happens after a new deploy invalidates cached assets, and previously left users on a broken screen until they refreshed manually. No code changes are required to opt in.

Notable bugfixes and improvements

  • LoginError now stays synchronous in standalone apps, so error handling runs in the same tick as the failure.
  • The LoginError auto-logout flow guards against re-entry, preventing duplicate logout attempts when an error fires mid-logout.
Apr 30, 2026

This month, the documentation brings improvements to some of our framework-specific guides, a big overhaul of the core visual editing documentation, and an assortment of platform updates to improve the user experience.

New and updated docs

Visual editing overhaul

We’ve rewritten our core visual editing guides. For anyone using a supported framework like Next.js, this won’t change much. If, however, your aim is to set up visual editing on an unsupported framework, or just learn more about the underlying mechanisms, these new docs should help. There are now code-heavy guides on all major parts of the system, as well as an end-to-end example in Node.js and TypeScript.

A dedicated section for Astro

Our existing Astro content now lives in the docs. You can find the new Astro section here, as well as a new visual editing guide.

Documentation platform

Tabbed content blocks

Articles can now include tabbed content groups, letting you compare alternatives side-by-side and switch between them in place. Each tab supports rich text, code blocks, callouts, and images.

Advanced copy & AI shortcuts on every article

A new actions dropdown next to every article gives you one-click options to copy the article as Markdown, open it in ChatGPT or Claude for follow-up questions, and install the Sanity MCP server directly in Cursor or VS Code.

Richer property-table descriptions

Property descriptions in API and reference tables now render through the modern Portable Text pipeline, fixing an assortment of rendering bugs in older table content.

Auto-published reference documentation

A new Sanity Function automatically publishes generated reference documentation for many of our libraries, keeping API reference pages in sync with library releases without manual republish steps.

The Organization > Billing > Costs page in Manage has been overhauled with improved billing and usage details to help you organization admins better understand their billable usage or invoices.

It now displays:

  • What is contributing to the upcoming invoice (or billable usage for non-invoiced customers).
  • What contributed to the previous invoice (or billing period for non-invoiced customers).

This is available for all paid plans, including org-level enterprise customers. Enterprise customers won’t see “previous period” data until May. Displayed data does not take into account discounts, credits, or adjustments.

Apr 29, 2026

Webhook delivery retries have changed. Previously, deliveries that failed with a retryable error (HTTP 429 or 5xx) were retried with exponential backoff over a 30-minute window. Now, they are retried twice at 30-second intervals before being marked as failed.

This change was made to help prevent pending deliveries from accumulating behind a failing receiver.

Sanity Studio v5.23.0

This release includes various improvements and bug fixes.

For the complete changelog with all details, please visit: www.sanity.io/changelog/studio-NS4yMi4w

Install or upgrade Sanity Studio

To upgrade to this version, run:

npm install sanity@latest

To 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

AuthorMessageCommit
@EoinFalconerfeat(studio): add config option to disable ask-to-edit button (#12692)391d40357b514a46559927003462176463ba5665
@EoinFalconerfix(diff): deduplicate repeated inline diff segments in Portable Text (#12675)26c140f22db79c3e0f23f8b56627123427658e38
@bjoergefix(ci): keep release-notes consistent for PR-less commits (#12752)21a31ef82447139d95a25d4597a269ca537d4247
@bjoergefix(ci): handle commits without an associated PR (#12750)67682e55f6ff7c966d2c7fc8e2bdf74edb7f6448
@pedrobonaminchore(core): update invalid fields styles (#12002)713dd8c9cd0a69971110cccbb2b9a0bb466c4c77
squiggler-app[bot]chore(deps): update dependency @sanity/telemetry to v1 (#12664)d4eb80ee6fe78ad70d8e022af4bc07d2f2369495
squiggler-app[bot]chore(deps): update dependency @sanity/document-internationalization to v6 (#12663)c4b92e3bdaff83af921e53a270e35470a62996d4
squiggler-app[bot]chore(deps): update dependency @sanity/assist to v6 (#12662)937284298565d961949ed46bfee0df9c76764397
@EoinFalconerfix(studio): hide user menu on mobile in dashboard mode (#12684)e51fee8a1ab7156ae8acdae168538d8d5462c441
@annezfeat(telemetry): add Global Search Latency Measured event (#12709)317ae6b492c0261fc02cda398455e9cecdb94488
squiggler-app[bot]chore(deps): dedupe pnpm-lock.yaml (#12741)c825f1f8ed57cb146b909a76e9d756930c94384a
@pedrobonaminfeat: enable vanilla-extract CSS (#12590)c0fb87ff5ea41290df895fd45e3b0e90ce300bc1
@pedrobonaminfix(core): show json diffs for missing fields, skip _system field (#12744)57ebcca7be5578348a876dfa176a96b17e683f92
@gu-stavfix(feedback): associate labels with HTML form fields (#12746)d08b8eea7ac0c2f068742bb95fa1037e23a45058
@bjoergetest(e2e): require matcher in expectError to avoid suppressing unrelated errors (#12745)6f1d6c2e8ffe25eaffca59cd79e1e01fc5ca45db
@RitaDiasfix: issue when reverting to revisions in live edits (#12729)e0c829f35013ca75724234f01c2c5896b609b8c3
@bjoergerefactor: move store modules from _legacy directory to top-level store (#12735)bfd3b141e648ffed03a211501c3fc9af85c6b960
squiggler-app[bot]chore(tests): generate dts tests 🤖 ✨ (#12742)39210533ec84595808c1c4eefbfee8255bc17e76
@bjoergechore: switch to tsgo across the board (#12738)6b99ab91e042a9e2d4ecb142bd3a36e9ff644ed8
@bjoergefeat(sanity): warn on divergent auth configs for same project id (#12732)36b911d9f78cdcfc6358ed7768a846c802d0e96f
@Chrillewebfix(docs): code of conduct path in contributing file (#12740)fc5f9fc2a9431fc97522783381d00b31485cb986
@annezfeat(telemetry): add Document Initial Load Measured event (#12710)7110142050a13ede0f7beecc929a63076cdffdd5
@EoinFalconerfix(releases): add empty state for cardinality-one releases with no documents (#12687)379906f8c4c82de161514af20006ef2413027900
@EoinFalconerfix(form): maintain select button position with disableNew on image fields (#12683)91ebac8244cc0f92a36c32d3c7c046833da4d236
@bjoergeci(workflows): drop fetch-depth: 0 from jobs that don't need history (#12736)0a1b5b3b17290488eb70b6b57b2470dcb6050ab5
Copilotfix(core): throw on missing projectId/dataset in getOperationStoreKey (#12609)583bccea9cb3c7e0d5a85feee9220e7030076705
squiggler-app[bot]chore(tests): generate dts tests 🤖 ✨ (#12734)7f09c2a71550ea13b35832f70939408291f50ca0
@RitaDiasrefactor: the menu items in viewContentReleases and ScheduledDraftsMenuItem show proper hovering (#12703)6ba4b9037281bbe149bf8ddec28fa4c0507baf0b
squiggler-app[bot]chore(deps): update pnpm to v10.33.1 (#12660)b45aa6e859bc0ad398adfd65ff978f83655d3f8a
@EoinFalconerfix(e2e): stabilize custom release actions E2E test (#12694)4f5ee31672234ac765ccd1987b931a56ef9af38d
@RitaDiasfix: remove underline from openInNewTabIcon menu item for refs (#12724)eb3ca24f04062ffc09415ff1dc8ce307956c6077
@bjoergerefactor: auth store (#12679)85df9439431563ffbd520d399139ffae4a700889
@EoinFalconerfix(e2e): bypass navbar pointer-event interception in reference autocomplete (#12717)e354416bbeca16cf71ae866ba0ae1b5d2321abac
@EoinFalconerfix(e2e): stabilize page.goto wrapper for Firefox CI load (#12712)164332d8ce8224ceb3c9a20284d06b6f077c0cc9
@EoinFalconerfix(ci): pass --shard through pnpm without literal -- separators (#12713)ba7789b929c72ec73945f35b375556beddaa50c2
@EoinFalconerfix(releases): improve activity panel UX consistency (#12686)5b9cd5d70726fb8e557609e8a67bea082f52374e
@EoinFalconerfix(form): prevent scroll jump when opening field overflow menu (#12629)1ce6320cbd124ca51d245e7739802f52db6db4fd
@EoinFalconerfix(test): disable console intercept to prevent worker teardown races (#12716)032532d49baf19befc6bdaa810fd7ffcb1bc3517
Sanity Studio v5.23.0: Improved workspace warnings, ask-to-edit toggle option, and multiple UX fixes

This release brings improved workspace configuration warnings and a number of UX fixes.

Disable “Ask to edit”

Adds a new document.askToEdit.enabled config option to allow hiding the Ask to edit option which is displayed when a user lacks the required permissions to edit a document.

import {defineConfig} from 'sanity'

export default defineConfig({
  // ...rest of config
  document: {
    askToEdit: {enabled: false},
  },
})

🐛 Notable bugfixes and improvements

  • Studios will now warn when multiple workspaces sharing the same project ID have conflicting auth configurations.
  • Fixes a bug in Dashboard-embedded Studio where the user menu was still accessible on mobile even though it was hidden on desktop. Mobile now matches desktop behavior.
  • When using Review changes, properties that are not defined on the schema now show as a raw JSON.
  • Fixes an error that prevented reverting a live-edit document to an earlier revision.
  • Fixes a UI glitch where setting disableNew: true on an image or file field moved the Select button from the right side to the left. The button now stays on the right consistently.
  • Updates styling for Open in New Tab from the reference input menu actions.
  • Polishes the Content Releases activity panel: Avatars align with text, activity entries use sentence case, the “immediately” label is now “As soon as possible” to match the release type picker, and each entry now shows an absolute timestamp with relative time on hover.
  • Fixes a bug where clicking the overflow menu (⋯) on a field scrolled the document to the top.
  • Fixes a bug where duplicate inline diff segments could occur in Portable Text.
Last Checked
18m ago
Domain
sanity.io
Accounts
sanity-io
Tracking since Feb 20, 2025