From memstack
Scans pages for meta tag issues and generates optimized titles, descriptions, Open Graph tags, canonical URLs, and robots directives to improve search visibility and click-through rates.
How this skill is triggered — by the user, by Claude, or both
Slash command
/memstack:meta-tag-optimizerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
*Scans all pages for existing meta tags, identifies issues, and generates optimized replacements — titles, descriptions, Open Graph, canonical URLs, and robots directives.*
Scans all pages for existing meta tags, identifies issues, and generates optimized replacements — titles, descriptions, Open Graph, canonical URLs, and robots directives.
When this skill activates, output:
🏷️ Meta Tag Optimizer — Scanning pages for meta tag issues...
Then execute the protocol below.
| Context | Status |
|---|---|
| User says "optimize meta tags" or "fix meta tags" | ACTIVE |
| User says "title tags" or "meta description" or "og tags" | ACTIVE |
| Improving SEO for specific pages | ACTIVE |
| Running a full site audit (broader scope) | DORMANT — use site-audit |
| Adding structured data / JSON-LD | DORMANT — use schema-markup |
| Trap | Reality Check |
|---|---|
| "Same meta description on every page" | Duplicate descriptions get ignored by Google. Each page needs unique, relevant meta. |
| "Title = just the page name" | "About" tells Google nothing. "About [Company] - [Key Differentiator]" ranks. |
| "OG tags are optional" | Without og:image, your shared links look broken on social. No image = no clicks. |
| "Canonical URLs don't matter" | Duplicate content splits ranking signals. Canonical tags consolidate authority to one URL. |
| "Longer titles rank better" | Google truncates after ~60 chars. Truncated titles look unprofessional and lose clicks. |
Identify every page and its current meta tags:
# Find all page/route files
find app/ pages/ src/ -name "*.tsx" -o -name "*.jsx" -o -name "*.html" 2>/dev/null | grep -v node_modules | grep -v "_\|layout\|loading\|error\|not-found"
# Next.js metadata exports
grep -rn "export const metadata\|export function generateMetadata" --include="*.tsx" --include="*.ts" . | grep -v node_modules
# Check for global/shared metadata
cat app/layout.tsx 2>/dev/null | head -30
Build the page inventory:
| Page | Route | Has Title | Has Description | Has OG | Has Canonical |
|---|---|---|---|---|---|
| Homepage | / | ? | ? | ? | ? |
| About | /about | ? | ? | ? | ? |
| Pricing | /pricing | ? | ? | ? | ? |
| Blog index | /blog | ? | ? | ? | ? |
| Blog post | /blog/[slug] | ? | ? | ? | ? |
| ... | ... | ... | ... | ... | ... |
# Find all title definitions
grep -rn "title:" --include="*.tsx" --include="*.ts" . | grep -v node_modules | grep -v "\.test\.\|\.spec\."
Title tag rules:
| Rule | Requirement | Check |
|---|---|---|
| Unique per page | No two pages share the same title | Compare all titles |
| Length | 50-60 characters | Count characters |
| Keyword placement | Primary keyword in first 40 chars | Review keyword position |
| Brand suffix | " - [Brand]" or " | [Brand]" at end | Consistent format |
| No keyword stuffing | Keyword appears once, naturally | Read aloud test |
| Compelling | Would you click this in search results? | Subjective but critical |
Title optimization formula:
[Primary Keyword]: [Value Proposition] | [Brand]
Examples:
# Find all description definitions
grep -rn "description:" --include="*.tsx" --include="*.ts" . | grep -v node_modules | grep -v "\.test\.\|\.spec\."
Description rules:
| Rule | Requirement | Check |
|---|---|---|
| Unique per page | No duplicates | Compare all descriptions |
| Length | 150-155 characters | Count characters |
| Includes keyword | Primary keyword present | Keyword search |
| Includes CTA | Action-oriented language | Look for verbs |
| Matches page content | Description reflects actual content | Manual review |
| No truncation | Complete thought within limit | Check ending |
Description formula:
[What the page offers]. [Specific benefit or differentiator]. [CTA - action verb].
Examples:
# Find OG tag definitions
grep -rn "openGraph\|og:" --include="*.tsx" --include="*.ts" --include="*.html" . | grep -v node_modules
Required OG tags per page:
| Tag | Required | Specification |
|---|---|---|
og:title | Yes | Can differ from <title> — optimize for social, not search |
og:description | Yes | Can differ from meta description — more casual tone ok |
og:image | Yes | 1200x630px, < 5MB, shows product/brand/visual |
og:url | Yes | Canonical URL of the page |
og:type | Yes | website for homepage, article for blog posts |
og:site_name | Recommended | Brand name |
twitter:card | Recommended | summary_large_image for image-heavy shares |
twitter:title | Recommended | Can match og:title |
twitter:description | Recommended | Can match og:description |
twitter:image | Recommended | Can match og:image |
Common og:image issues:
/images/og.png) → must be absolute URL# Find canonical definitions
grep -rn "canonical\|alternates" --include="*.tsx" --include="*.ts" --include="*.html" . | grep -v node_modules
Canonical URL rules:
| Check | Rule | Common Mistake |
|---|---|---|
| Self-referencing | Every page canonicals to itself | Missing canonical = Google guesses |
| Consistency | Always use one format (www vs non-www, trailing slash vs not) | Mixed formats split authority |
| HTTPS | Canonical always uses https:// | http:// canonical on https:// page |
| Absolute URL | Full URL, not relative path | /about instead of https://domain.com/about |
| No noindex + canonical conflict | Don't canonical to a noindexed page | Contradictory signals |
| Pagination | Paginated pages canonical to themselves or page 1 | All pages canonical to page 1 (outdated pattern) |
Duplicate content scenarios requiring canonicals:
/products?sort=price → canonical to /productswww.example.com/about → canonical to example.com/abouthttp:// → canonical to https:///about/ → canonical to /about (pick one)/about/print → canonical to /about# Find robots meta directives
grep -rn "robots\|noindex\|nofollow" --include="*.tsx" --include="*.ts" --include="*.html" . | grep -v node_modules
Pages that SHOULD have noindex:
| Page Type | Directive | Why |
|---|---|---|
| Admin dashboard | noindex, nofollow | Internal tool, not for search |
| Login / register | noindex, follow | Auth pages waste crawl budget |
| Search results | noindex, follow | Dynamic pages with thin content |
| Thank you / confirmation | noindex, nofollow | Post-conversion, no search value |
| Staging / preview | noindex, nofollow | Duplicate content with production |
| User profiles (if private) | noindex, nofollow | Privacy concern |
Pages that should NOT have noindex:
noindex on important pages (common after staging → production migration)For every failing tag, generate the corrected version:
## Optimized Meta Tags
### / (Homepage)
**Current:**
- Title: "Home"
- Description: (missing)
- OG Image: (missing)
**Recommended:**
```tsx
export const metadata: Metadata = {
title: 'Acme - Project Management for Remote Teams',
description: 'Manage projects 3x faster with real-time collaboration, task tracking, and team dashboards. Built for remote teams. Start free today.',
openGraph: {
title: 'Acme - Project Management for Remote Teams',
description: 'All-in-one project management for distributed teams. Real-time collaboration, built-in reporting.',
images: [{ url: 'https://acme.com/og/homepage.png', width: 1200, height: 630 }],
url: 'https://acme.com',
type: 'website',
siteName: 'Acme',
},
twitter: {
card: 'summary_large_image',
},
alternates: {
canonical: 'https://acme.com',
},
};
Current:
Recommended:
export const metadata: Metadata = {
title: 'Pricing - Acme Plans Starting at $0/mo',
description: 'Compare Acme plans: Free, Pro ($19/mo), and Enterprise. All plans include unlimited projects and real-time collaboration. Start free today.',
// ... (full OG tags)
};
### Step 8: Output Tag Report
🏷️ Meta Tag Optimizer — Complete
Pages scanned: [count] Issues found: [count]
Summary: Title tags: [X/count] optimized — [count] need fixing Descriptions: [X/count] optimized — [count] need fixing OG tags: [X/count] complete — [count] missing Canonical URLs: [X/count] correct — [count] missing or wrong Robots meta: [X/count] correct — [count] need review
Page-by-page comparison:
| Page | Title (current → recommended) | Description | OG | Canonical |
|---|---|---|---|---|
| / | "Home" → "Acme - PM for Remote Teams" | ❌ missing | ❌ missing | ❌ missing |
| /about | "About" → "About Acme - Built by Devs" | ⚠️ too short | ✅ ok | ✅ ok |
| /blog | ✅ ok | ✅ ok | ❌ no image | ✅ ok |
| /pricing | ⚠️ too short | ⚠️ generic | ✅ ok | ❌ missing |
Next steps:
## Level History
- **Lv.1** — Base: Page scanning, title tag audit (50-60 chars, keyword placement), meta description audit (150-155 chars, CTA), Open Graph tags (og:title/description/image), canonical URL verification, robots meta directives, optimized replacement generation, page-by-page comparison output. (Origin: MemStack Pro v3.2, Mar 2026)
npx claudepluginhub cwinvestments/memstack --plugin memstackAudits and corrects meta tags for SEO (title, description, canonical, viewport, lang) and social sharing (Open Graph, Twitter Cards) across website pages. Generates reports and ready-to-use HTML fixes.
Audits and fixes HTML metadata: page titles, descriptions, canonical URLs, Open Graph, Twitter cards, favicons, JSON-LD, and robots directives. Use when adding or reviewing SEO and social metadata.
Optimizes websites for search engines via technical SEO: robots.txt, meta robots, canonical URLs, XML sitemaps, URL structures, per Lighthouse audits and Google guidelines.