From harness-claude
Sets page titles, Open Graph tags, canonical URLs, and JSON-LD structured data per page using useSeoMeta and useHead in Nuxt. Useful for implementing social previews, robots directives, and SSR-optimized metadata.
How this skill is triggered — by the user, by Claude, or both
Slash command
/harness-claude:nuxt-seo-metadataThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Set page titles, Open Graph tags, canonical URLs, and structured data with useSeoMeta and useHead
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
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeDefine SEO metadata, Open Graph tags, and dynamic OG images using the Next.js Metadata API in App Router. Covers static metadata, async `generateMetadata`, title templates, metadataBase, opengraph-image.tsx, robots, and canonical URLs.
Configures Nuxt SEO including robots.txt, sitemap.xml, dynamic OG images, and JSON-LD structured data. Use when setting up site SEO, generating sitemaps, or adding schema.org markup.
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.