ワンクリックで
seo
Reference and checklist for SEO metadata on any page. Use when writing, reviewing, or debugging useHead() and useSeoMeta() on any page.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Reference and checklist for SEO metadata on any page. Use when writing, reviewing, or debugging useHead() and useSeoMeta() on any page.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
i18n management for Mellumine: key structure, naming conventions, both-locale rule, and translation quality guidelines. Use when adding or modifying translation entries.
Vue 3 + Nuxt 4 best practices for Mellumine: Composition API, auto-imports, TypeScript, SCSS, CSS custom properties, and component conventions.
Add a new plushie to the Mellumine collection: update data.ts and both locale files. Use when adding any new plushie to the site.
Manage translation entries in fr-FR.json and en-US.json. Use when adding, modifying, or reviewing i18n keys for pages, components, or images.
Vue 3 + Nuxt 4 conventions for this project: SFC structure, auto-imports, TypeScript, SCSS, CSS custom properties, components, and composables. Use when writing or reviewing any .vue file.
Add a new plushie entry to data.ts and both locale files. Use when the user provides a new plushie to add to the collection.
| name | seo |
| description | Reference and checklist for SEO metadata on any page. Use when writing, reviewing, or debugging useHead() and useSeoMeta() on any page. |
| disable-model-invocation | true |
| argument-hint | <page path or page name> |
You are writing or reviewing SEO metadata for: $ARGUMENTS
The project uses @nuxtjs/seo v5. Every page needs both useHead() and useSeoMeta().
const runtimeConfig = useRuntimeConfig()
const route = useRoute()
const baseUrl = ref(runtimeConfig.public.i18n.baseUrl)
// URL path segment without locale prefix and without leading slash
const urlEndPath = '{page-path}' // e.g. 'plushies' or 'about'
// Path to OG image inside public/ (no leading slash)
const ogImageEndPath = 'og-image.webp' // or a page-specific image
const canonicalUrl = computed(() => `${baseUrl.value}${route.path}`)
route.path includes the locale prefix (/fr/... or /en/...) so canonicalUrl is always locale-correct.
useHead({
title: computed(() => t('pages.{page}.tab_name')),
meta: [
{
name: 'description',
content: computed(() => t('pages.{page}.meta.content')),
},
{
name: 'keywords',
content: `${computed(() => t('miscellaneous.vtuber')).value},
${computed(() => t('miscellaneous.creator')).value},
${computed(() => t('miscellaneous.handmade')).value},
${computed(() => t('app.name')).value},
`,
},
],
link: [
{ rel: 'canonical', href: canonicalUrl.value },
{
rel: 'alternate',
href: computed(() => `${baseUrl.value}/en/${urlEndPath}`),
hreflang: 'en-US',
},
{
rel: 'alternate',
href: computed(() => `${baseUrl.value}/fr/${urlEndPath}`),
hreflang: 'fr-FR',
},
{
rel: 'alternate',
href: computed(() => `${baseUrl.value}/fr/${urlEndPath}`),
hreflang: 'x-default',
},
],
})
en-US, fr-FR, x-defaultx-default always points to /fr/ — French is the default localeurlEndPath (no locale prefix) and prepend /en/ or /fr/ manuallyhref: computed(() => baseUrl.value) for x-default (no path suffix)route.path for hreflang alternates — it carries the current localeuseSeoMeta({
ogTitle: '%s %separator %siteName',
twitterTitle: '%s %separator %siteName',
appleMobileWebAppTitle: '%s %separator %siteName',
description: computed(() => t('pages.{page}.meta.content')),
ogDescription: computed(() => t('pages.{page}.meta.content')),
twitterDescription: computed(() => t('pages.{page}.meta.content')),
ogImage: `${baseUrl.value}/${ogImageEndPath}`,
ogImageSecureUrl: `${baseUrl.value}/${ogImageEndPath}`,
ogImageAlt: computed(() => t('pages.{page}.meta.content')),
ogImageType: 'image/webp',
ogImageWidth: '1200',
ogImageHeight: '630',
twitterImage: `${baseUrl.value}/${ogImageEndPath}`,
twitterImageAlt: computed(() => t('pages.{page}.meta.content')),
twitterImageType: 'image/webp',
ogUrl: canonicalUrl.value,
ogType: 'article',
articleTag: [
computed(() => t('miscellaneous.vtuber')).value,
computed(() => t('miscellaneous.creator')).value,
computed(() => t('app.name')).value,
// ... add page-specific keywords
],
msapplicationTileImage: `${baseUrl.value}/${ogImageEndPath}`,
})
articleTag values use .value directly (resolved strings, not reactive refs).
All other i18n values must be computed(() => t(...)).
Inside useHead() and useSeoMeta(), all t() calls must be wrapped in computed():
// ✅ Reactive — updates when locale changes
content: computed(() => t('pages.plushies.meta.content'))
// ❌ Wrong — stale on locale switch
content: t('pages.plushies.meta.content')
Exception: articleTag resolves with .value:
articleTag: [
computed(() => t('miscellaneous.plushies')).value, // ✅ resolved string
]
Always include these on every page:
miscellaneous.vtubermiscellaneous.creatorapp.nameAdd page-specific keywords:
| Page | Additional keywords |
|---|---|
| Home | streaming, polar_fox, stars, mascot, handmade, plushies |
| About | polar_fox, mascot, stars, streaming, handmade, plushies |
| Plushies | plushies, handmade, stars |
| Contact | streaming, stars |
Example (FR, 104 chars):
"Découvrez la collection de peluches faites main par Mellumine, chacune cousue avec amour, étoile par étoile."
Default: og-image.webp (in public/) — the site-wide OG image.
For future page-specific images: use a representative WebP image from public/images/.
ogImageType must always be 'image/webp' (not 'image/jpeg').