sanity-plugin-authoring

Explica y crea plugins de Sanity Studio utilizando las API públicas de plugins y herramientas. Úsalo al crear plugins orientados al usuario, agregar herramientas a través de plugins, o cuando un…

npx skills add https://github.com/sanity-io/sanity --skill sanity-plugin-authoring

Sanity Plugin Authoring

What A Plugin Is

A Sanity Studio plugin is a named configuration bundle that can be added to a Studio through the plugins array. Plugin configuration accepts most workspace config properties, except workspace-owned settings such as dataset, projectId, auth, and theme.

Always give plugins a stable unique name. Prefer definePlugin() so editors expose useful types and autocomplete.

import {definePlugin} from 'sanity'

export const previewUrlPlugin = definePlugin({
  name: 'preview-url-plugin',
  document: {
    productionUrl: async (prev, {document}) => {
      const slug = document.slug?.current
      return slug ? `https://example.com/${slug}` : prev
    },
  },
})

Configurable Plugins

Use definePlugin((options) => ({...})) when callers need to configure behavior.

export const myPlugin = definePlugin<{enabled?: boolean}>((options) => ({
  name: 'my-plugin',
  tools: options.enabled === false ? [] : [myTool],
}))

Keep option namespaces extensible. Prefer object shapes such as {feature: {enabled: true}} instead of direct booleans when future settings are likely.

What Plugins Can Provide

Common plugin properties:

  • document: Document actions, badges, production URL resolvers, and new document defaults.
  • form: Form customizations, asset sources, and custom input rendering.
  • plugins: Nested plugins.
  • tools: Studio tools contributed by the plugin.
  • schema: Schema types and initial value templates.
  • studio: Studio component overrides and middleware.
  • i18n: Locale resource bundles used by plugin UI.
  • title: Human-readable plugin name.
  • onUncaughtError: Custom error handling, logging, or telemetry.

Use the smallest surface that solves the feature.

Tools In Plugins

A tool is a top-level Studio view with routing and predictable URLs. Tools commonly represent full-screen workflows such as Structure, Vision, Dashboard, or Presentation.

When adding a tool through a plugin:

  • Add it through the plugin tools property.
  • Give it a stable name, title, component, and router when needed.
  • Remember tool visual order is affected by the order tools are added, followed by tools added through plugins.
  • Use studio.components.toolMenu when the visual menu order needs custom rendering.
  • Use the top-level tools reducer pattern when changing the default opened tool, because visual menu order alone does not choose the default route.

Studio Components

studio.components can customize parts of the Studio UI. Components that receive renderDefault are middleware: call props.renderDefault(props) unless intentionally replacing the default UI.

Use this for UI wrappers, navigation changes, or tool menu ordering. Be careful not to change scroll containers or layout ownership accidentally.

Locale Resources

If a plugin renders UI text, add an i18n bundle instead of hard-coding user-facing strings. The usual file shape is:

feature/
├── i18n/
│   ├── index.ts
│   └── resources.ts
└── plugin/
    └── index.ts

In i18n/index.ts, define a namespace and default US English bundle:

import {type LocaleResourceBundle} from '../../i18n'

export const featureNamespace: 'feature' = 'feature'

export const featureUsEnglishLocaleBundle: LocaleResourceBundle = {
  locale: 'en-US',
  namespace: featureNamespace,
  resources: () => import('./resources'),
}

export type {FeatureLocaleResourceKeys} from './resources'

In i18n/resources.ts, export the default strings and key type:

const featureLocaleStrings = {
  'action.example': 'Example',
}

export type FeatureLocaleResourceKeys = keyof typeof featureLocaleStrings

export default featureLocaleStrings

Then register the bundle from the plugin:

import {featureUsEnglishLocaleBundle} from '../i18n'

export const feature = definePlugin({
  name: 'sanity/feature',
  i18n: {
    bundles: [featureUsEnglishLocaleBundle],
  },
})

Before Coding

  1. Identify whether the feature is a plugin, a tool, a schema extension, a form extension, or a document extension.
  2. Check existing plugin examples in the repo.
  3. Choose a stable plugin name.
  4. Decide whether the plugin needs options.
  5. Add focused tests for the configured behavior.

For Sanity monorepo default plugin wiring, read sanity-core-plugin after this skill.

References

Más skills de sanity-io

tdd
sanity-io
Desarrollo guiado por pruebas con el ciclo rojo-verde-refactorizar. Úsalo cuando el usuario quiera construir funcionalidades o corregir errores usando TDD, mencione "rojo-verde-refactorizar", quiera…
performance-optimization
sanity-io
Optimiza el rendimiento de la aplicación. Úsalo cuando existan requisitos de rendimiento, cuando sospeches regresiones de rendimiento, o cuando Core Web Vitals o los tiempos de carga…
content-experimentation-best-practices
sanity-io
Guía estructurada para diseñar, ejecutar y analizar experimentos de contenido con el fin de mejorar la conversión y el compromiso. Abarca marcos de hipótesis, selección de métricas, cálculo del tamaño de la muestra y pruebas de significancia estadística en experimentos A/B y multivariantes. Incluye recursos detallados sobre valores p, intervalos de confianza, análisis de potencia y métodos bayesianos para interpretar resultados. Proporciona patrones de integración con CMS para gestionar variantes a nivel de campo y conectar sistemas externos...
content-modeling-best-practices
sanity-io
Guía de modelado de contenido estructurado para diseño de esquemas, reutilización y entrega multicanal. Abarca principios fundamentales: tratar el contenido como datos en lugar de páginas, mantener fuentes únicas de verdad, diseñar para canales futuros y optimizar flujos de trabajo editoriales. Incluye marcos de decisión para referencias frente a objetos incrustados, separación de preocupaciones y patrones de reutilización de contenido. Proporciona orientación sobre taxonomía y clasificación para enfoques planos, jerárquicos y facetados. Se aplica a...
portable-text-conversion
sanity-io
Convierte contenido HTML y Markdown en bloques de Portable Text para Sanity. Úsalo al migrar contenido desde CMS heredados, importar HTML o Markdown a Sanity,…
portable-text-serialization
sanity-io
Renderiza y serializa Portable Text a React, Svelte, Vue, Astro, HTML, Markdown y texto plano. Úsalo al implementar la representación de Portable Text en cualquier frontend…
sanity-best-practices
sanity-io
Guías completas de mejores prácticas e integración para el desarrollo de Sanity CMS en distintos frameworks y temas. Cubre más de 10 integraciones de frameworks, incluyendo Next.js, Nuxt, Astro, Remix, SvelteKit y Angular, con patrones específicos y orientación de configuración. Incluye guías temáticas sobre diseño de esquemas, optimización de consultas GROQ, edición visual, Portable Text, imágenes, TypeGen, localización y migraciones de contenido. Proporciona una estructura de referencia rápida para cargar solo las guías relevantes según el tipo de tarea,...
sanity-migration
sanity-io
Planifica, implementa y revisa migraciones desde otros CMS y sistemas de contenido a Sanity. Úsalo al migrar o cambiar de plataforma a Sanity desde AEM, Adobe Experience Manager, Contentful, Strapi, Webflow, WordPress, Payload, Drupal, archivos Markdown/MDX/frontmatter, exportaciones WXR/XML, APIs de CMS, volcados de base de datos, HTML estático, o al diseñar flujos de extracción, transformación, conversión a Portable Text, migración de activos, redirecciones, validación y transición.
data-analysisdatabasedevelopment