Skill 07 · Sanity Studio Upgrade
Subchapter 7.4
references/boundary.v6.mdMarkdown8 KBView on GitHub
Covers the v5 to v6 crossing and everything inside the v6 line. Read this file only if the span crosses or lands in v6.
Within-line coverage for this file: 6.0.0 through 6.12.0, verified 2026-09-04. Anything released after 6.12.0 must be fetched; boundaries.md has the rule.
Published 2026-06-11. A focused release: schemas, plugin APIs, configuration shape, and content APIs are unchanged.
| Change | Applicability condition |
|---|---|
Node.js 22.12 or newer required. engines.node narrows from the v4 and v5 range of >=20.19 <22 || >=22.12 to a flat >=22.12. Node 20 reached end of life in April 2026. | Check engines.node, .nvmrc, CI images, and the build host. Affects build and development environments only, not the Content Lake or the browser bundle. |
Note for anyone arriving from the v4 or v5 line: this is a genuine new requirement for Node 20.19 through 21.x, which the whole v4 and v5 span accepted. The one band that was already rejected before v6 is Node 22.0 through 22.11, per section 3. A team sitting there has been out of range since 4.5.0 without necessarily knowing it, and the fix is the same move to 22.12.
auth.providers now replaces the built-in providers rather than appending to them, and mode: 'append' is no longer supported.
Applicability: does sanity.config.* contain an auth block with providers?
This is the highest-severity item in the boundary because it affects login, and custom providers usually mean SSO or SAML. If the project has no auth block, it is unaffected, and saying so explicitly is valuable: it removes the scariest item from the plan.
Migration is to the callback form:
// before
auth: {providers: [{name: 'saml', title: 'SSO', url: '...'}], mode: 'append'}
// after
auth: {providers: (prev) => [...prev, {name: 'saml', title: 'SSO', url: '...'}]}If the intent is to offer only the custom provider, the new default is already correct and the array form needs no change. Either way, recommend verifying the login screen with a real non-administrator account before production.
| Change | Applicability condition |
|---|---|
enableLegacySearch config option removed. Use search: {strategy: 'groqLegacy'} instead. | Grep the config for enableLegacySearch. |
React strict mode on by default in development. Opt out with reactStrictMode: false in sanity.cli.ts. | Applies to every project. It surfaces existing effect-cleanup and concurrent-rendering issues rather than creating new ones, so recommend leaving it on and fixing what it reports. |
Default search strategy changed from groqLegacy to groq2024. Better performance on large datasets, deeper nested-content and Portable Text coverage, and wildcard, phrase, and negation syntax. Results, ordering, and counts shift because the query logic differs. | Applies unless search.strategy is already set. See below. |
The specific search regression to test for: under groq2024, preview fields resolved through a reference, such as subtitle: 'author.name', no longer contribute to search matching or ranking. They did under groqLegacy.
Detect candidates with:
grep -rEn "(title|subtitle|description):\s*'[A-Za-z0-9_]+\.[A-Za-z0-9_.]+'" src/Matches are candidates, not confirmations. Whether it matters depends on how editors search, which is a human question. search: {strategy: 'groqLegacy'} restores the old behavior as a temporary measure.
Vite 8. Build times improved substantially in Sanity’s internal testing, with smaller bundles from better tree shaking. The React plugin updates automatically.
Applicability: does sanity.cli.ts customize vite? If yes, this is the most likely source of a build failure on this boundary, and testing against the pre-release before committing is worth recommending. If no, this boundary loses its main build risk, and the plan should say so.
| Version | Change | Applicability condition |
|---|---|---|
| 6.3.0 | The Portable Text input dropped all legacy data-slate-* attributes, CSS classes, and non-pt data attributes from its editing DOM. Migrate to the data-pt-* equivalents. | grep -rn "data-slate" across source, stylesheets, and test suites. This is the highest-impact undeclared change in the v6 line and it fails silently. Custom CSS stops applying and end-to-end selectors stop matching, with no error. |
| 6.2.0 | The markdown plugin’s config prop deprecated in favour of enabled. | Only if sanity-plugin-markdown is configured with config. |
| 6.2.0 | Native browser autocomplete and autofill disabled on Studio form fields. | Informational. |
| 6.4.0 | useDocumentVersionInfo deprecated. | Grep for the hook. |
| 6.6.0 | Invisible stega metadata stripped from text pasted into plain-text fields. | Going forward, no action. Documents already containing stega characters need a one-time content migration using stegaClean from @sanity/client/stega. Only relevant if visual editing with stega is or was in use. |
| 6.6.0 | menuItems([]) in structure configuration is now honored, so no default menu items are injected. | Applies if structure config uses menuItems([]) and relied on the injected items appearing. |
| 6.6.0 | “Default sort” and “Default view” scoped to the individual document list rather than overriding every list of the same type. | Applies to structure customization that relied on the old spillover. |
| 6.6.0 | Opt-in table editing added to the Portable Text input, enabled with plugins: {table: {enabled: true}} on components.portableText plus a declared table schema. | Off by default, so no risk. Worth a note: do not enable it until every rendering surface can handle table blocks. |
| 6.7.0 | Rule.uri({scheme}) respects a custom scheme when combined with other rules, so mailto: and tel: values are no longer wrongly rejected. | No action. Content that previously failed validation may now pass. |
| 6.9.0 | sanity build and sanity deploy now honor deployment.autoUpdates, which was previously ignored in some code paths. | Applies to every project with autoUpdates set. If a project set false but was receiving updates anyway, that stops. Verify which behavior the team expects. |
| 6.9.0 | defineType, defineField, and defineArrayMember preserve explicitly supplied optional properties on their return types. | Applies to any TypeScript project. Inferred types shift, so expect new type errors or newly redundant non-null assertions in schema-adjacent code. Usually quick to resolve. |
| 6.11.0 | useClient deprecation narrowed to the no-argument call. Calling useClient() without options warns; calling it with options, such as useClient({apiVersion: '2024-01-01'}), does not. | grep -rEn "useClient\(\s*\)" src/. The fix is to pass an explicit apiVersion rather than to stop using the hook. Worth doing regardless of the warning, because an implicit API version is its own latent problem. |
| 6.10.0 | The request-access screen was replaced with the shared access-ui package, which adds a renderAction slot. | Informational for most projects. Applies only if the access-request screen was customized or its markup was targeted by tests or CSS. |
| 6.12.0 | displayName assignments removed from sanity exports to unblock tree shaking. | Applies only to code or tests that identify components by displayName, including some snapshot and component-lookup patterns. Grep test suites, not just src/. |
| 6.12.0 | The mutator drops patch paths that cannot apply to the local document instead of throwing. | Informational. Relevant if custom code relied on the throw to detect a stale path. |