From harness-claude
Configures Nuxt SEO metadata: page titles, Open Graph tags, canonical URLs, robots directives, and structured data using useSeoMeta and useHead. For per-page customization and social previews.
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeThis skill uses the workspace's default tool permissions.
> Set page titles, Open Graph tags, canonical URLs, and structured data with useSeoMeta and useHead
Configures Nuxt SEO modules for robots.txt, sitemaps, dynamic OG images, schema.org structured data, breadcrumbs, and canonical URLs. Use for SEO setup, sitemap generation, and structured data in Nuxt apps.
Defines static and dynamic SEO metadata, Open Graph tags, Twitter Cards, canonical URLs, robots.txt, and OG images using Next.js Metadata API in App Router.
Configures Nuxt SEO v5 modules for robots.txt, sitemaps, Open Graph images, Schema.org structured data, link checking, meta tags, and site config in Nuxt 3+ apps.
Share bugs, ideas, or general feedback.
Set page titles, Open Graph tags, canonical URLs, and structured data with useSeoMeta and useHead
<title>, <meta description>, or OG tags per pageuseSeoMeta — typed meta tags (preferred):
useSeoMeta for all standard SEO and OG meta tags. It provides full TypeScript autocompletion and prevents common tag duplication mistakes:// pages/product/[id].vue
useSeoMeta({
title: product.name,
description: product.description,
ogTitle: product.name,
ogDescription: product.description,
ogImage: product.imageUrl,
ogType: 'product',
twitterCard: 'summary_large_image',
twitterTitle: product.name,
twitterImage: product.imageUrl,
});
useServerSeoMeta in SSR-only contexts for better performance (skips client-side hydration):useServerSeoMeta({
robots: 'index, follow',
ogSiteName: 'My Site',
});
useHead — generic head management:
useHead for tags not covered by useSeoMeta (canonical, structured data, custom link tags):useHead({
link: [{ rel: 'canonical', href: `https://mysite.com${route.path}` }],
script: [
{
type: 'application/ld+json',
innerHTML: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
offers: { '@type': 'Offer', price: product.price },
}),
},
],
});
app.vue or a layout, then override per page:// app.vue
useHead({
titleTemplate: (title) => (title ? `${title} — My Site` : 'My Site'),
htmlAttrs: { lang: 'en' },
meta: [{ name: 'theme-color', content: '#ffffff' }],
});
Reactive meta — computed values:
const { data: post } = await useAsyncData('post', () => fetchPost(id));
useSeoMeta({
title: () => post.value?.title ?? 'Loading...',
description: () => post.value?.excerpt,
ogImage: () => post.value?.coverImage,
});
Robots configuration:
nuxt.config.ts:export default defineNuxtConfig({
app: {
head: {
meta: [{ name: 'robots', content: 'index, follow' }],
},
},
});
// pages/admin/settings.vue
useSeoMeta({ robots: 'noindex, nofollow' });
nuxt-site-config module:
@nuxtjs/seo module family:// nuxt.config.ts
export default defineNuxtConfig({
modules: ['nuxt-site-config'],
site: {
url: 'https://mysite.com',
name: 'My Site',
defaultLocale: 'en',
},
});
useSeoMeta vs. useHead:
useSeoMeta is a higher-level abstraction built on top of useHead. It knows which meta tags belong in name vs. property attributes, prevents duplicate tags, and offers typed keys. Prefer it for all standard SEO and social meta. Use useHead for raw head control (scripts, links, custom attributes).
Tag deduplication:
Nuxt uses @unhead/vue under the hood. Tags are deduplicated by key — the most recently called composable wins. This means a page's useSeoMeta call overrides the layout's defaults without any explicit merge logic.
Open Graph image requirements:
https:// origin)@nuxtjs/og-image which generates them at build time or on-demand// With @nuxtjs/og-image
defineOgImage({
component: 'MyOgImageTemplate',
title: post.title,
description: post.excerpt,
});
Structured data (JSON-LD) patterns:
Common schema types for Nuxt apps:
Article — blog posts, newsProduct — e-commerceBreadcrumbList — navigation pathOrganization — company info in layoutFAQPage — FAQ sectionsPlace organization-level JSON-LD in the default layout; page-specific data in individual pages.
Performance note:
useServerSeoMeta renders meta tags only during SSR and skips the client-side hydration step, reducing JavaScript execution. Use it for any meta that does not need to change after initial render.
https://nuxt.com/docs/getting-started/seo-meta