Changelog
All notable changes to sanity-plugin-seofields. Follows Keep a Changelog · Semantic Versioning
v1.10.0Jul 11, 2026latest+3
+ ✨ Added
CustomPromptValues object (field, content, focusKeyword, keywords, meta, industry) — the extracted document text and metadata — and returns the prompt string sent to the provider. See AI.md.ai.customPrompt — a single custom prompt function (values) => string. The function itself branches on field/industry.ai.customPrompts — { generic?, byIndustry?, merge? } for up to 5 generic + 5 per-industry custom prompts, unlocked only behind a validated license via seofields-pro. Without a valid license this collapses to a single prompt (same as the free tier).merge: true to mix them into the built-in pool instead.ai.endpoint (proxy) mode custom prompts must be set on the server handler config passed to createSeoAiHandler, not on the Studio's ai config.@sanity/document-internationalization).buildHreflangs(translations, options) (exported from /head and /next) — maps resolved _translations ({language, slug}) into {locale, url} entries. Supports baseUrl, resolvePath, xDefault, and a current document; dedupes by locale.buildSeoMeta({ hreflangs }) — new option that supersedes seo.hreflangs, so alternates can come straight from buildHreflangs.hreflang: { autoFill } config — adds a "Sync from translations" button to the hreflangs field that reads translation.metadata references and fills entries (still editable). No new dependency.llms.txt generator — buildLlmsTxt(options) + docsToLlmsSection(docs, options) (exported from /head and /next) build an llmstxt.org-format file from Sanity content: H1 title, summary blockquote, and ## link sections. Serve it from a /llms.txt route or build step.v1.9.0Jul 4, 2026+10×2
+ ✨ Added
sanity-plugin-seofields/head entry point for Astro, Nuxt, Vue, SvelteKit, Remix, and custom SSR frontends. It exports buildSeoHead, buildSeoMeta, sanitizeOGType, sanitizeTwitterCard, and related types without importing the Studio plugin entry or React components.buildSeoHead(options) — converts seoFields data into plain serializable { title, meta, link } head data. Use it with Astro layouts, Nuxt/Vue useHead, SvelteKit <svelte:head>, Remix meta() mappings, or any custom head renderer.seoFields field names (seo.title, seo.description, seo.twitter.card, seo.hreflangs, etc.).sanity-plugin-seofields/server entry point with createSeoAiHandler plus ready-made framework adapters: createNextRouteHandler, createExpressHandler, createNodeHandler, and createFetchHandler (any Fetch API runtime — Cloudflare Workers, Deno, Bun). Each wraps the same generation + refinement pipeline used in direct-provider mode, but keeps the real apiKey server-side only. See AI.md.ai.apiKey is set without ai.endpoint, the plugin now logs a console.warn in the browser explaining that Studio bundles are client-side and the key is readable by anyone with Studio access.ai.endpoint) sends keywords, meta, industry, and license key — the request body includes field, content, focusKeyword, keywords, meta, industry, and licenseKey, so proxied requests get the same keyword-injection, refinement passes, and industry-specific prompt pool as direct-provider mode.blog, restaurant, travel, ecommerce, education, fitness, hospitality, nonprofit (4 of 10 prompts free per field, remaining 6 unlock with a license). Pro tier: healthcare, pharmacy, finance, realestate, saas, legal, insurance, automotive, homeServices (all 10 prompts require a license).keywords scoring bucket (10 points) no longer just checks that a keywords array is non-empty. It now grades whether keywords/focusKeyword are actually used in the title or description, rewards focus-keyword prominence (start of title > elsewhere in title > description only), and penalizes keyword stuffing — capped at the same 10-point budget so total scores stay on the existing 0–100 scale. A new shared getFocusKeywordPlacement helper backs both this scoring and the live focusKeyword field feedback, so the two never drift apart.× 🐛 Fixed
buildSeoMeta() now respects seo.canonicalUrl before constructing a canonical URL from baseUrl + path, falls back to seo.metaImage when no Open Graph image is set, and exposes seo.hreflangs as alternates.languages for Next.js metadata consumers.hasKeywordOveruse crash on regex-metacharacter keywords — keywords containing characters like + (e.g. "C++") previously threw Invalid regular expression: Nothing to repeat when checked for stuffing, in every place that ran the check (title/description/OG/Twitter live feedback, and now health scoring). Keywords are now escaped before being used in a RegExp.v1.8.0Jun 26, 2026+5·1~3
+ ✨ Added
focusKeyword field — New string field inside seoFields with a live, colour-coded inline feedback component (FocusKeywordInput). As editors type their target keyword the component immediately checks:slug field exists on the document), orange if absent.hreflangs field + hreflangEntry schema type — New array field on seoFields that stores international SEO alternate entries. Each item is an hreflangEntry object with:locale — BCP 47 language/region tag (e.g. en, fr-FR, x-default). Validated with a regex pattern in Studio; invalid tags show an inline error before saving.url — Absolute URL of the alternate page. Validated as http or https.GEOChecklist component + geoChecklist field — GEO (Generative Engine Optimization) readiness panel rendered directly inside seoFields. Gives editors instant feedback on how well the page is structured for AI-powered overviews (Google AI Overviews, ChatGPT, Perplexity).MetaTagsPreview component + metaTagsPreview field — Live HTML <head> preview rendered inside seoFields. Shows the exact output that will be in the page source:<title>, <meta name="description">, <meta name="keywords">, <meta name="robots"><link rel="canonical">og:title, og:description, og:url, og:type, og:site_name, og:imagetwitter:card, twitter:site, twitter:creator, twitter:title, twitter:description, twitter:image<link rel="alternate" hreflang="..."> entriesmetaAttributes key/value pairslicenseKey option — SeoFieldsPluginConfig.licenseKey is now the single place to supply your pro license key. It is forwarded automatically to the SEO Health Dashboard, Publish Gate, and GEO Checklist pro checks — no need to repeat it per feature.· 🗑️ Deprecated
healthDashboard.licenseKey — Move licenseKey to the root config instead. The old key still works (used as a fallback when the root key is absent) but logs a console warning and shows an amber banner inside the dashboard UI.~ 🔄 Changed
SeoObjectFieldName union expanded — focusKeyword, hreflangs, geoChecklist, and metaTagsPreview are now valid values in the SeoObjectFieldName union type, making them fully assignable in typed fieldGroups arrays.SeoFieldsPluginConfig — two new top-level options:geo?: boolean — set false to hide the GEO Checklist on all document types (default: true).metaTagsPreview?: boolean — set false to hide the Meta Tags Preview on all document types (default: true).SeoFields TypeScript type — focusKeyword?: string and hreflangs?: Array<{locale: string; url: string}> added to the exported interface.v1.7.0Jun 11, 2026+1×1·1
+ ✨ Added
OpinionNewsArticle Schema.org type — New schemaOrgOpinionNewsArticle type (a NewsArticle subtype per Schema.org spec) aimed at strengthening E-E-A-T signals for opinion, editorial, and column content. Ships with:schemaOrgOpinionNewsArticle) registered through the combined schemaOrg() plugin or individually via schemaOrgOpinionNewsArticlePlugin.OpinionNewsArticleSchema) and JSON-LD builder (buildOpinionNewsArticleJsonLd) exported from sanity-plugin-seofields/next.SchemaOrgOpinionNewsArticleData, SchemaOrgOpinionNewsArticleConfig.headline (required), description, image, author (polymorphic Person/Organization), publisher (polymorphic Organization/Person), datePublished (required), dateModified, articleSection, articleBody, dateline, printColumn, printEdition, printPage, printSection, backstory.opinion, editorial, column, commentary, op-ed.DocumentTextIcon icon to match NewsArticle.× 🐛 Fixed
select fields leaking variant into JSON-LD output — When an editor selected a variant (e.g. chose "Person" for the author field) but left all sub-fields blank, the raw Sanity data object { variant: 'person' } was emitted directly into the JSON-LD output. Schema.org validators (including Google's Rich Results Test) would report: _"The property variant is not recognised by the schema (e.g. schema.org) for an object of type Thing."_ The handleSelectVariant function in generator.ts now returns true (consumed — emit nothing) instead of false when the variant's nested sub-object is null or empty, preventing the raw value from falling through to the generic field emitter. This fix applies to all polymorphic select fields across every Schema.org type (author, publisher, image, genre, keywords, etc.).· 🧪 Tests
src/__tests__/schemaOrg.test.ts covering the variant leak fix:variant never appears in JSON-LD when author variant is set but sub-object is empty.variant never appears in JSON-LD when publisher variant is set but sub-object is empty.author correctly resolves to { "@type": "Person", ... } when sub-fields are populated.publisher correctly resolves to { "@type": "Organization", ... } when sub-fields are populated.v1.6.5May 14, 2026×1
× 🐛 Fixed
| separator spacing used in the rendered title. Also wired the meta title input to resolve configured titleSuffix / titleSuffixQuery values directly so the validation message stays accurate when suffixes are enabled. Reported in #9. Thanks to @patricksdev for the report and follow-up suggestion.v1.6.4May 10, 2026×1
× 🐛 Fixed
schemaOrg() validation for LocalBusiness and LegalService — Fixed a schema validation bug where both types declared two polymorphic image fields with the default image name, causing sanity schema validate to fail when importing the full combined schemaOrg config. The logo field in both schemas now uses the explicit logo field name, so image and logo serialize separately and the combined export validates correctly. Reported in #8. Thanks to @ahenriksen-inferno for the clear root-cause report.v1.6.3May 10, 2026+1~1·2
+ ✨ Added
Upgrade for $10/project → call-to-action link, and an Already paid? Click here to verify your license → action to immediately re-check the license after purchase. The dashboard content remains fully accessible behind the banner so existing users are not disrupted.~ 🔄 Changed
@sanity/icons as a peer dependency (>=2) and dev dependency, and refreshed the npm package description / keywords to better reflect Sanity v3/v4/v5 support, the built-in audit dashboard, and the plugin's broader SEO + Schema.org feature set.· 📝 Documentation
sanity-plugin-seofields, rewrote the tagline to lead with the audit dashboard differentiator, expanded package.json keywords (added sanity-v3/v4/v5, twitter-card, robots, json-ld, schema-org, structured-data, seo-dashboard, metadata, headless-cms, nextjs), and updated the description to reflect the full feature set.sanity-plugin-seofields.thehardik.in/reviews) alongside the existing Sanity Plugin Directory and GitHub star links.v1.6.2May 3, 2026×2
× 🐛 Fixed
titleSuffix separator convention — The | separator between the meta title and suffix is now always added automatically by the plugin. Users should provide only the bare text (e.g. 'Acme Inc', not '| Acme Inc'). Providing a leading pipe would have resulted in a double-pipe (|| Acme Inc) in the SERP preview.titleSuffix character counter — The 60-character title limit now correctly accounts for the | separator (2 extra characters) added by the plugin, so the counter remains accurate when a suffix is configured.v1.6.1Apr 25, 2026+4·1
+ ✨ Added
seoPreview.titleSuffix — Append a static string or dynamic function-based suffix to the meta title in the Live SEO Preview (e.g. Acme Inc — the | separator is added automatically by the plugin). The character counter for the title field automatically subtracts the suffix length (plus the | separator) so the limit stays accurate. Requested in #6.seoPreview.titleSuffixQuery — Dynamic GROQ-based title suffix fetched at runtime from the dataset (takes priority over titleSuffix). Useful when the suffix is stored in a site-settings document.seoPreview.titleSuffixInheritColor — When true, the suffix in the SERP preview renders in the same blue as the main title (#1a0dab) instead of the default grey (#70757a).apiVersion — New top-level apiVersion option on SeoFieldsPluginConfig. Used internally by the Live Preview's GROQ client and by the SEO Health Dashboard, eliminating the need to set it in both places.· 🗑️ Deprecated
healthDashboard.apiVersion — Move apiVersion to the root config instead. The old key still works but logs a console warning and shows an amber banner inside the dashboard UI.v1.6.0Apr 22, 2026+2
+ ✨ Added
schemaOrg array now registers 38 types (up from 24). New additions: LegalService, Country, JobPosting, Restaurant, Movie, Book, NewsArticle, ItemList, ProfilePage, MusicRecording, MusicAlbum, plus Recipe, Service, and SocialMediaPosting (previously individual-only) are now first-class combined-array members. Each type ships with a Sanity schema, Next.js JSON-LD component, buildXxxJsonLd() helper, category metadata, and icon.schemaOrgLegalServicePlugin, schemaOrgCountryPlugin, schemaOrgJobPostingPlugin, etc.) alongside the default default schemaOrgXxx factory re-exports from sanity-plugin-seofields/schema.v1.5.5Apr 15, 2026+3
+ ✨ Added
fieldGroups config option — New top-level plugin option that groups SEO fields into tabbed sections (Sanity groups) inside the seoFields object. Editors can switch between tabs like "Meta", "Open Graph", and "Twitter Card" for a cleaner editing experience. Applies universally to every document using type: 'seoFields'.SeoFieldGroup type export — New TypeScript interface for defining field groups, exported from the package entry point.SeoObjectFieldName type export — Union type of all top-level field names in the seoFields object ('title' | 'description' | 'metaImage' | …), exported for type-safe group configuration.v1.5.4Apr 15, 2026+2
+ ✨ Added
baseMeta schema type — New baseMeta object type that groups the core meta fields (title, description, metaImage, keywords, canonicalUrl, metaAttributes) into a single reusable Sanity object, following the same pattern as the existing openGraph and twitter types. This allows using basic meta fields independently outside of the top-level seoFields object.baseMetaSchema export — The new baseMeta type is exported from the package entry point as baseMetaSchema for standalone use:v1.5.3Apr 13, 2026~2·1
~ 🔄 Changed
buildSeoMeta refactor — Extracted three private helper functions from buildSeoMeta in seoMeta.ts: resolveOgImage, resolveTwitterImage, and buildCustomMetaMap. Logic is unchanged; separation improves readability and testability.SeoMetaTags return type — Added explicit React.JSX.Element return type annotation to SeoMetaTags in SeoMetaTags.tsx.· 🧹 Internal
SeoFields type import from seoMeta.ts.v1.5.2Apr 3, 2026+4~3
+ ✨ Added
.csv or .json file. Controlled via the new export option in healthDashboard config:localStorage. Navigation controls show the current page, total pages, and the document range being displayed.compactStats option in healthDashboard config (defaults to false). When true, replaces the 6-card stats grid with a single row of inline stat pills, saving vertical space in tighter layouts.localStorage and restored automatically on next visit.~ 🔄 Changed
RenderLicenseLoading and RenderLicenseInvalid as standalone components, making the main render path significantly cleaner.VALIDATION_ENDPOINT and CACHE_TTL_MS constants to module scope (previously defined inside the component on every render).v1.5.1Mar 31, 2026+1
+ ✨ Added
localStorage. System mode automatically follows the OS prefers-color-scheme preference and updates live when the OS preference changes.v1.5.0Mar 29, 2026+10
+ ✨ Added
seofields CLI — A new seofields binary is included with the package. Run commands directly from your terminal with npx seofields <command>.seofields create-config — Interactive wizard that scaffolds a seofields.cli.ts or seofields.cli.js config file with your project credentials. No more manual config file creation or copy-pasting required.seofields init — Automatically detects your sanity.config.ts/js and injects the seofields() plugin if not already registered. Supports --schema-org flag to also inject schemaOrg().seofields config — Update seofields() configuration options directly from the terminal using dotted key flags (e.g. --baseUrl=https://example.com, --healthDashboard.licenseKey=SEOF-…).seofields report — Queries your Sanity dataset and prints an SEO health report as a formatted table or summary. Scores each document across title, description, image, keywords, and Open Graph fields.seofields export — Exports all documents with SEO fields as JSON or CSV. Useful for audits and spreadsheet analysis.seofields doctor — Checks your local setup: verifies seofields() is registered in sanity.config, confirms peer dependencies are installed, and detects your CLI config file.seofields.cli.ts config file — Create a seofields.cli.ts (or .js) file using defineSeoCli() to store your project ID, dataset, and token so you never need to pass flags on every command.defineSeoCli() helper — Importable from sanity-plugin-seofields/define-cli. Provides full TypeScript types for the CLI config object including showConnectionInfo and types options.v1.4.2Mar 28, 2026~3
~ 🔄 Changed
sanity ^5 to peer dependencies. The plugin now officially supports Sanity Studio v3, v4, and v5. No API changes were required — all existing Studio APIs used by the plugin remain unchanged in v5.devDependencies to use sanity@^5.0.0 for development and testing.v1.4.1Mar 25, 2026×1
× 🐛 Fixed
IssuesPopover positioning in desk panes — The popover that displays hidden SEO issues now renders at the correct position when using createSeoHealthPane inside a Sanity desk structure. Changed position: absolute to position: fixed so popover coordinates (from getBoundingClientRect(), which are viewport-relative) align correctly regardless of parent container context or scroll state.v1.4.0Mar 25, 2026+8·1
+ ✨ Added
schemaOrg() — combined Sanity plugin (all 24 types + the schemaOrg array type)schemaOrgArticlePlugin(), schemaOrgFAQPagePlugin(), schemaOrgProductPlugin() … (one per type)schemaOrgArticle, schemaOrgWebsite, schemaOrgProduct … (24 total, for manual schema.types registration)generateSchemaType() — generator utility for building custom Schema.org typesbuildGenericJsonLd() — generic JSON-LD builderSchemaFieldDef, SchemaFieldOption, SchemaTypeDef, SchemaOrgConfig, SchemaOrgCombinedConfigSchemaOrgScripts — renders all JSON-LD scripts from a combined schemaOrg array field, automatically dispatching to the correct renderer per _typeSchemaOrgScript — low-level single script tag renderer· 🚀 Improved
SeoHealthTool and SeoHealthDashboard are now lazy-loaded — wrapped in React.lazy() + React.Suspense. The Studio bundle no longer pays the upfront cost of loading the dashboard code until it is actually navigated to, improving initial Studio load time.v1.3.2Mar 23, 2026+2~6
+ ✨ Added
title field is not a plain string (e.g. a Portable Text array returned from a custom GROQ query), an amber inline badge is shown in the Title column instead of a broken/empty link. The badge reads *"⚠ title is not a string — use pt::text(title) in query.groq"* with a tooltip explaining the fix.~ 🔄 Renamed (with backwards-compatible deprecations)
v1.3.1Mar 21, 2026·2
· 🧹 Internal
as any type casts in schema index with proper FieldDefinition typing.v1.3.0Mar 21, 2026+3·2
+ ✨ Added
isSubImageSet utility that correctly detects whether an OG or Twitter sub-object has an image configured, supporting both asset upload and URL modes.· 🔧 Changed
noIndex now contributes to the score when indexing is enabled.v1.2.7Mar 19, 2026×1
× 🐛 Fixed
SeoFieldsInput now exported from sanity-plugin-seofields/next — the type was defined in seoMeta.ts but missing from the /next re-export, making import type { SeoFieldsInput } from 'sanity-plugin-seofields/next' fail at compile time.v1.2.6Mar 19, 2026·3
· 🔧 Internal
@sanity/pkg-utils to tsup — replaced package.config.ts with tsup.config.ts for a leaner, faster build pipeline.tsconfig.dist.json and tsconfig.settings.json, consolidating settings into a single tsconfig.json.package.json: set "type": "module", added "main" / "module" fields, and expanded the exports map with explicit types, source, import, and require conditions for both entry points.v1.2.5Mar 18, 2026~2
~ 🔄 Changed
sanity-plugin-seofields/next entry point.import/require as plain strings) — @sanity/pkg-utils does not support nested condition objects and rejects the package during build validation.v1.2.4Mar 18, 2026+3~4
+ ✨ Added
sanity-plugin-seofields/next entry point — New sub-path export for use in Next.js Server Components and generateMetadata() functions.buildSeoMeta(options) — Converts a Sanity SEO object into a structured metadata object compatible with Next.js App Router's Metadata type. Returns title, description, keywords, robots, openGraph, twitter, alternates.canonical, and other (custom meta attributes). Safe to call in RSC / generateMetadata().<SeoMetaTags> — Framework-agnostic React component that renders all SEO meta tags as plain React elements (<title>, <meta>, <link rel="canonical">). Designed for Next.js Pages Router <Head>, Nuxt, Remix, or any SSR <head> slot. Also works in Next.js App Router RSC when imported from sanity-plugin-seofields/next.~ 🔄 Changed
MetaAttribute.key and MetaAttribute.type are now optional (key?, type?) — previously required, this change aligns the type with real Sanity document shapes where these fields may be absent.OpenGraphSettings gains an explicit url?: string field (maps to og:url).TwitterCardSettings gains an explicit creator?: string field (maps to twitter:creator).SeoFields now includes metaAttributes?: MetaAttribute[] in its type definition (was missing despite being part of the schema).v1.2.3Mar 12, 2026+1
+ ✨ Added
structureTool option — New healthDashboard.structureTool option that routes document-title clicks directly to a named Structure tool instead of relying on Sanity's generic intent resolver. Required when you have multiple structure tools and the monitored documents live in a non-default one. Clicking a title navigates to /{basePath}/{structureTool}/intent/edit/id=…;type=…/ directly.v1.2.2Mar 11, 2026+3
+ ✨ Added
createSeoHealthPane) — Embed the SEO Health Dashboard directly inside Sanity Studio's Structure tool.createSeoHealthPane(S, options) — returns a ComponentBuilder with a built-in .child() resolver so clicking any document row opens the document editor as a pane to the right. Automatically wires up schemaType via childParameters.options.licenseKey is required.createSeoHealthPane and SeoHealthPaneOptions.min-width: 0 through the full flex ancestor chain and adding a dedicated TitleCell wrapper.repeat(auto-fit, minmax(130px, 1fr)) instead of a fixed 6-column grid. Cards wrap naturally at narrow pane widths and always fill the full available width when there is space.v1.2.1Mar 10, 2026+1~1
+ ✨ Added
previewMode — New healthDashboard.previewMode option that loads realistic dummy documents into the SEO Health Dashboard without querying your dataset. Useful for showcasing, documentation screenshots, and testing the dashboard UI before real content exists.previewMode is active.~ 🔄 Changed
_type string. This means:v1.2.0Mar 9, 2026+5~2
+ ✨ Added
typeLabels — Map raw _type values to human-readable display labels. Applied in both the Type column and the Type filter dropdown; any unmapped type falls back to the raw _type string.typeColumnMode — Control how the Type column is rendered.'badge' (default) — coloured pill badge, consistent with score badges.'text' — plain inline text, useful for dense layouts.titleField — Specify which document field to use as the display title in the dashboard. Supports a single field name for all types, or a per-type map. Unmapped types always fall back to title.docBadge — Callback that renders a custom badge inline with the document title. Receives the full document and returns { label, bgColor?, textColor?, fontSize? } or undefined to render nothing.content.loadingLicense, content.loadingDocuments, content.noDocuments — Custom text for the three loading/empty states of the dashboard. Grouped under the existing content block so all text-content customisation is in one place.~ 🔄 Changed
emptyState removed — The emptyState config block has been removed. Its three keys (loadingLicense, loadingDocuments, noDocuments) are now part of the content block (see above). Migrate by moving the keys under content.v1.1.1Mar 8, 2026~3
~ 🔄 Changed
licenseKey that fails validation now see a distinct "Invalid License Key" screen (❌) with a message explaining the key is invalid or revoked, rather than the generic upgrade prompt shown when no key is provided at all.licenseKey is omitted entirely, the lock screen now shows a full sanity.config.ts code snippet demonstrating exactly where to add the key, making first-time setup clearer.sessionStorage cache entry for the current project and immediately re-runs the validation request against the server. This avoids the 1-hour cache window when a user has just updated their key without needing a full page reload.v1.1.0Mar 7, 2026+1
+ ✨ Added
📊 SEO Health Dashboard) that gives a bird's-eye view of SEO completeness across all documents that have an seo field.v1.0.10Dec 14, 2025+3−1
+ ✨ Added
fieldOverrides and fieldVisibility keys in README field configuration guidance.− ❌ Removed
dist/types entry point and legacy TypeScript import snippets from documentation, clarifying that only the plugin bundle is exported.v1.0.9Dec 6, 2025+1~4×1
+ ✨ Added
FeedbackType helpers for use across validation-driven UI components.~ 🔄 Changed
ValidHiddenFieldKeys guard and stricter fieldOverrides typing.SchemaTypeDefinition instances from the schema factories, ensuring config is forwarded while keeping Sanity typings intact.× 🐛 Fixed
v1.0.8Oct 15, 2025×1
× 🐛 Fixed
v1.0.7Oct 12, 2025·9·3
· Plugin Configuration Interface Updates
twitterImageType - Missing field key for X image type selectiontwitterImageUrl - Missing field key for X external image URLSeoFieldsPluginConfig.seoPreview - Now supports both boolean and object with prefix functionSeoFieldsPluginConfig.baseUrl - New string option for setting preview base URLSeoFieldsPluginConfig.fieldVisibility - Per-document-type field visibility controlSeoFieldsPluginConfig.defaultHiddenFields - Global field hiding capabilityAllFieldKeys - Union type covering all 27+ field keys across SEO, Open Graph, and TwitterFieldVisibilityConfig - Interface for field visibility configuration per document typeSeoFieldConfig - Interface for customizing field titles and descriptions· Configuration Usage Examples
v1.0.6Oct 8, 2025+7~5·3·1
+ ✨ Added
fieldVisibility configuration option for controlling field visibility per document typeFieldVisibilityConfig interface for type-safe field visibility controldefaultHiddenFields configuration option to globally hide specific fieldsSitewideFieldKeys including openGraphSiteName and twitterSiteAllFieldKeys type to include both SEO and sitewide field keysisFieldHidden and getFieldHiddenFunctionfieldVisibility configuration~ 🔄 Changed
openGraphSiteName and twitterSite fields using getFieldHiddenFunction· Technical Improvements
· 🔗 References
v1.0.5Oct 5, 2025+2×1
+ ✨ Added
creator field to Twitter TypeScript type for content creator attributionTwitter type to include creator handle field for better Twitter Card support× 🐛 Fixed
creator field in Twitter TypeScript type definitionv1.0.4Oct 4, 2025+3
+ ✨ Added
url field to Open Graph schema for canonical URL specificationOpenGraph TypeScript type to include url fieldv1.0.3Sep 24, 2025+5~2
+ ✨ Added
fieldOverrides configuration~ 🔄 Changed
v1.0.2Sep 23, 2024+7~2
+ ✨ Added
SeoFieldsPluginConfig interface for type-safe configurationfieldOverrides configuration option to customize individual field propertiestitle, description, canonicalUrl, metaImage, keywordsSeoField, SeoFieldKeys types exported for advanced usageseoPreview configuration options if wanted to enable/disable the SEO preview feature | default is true.~ 🔄 Changed
Was this page helpful?