🎯

pseo-quality-guard

🎯Skill

from lisbeth718/pseo-skills

VibeIndex|
What it does

Validates programmatic SEO pages by detecting thin content, duplicates, and keyword cannibalization to prevent Google penalties.

πŸ“¦

Part of

lisbeth718/pseo-skills(12 items)

pseo-quality-guard

Installation

πŸ“‹ No install commands found in docs. Showing default command. Check GitHub for actual instructions.
Quick InstallInstall with npx
npx skills add lisbeth718/pseo-skills --skill pseo-quality-guard
1Installs
-
AddedFeb 4, 2026

Skill Details

SKILL.md

Validate programmatic SEO pages against quality standards to prevent thin content, duplicate content, and keyword cannibalization. Use when auditing pSEO output quality, before deploying new pages, when Google Search Console reports issues, or when checking if generated pages meet quality thresholds. This skill can also be used automatically to validate changes made by other pseo-* skills.

Overview

# pSEO Quality Guard

Validate generated pages against SEO quality standards. Detect and flag issues that would cause Google to devalue, deindex, or penalize programmatic pages.

Core Principles

  1. No thin pages: Every page must provide substantial, unique value
  2. No duplicate content: No two pages should have the same or near-identical content
  3. No cannibalization: No two pages should target the same keyword or intent
  4. Metadata uniqueness: Every page has unique title and description
  5. Fail loudly: Quality issues should block deployment, not slip through silently

Quality Checks

1. Thin Content Detection

A page is thin if it:

  • Has fewer than 300 words of unique text content (excluding navigation, footer, boilerplate)
  • Is essentially a template with only 1-2 variable substitutions
  • Contains no meaningful content beyond its metadata
  • Has the same paragraph structure as other pages with only proper nouns changed

How to check:

  • Extract text content from each rendered page (strip HTML tags, nav, footer)
  • Count unique words per page
  • Compare content across pages β€” compute similarity ratios
  • Flag pages with < 300 unique words or > 80% similarity to another page

2. Duplicate Content Detection

Check for:

  • Exact duplicates: Two pages with identical body content
  • Near duplicates: Pages with > 80% text similarity (use Jaccard similarity on n-grams or cosine similarity)
  • Title duplicates: Two pages with the same </code> tag</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Description duplicates</strong>: Two pages with the same meta description</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>URL-based duplicates</strong>: Different URLs serving the same content (www vs non-www, trailing slash variants)</span></li></ul><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span><strong>How to detect:</strong></span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>At small scale (< 200 pages), pairwise comparison is feasible:</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>```</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>For each pair of pages:</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> similarity = intersection(ngrams(page_a), ngrams(page_b)) / union(ngrams(page_a), ngrams(page_b))</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> if similarity > 0.8: FLAG as near-duplicate</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>```</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>At scale (200+ pages), pairwise is O(nΒ²) and impractical. Use one of:</span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span><strong>MinHash / LSH</strong>: Hash n-gram sets into fixed-size signatures, use locality-sensitive hashing to find candidate pairs. Reduces comparisons from O(nΒ²) to near-linear.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>SimHash</strong>: Compute a fingerprint per page, compare fingerprints (Hamming distance). Pages with similar fingerprints are candidates.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Sampling</strong>: Compare each page against a random sample of 50 others + all pages in the same category. Not exhaustive but catches the common cases.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Template fingerprinting</strong>: Hash the non-variable parts of each page. If two pages share the same template fingerprint, flag them β€” they differ only in variable slots.</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">3. Keyword Cannibalization Detection</h4><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>Cannibalization occurs when multiple pages target the same search query.</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span><strong>Detection method:</strong></span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Extract the primary keyword/intent from each page (from title, H1, and first paragraph)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Group pages that share the same primary keyword</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Flag groups with 2+ pages targeting the same keyword</span></li></ul><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span><strong>Resolution strategies:</strong></span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Merge thin pages targeting the same keyword into one comprehensive page</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Differentiate intent (informational vs. transactional vs. navigational)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Use canonical tags to point duplicates to the primary page</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Adjust titles and H1s to target distinct long-tail variations</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">4. Metadata Quality Validation</h4><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>Check every page's metadata for:</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| Field | Validation Rule |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>|-------|----------------|</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| Title | Present, 30-70 chars, unique across all pages |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| Description | Present, 100-170 chars, unique across all pages |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| H1 | Present, exactly one per page, unique across all pages |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| Canonical | Present, absolute URL, self-referencing |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| OG:title | Present |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| OG:description | Present |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| OG:url | Present, matches canonical |</span></p><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">5. Schema Markup Validation</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Every page has at least BreadcrumbList schema</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Content pages have Article or appropriate type schema</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>FAQ pages have FAQPage schema with valid Q&A pairs</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>No schema has empty or placeholder values</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>All URLs in schema are absolute</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">6. Internal Link Health</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>No orphan pages (pages with zero inbound internal links)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>No broken internal links (href targets that return 404)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Every page links back to its category hub</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Breadcrumbs are present and correct</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">7. Scaled Content Abuse Detection (Google 2025)</h4><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>Google's 2025 updates (March, June, August, December) increasingly target programmatic pages that exist primarily to manipulate rankings. The method (AI, templates, human) is irrelevant β€” only intent and value matter.</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span><strong>Check for these specific patterns that trigger Google's SpamBrain system:</strong></span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Template repetitiveness ratio</strong>: Extract the boilerplate (shared HTML structure and text) from all pages of a type. If boilerplate is 60-80%, flag as warning; if > 80%, flag as critical risk for scaled content abuse.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Variable-swap-only differentiation</strong>: If the only differences between pages are proper nouns (city names, product names, keywords), flag as extremely high risk. Google specifically called out "location pages that use the same template in dozens of cities."</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Filler content patterns</strong>: Detect generic introductory paragraphs ("In today's world...", "When it comes to...", "If you're looking for...") that add no information. These patterns are specifically targeted by the December 2025 "Needs Met" enforcement.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Value-first test</strong>: Check if the primary content/answer appears within the first 200 words. Pages that bury value below filler are devalued.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>E-E-A-T signal presence</strong>: Check for author attribution, data sources, last-updated dates. Absence of all trust signals on pSEO pages is a risk factor.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Publication velocity</strong>: If 500+ pages were published within a single day or week, flag for review. Gradual rollout is safer.</span></li></ul><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span><strong>Severity:</strong></span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Template repetitiveness > 80%: <strong>Critical</strong> β€” will likely trigger scaled content abuse penalty</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Template repetitiveness 60-80%: <strong>Warning</strong> β€” at risk, needs content enrichment</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>No E-E-A-T signals on any page: <strong>Warning</strong></span></li><li class="text-zinc-600 dark:text-zinc-400"><span>All pages published same day: <strong>Warning</strong></span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">8. Heading Hierarchy Validation</h4><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>Check every page for correct heading structure:</span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Exactly one <code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800"><h1></code> per page</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>No heading level skips (h1 β†’ h3 without h2 is invalid)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Headings follow a logical document outline (h1 > h2 > h3)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>No empty heading tags</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Heading content is meaningful (not generic like "Section 1")</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">9. Robots and Indexation</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Pages intended for indexing have <code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">index, follow</code> (or no robots tag)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Thin or utility pages have <code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">noindex</code></span></li><li class="text-zinc-600 dark:text-zinc-400"><span>No important pages accidentally blocked by robots.txt</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Sitemap includes all indexable pages and excludes noindexed ones</span></li></ul></div></div><div class="mt-6 border-t border-zinc-100 pt-6 dark:border-zinc-800"><h3 class="mb-3 text-lg font-semibold text-zinc-900 dark:text-white">Output Format</h3><div><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>```</span></p></div></div><div class="mt-6 border-t border-zinc-100 pt-6 dark:border-zinc-800"><h3 class="mb-3 text-lg font-semibold text-zinc-900 dark:text-white">pSEO Quality Report</h3><div><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Summary</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Total pages checked: X</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Issues found: X (Y critical, Z warnings)</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Thin Content</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>[list of pages with word counts below threshold]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Duplicate Content</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>[list of duplicate pairs with similarity scores]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Keyword Cannibalization</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>[list of keyword groups with competing pages]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Metadata Issues</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>[list of pages with metadata problems]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Schema Issues</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>[list of pages with schema problems]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Linking Issues</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>[list of orphan pages and broken links]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Scaled Content Abuse Risk</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Template boilerplate ratio: X%</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Variable-swap-only pages: X</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Pages missing E-E-A-T signals: X</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Filler intro patterns detected: X pages</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Risk level: [Low | Medium | High | Critical]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Pruning Recommendations</h4><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Pages to remove: X</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Pages to merge: X</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Pages to noindex: X</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Pages to enrich: X</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>[list of specific pages and recommended action]</span></li></ul><h4 class="mb-2 mt-4 font-semibold text-zinc-800 dark:text-zinc-200">Action Required</h4><ol class="mb-4 ml-6 space-y-1 list-decimal"><li class="text-zinc-600 dark:text-zinc-400"><span>[prioritized list of fixes]</span></li></ol><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>```</span></p></div></div><div class="mt-6 border-t border-zinc-100 pt-6 dark:border-zinc-800"><h3 class="mb-3 text-lg font-semibold text-zinc-900 dark:text-white">Memory Considerations</h3><div><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>Quality checks load and compare page content across the full site. At scale this is the most memory-intensive operation in the pSEO pipeline.</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span><strong>Do NOT load all full page content into memory at once.</strong> Instead:</span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Stream-compare</strong>: Load pages one at a time, compute a fingerprint (hash or MinHash signature), store only the fingerprint (~100 bytes per page). Compare fingerprints after all pages are processed.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Batch by category</strong>: Run similarity checks within each category first (most duplicates are same-category). Only run cross-category checks on a sample.</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Write intermediate results to disk</strong>: For large sites, write per-page metrics (word count, fingerprint, title hash) to a JSON file, then process the file.</span></li></ul><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>Memory budget estimate:</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| Pages | Fingerprints only | Full content in memory |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>|-------|-------------------|----------------------|</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| 1,000 | ~100KB | ~100-500MB |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| 10,000 | ~1MB | ~1-5GB (will OOM) |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>| 50,000 | ~5MB | ~5-25GB (impossible) |</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>Always use the fingerprint approach at 500+ pages.</span></p></div></div><div class="mt-6 border-t border-zinc-100 pt-6 dark:border-zinc-800"><h3 class="mb-3 text-lg font-semibold text-zinc-900 dark:text-white">Content Pruning Recommendations</h3><div><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>When quality checks find issues, don't just flag β€” recommend action. Google's own guidance: "If you're considering deleting entire sections of your site, that's likely a sign those sections were created for search engines first, and not people."</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>See <code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">references/thresholds.md</code> β†’ "Content Pruning Decision Thresholds" for the exact decision table (conditions and actions).</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>200 genuinely valuable pages outperform 5,000 thin pages. Pruning is not failure β€” it's quality control.</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span><strong>After pruning:</strong></span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span>Add 301 redirects from removed URLs to the best related page</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Update the sitemap to exclude removed pages</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Update internal links that pointed to removed pages</span></li><li class="text-zinc-600 dark:text-zinc-400"><span>Re-run quality guard to verify improved metrics</span></li></ul></div></div><div class="mt-6 border-t border-zinc-100 pt-6 dark:border-zinc-800"><h3 class="mb-3 text-lg font-semibold text-zinc-900 dark:text-white">Integration as Build Check</h3><div><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>This skill can be turned into a build-time validation script:</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>```typescript</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>// scripts/validate-pseo.ts</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>// Run: npx tsx scripts/validate-pseo.ts</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>// CI/CD: exits with code 1 if critical issues found</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>import { getAllSlugs, getPageData } from "../lib/data";</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>async function validate() {</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> const slugs = await getAllSlugs();</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> const issues: { slug: string; level: "critical" | "warning"; message: string }[] = [];</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> for (const { slug } of slugs) {</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> const page = await getPageData(slug);</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> if (!page) {</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> issues.push({ slug, level: "critical", message: "Page data missing" });</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> continue;</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> }</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> if (!page.title || !page.metaDescription || !page.h1) {</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> issues.push({ slug, level: "critical", message: "Missing required metadata" });</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> }</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> if (page.title.length > 70) {</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> issues.push({ slug, level: "warning", message: <code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">Title too long: ${page.title.length} chars</code> });</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> }</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> // Add more checks: word count, duplicate titles, schema presence, etc.</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> }</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> const critical = issues.filter((i) => i.level === "critical");</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> console.log(<code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">Checked ${slugs.length} pages. ${issues.length} issues (${critical.length} critical).</code>);</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> issues.forEach((i) => console.log(<code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">[${i.level}] ${i.slug}: ${i.message}</code>));</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span> process.exit(critical.length > 0 ? 1 : 0);</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>}</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>validate();</span></p><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>```</span></p></div></div><div class="mt-6 border-t border-zinc-100 pt-6 dark:border-zinc-800"><h3 class="mb-3 text-lg font-semibold text-zinc-900 dark:text-white">Scope Parameter</h3><div><p class="mb-3 text-zinc-600 dark:text-zinc-400"><span>If <code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">$ARGUMENTS</code> specifies a check:</span></p><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">all</code> (default): Run all checks</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">thin</code>: Thin content detection only</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">duplicates</code>: Duplicate content detection only</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">cannibalization</code>: Keyword cannibalization only</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">metadata</code>: Metadata validation only</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">abuse</code>: Scaled content abuse pattern detection only</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">prune</code>: Run all checks and output pruning recommendations</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><code class="rounded bg-zinc-100 px-1.5 py-0.5 text-sm dark:bg-zinc-800">delta</code>: Run all checks on pages modified since last validation only (requires content hashing β€” see pseo-scale section 4)</span></li></ul></div></div><div class="mt-6 border-t border-zinc-100 pt-6 dark:border-zinc-800"><h3 class="mb-3 text-lg font-semibold text-zinc-900 dark:text-white">Relationship to Other Skills</h3><div><ul class="mb-4 ml-6 space-y-1 list-disc"><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Validates output of</strong>: pseo-templates, pseo-metadata, pseo-schema, pseo-linking</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Depends on</strong>: pseo-data (needs access to all page data for cross-page comparisons)</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Run after</strong>: Any other pseo-* skill to verify quality</span></li><li class="text-zinc-600 dark:text-zinc-400"><span><strong>Extended by</strong>: pseo-scale (incremental/delta validation, parallel category-partitioned checks, content hash storage)</span></li></ul></div></div></div></div></div><div class="mt-12 border-t border-zinc-200 pt-8 dark:border-zinc-800"><h2 class="mb-4 flex items-center gap-2 text-lg font-semibold text-zinc-900 dark:text-white"><span>More from this repository</span><span class="rounded-full bg-violet-100 px-2 py-0.5 text-sm font-medium text-violet-700 dark:bg-violet-900/50 dark:text-violet-300">10</span></h2><div class="grid gap-3 sm:grid-cols-2"><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-llm-visibility"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-llm-visibility</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Optimizes programmatic SEO pages for AI search visibility by structuring content for LLM extraction and citation across multiple generative engines.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-performance"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-performance</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Optimizes programmatic SEO applications for fast builds, excellent Core Web Vitals, and scalable performance across 1000+ pages.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-schema"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-schema</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Generates context-specific JSON-LD structured data schemas for programmatic SEO pages to enhance search engine understanding and rich result potential.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-orchestrate"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-orchestrate</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Orchestrates the complete programmatic SEO workflow by sequentially executing specialized skills to discover, audit, implement, and validate pSEO pages across multiple phases.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-discovery"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-discovery</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Discovers programmatic SEO opportunities by analyzing codebase, business context, and data assets to identify scalable page types matching search intent.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-linking"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-linking</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Links and maps potential career pathways by analyzing professional skills, educational backgrounds, and industry connections.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-scale"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-scale</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Scales programmatic SEO systems to 10K-100K+ pages with database-backed architectures, incremental validation, and optimized content delivery.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-audit"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-audit</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Audits a codebase for programmatic SEO readiness, identifying scalability gaps and providing actionable insights for 1000+ page websites.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-templates"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-templates</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Generates programmatic SEO page templates with dynamic routing, creating unique, intent-matched content for each page automatically.</p></div></a><a class="flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50" href="/skills/lisbeth718/pseo-skills/pseo-data"><span class="text-xl">🎯</span><div class="min-w-0 flex-1"><div class="flex items-center gap-2"><span class="truncate font-medium text-zinc-900 dark:text-white">pseo-data</span><span class="inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs "><span>🎯</span><span>Skill</span></span></div><p class="truncate text-sm text-zinc-500 dark:text-zinc-400">Designs and generates structured data architecture for programmatic SEO pages, ensuring type-safe, SEO-optimized content models and data pipelines.</p></div></a></div></div></div><!--$--><!--/$--></main><footer class="border-t border-zinc-200 bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900"><div class="mx-auto max-w-7xl px-4 py-12 sm:px-6 lg:px-8"><div class="grid grid-cols-1 gap-8 md:grid-cols-4"><div class="md:col-span-1"><a class="flex items-center" href="/"><img alt="Vibe Index" loading="lazy" width="140" height="40" decoding="async" data-nimg="1" class="h-8 w-auto dark:hidden" style="color:transparent" src="/logo.png?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe"/><img alt="Vibe Index" loading="lazy" width="140" height="40" decoding="async" data-nimg="1" class="hidden h-8 w-auto dark:block" style="color:transparent" src="/logo-dark.png?v=3&dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe"/></a><p class="mt-4 text-sm text-zinc-600 dark:text-zinc-400">Everything you need for vibe coding. Real-time updates on skills, plugins, MCP servers, and marketplaces.</p></div><div><h3 class="text-sm font-semibold text-zinc-900 dark:text-white">Resources</h3><ul class="mt-4 space-y-2"><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/skills">Skills</a></li><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/mcp">MCP Servers</a></li><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/marketplaces">Marketplaces</a></li><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/plugins">Plugins</a></li></ul></div><div><h3 class="text-sm font-semibold text-zinc-900 dark:text-white">Support</h3><ul class="mt-4 space-y-2"><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/about">About Us</a></li><li><a href="mailto:admin@vibeindex.ai" class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white">Contact Us</a></li><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/feedback">Feedback</a></li><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/activity">Sync Activity</a></li></ul></div><div><h3 class="text-sm font-semibold text-zinc-900 dark:text-white">Legal</h3><ul class="mt-4 space-y-2"><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/privacy">Privacy Policy</a></li><li><a class="text-sm text-zinc-600 transition-colors hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white" href="/terms">Terms of Service</a></li></ul></div></div><div class="mt-8 border-t border-zinc-200 pt-8 dark:border-zinc-800"><p class="text-center text-sm text-zinc-500 dark:text-zinc-500">Β© <!-- -->2026<!-- --> <!-- -->Vibe Index<!-- -->. <!-- -->All rights reserved.<!-- --> <!-- -->Operated by<!-- --> <a href="https://jolab.ai" target="_blank" rel="noopener noreferrer" class="text-zinc-600 hover:text-zinc-900 dark:text-zinc-400 dark:hover:text-white transition-colors">JoLab</a></p></div></div></footer><script src="/_next/static/chunks/74f2567fe670fe18.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[2355,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"Analytics\"]\n3:I[44636,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"Providers\"]\n4:I[3374,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\n5:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/d2be314c3ece3fbe.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/d2be314c3ece3fbe.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\n7:I[22016,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/8544c26c9ccb1a8a.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"\"]\n8:I[58234,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\na:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/d2be314c3ece3fbe.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"OutletBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/d2be314c3ece3fbe.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/d2be314c3ece3fbe.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"MetadataBoundary\"]\n11:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/d2be314c3ece3fbe.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\n:HL[\"/_next/static/chunks/2473c16c0c2f6b5f.css?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"style\"]\n:HL[\"/_next/static/chunks/57db8c2e79c90b8c.css?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"style\"]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"jPO-BujWrcnKty2IaOdQo\",\"c\":[\"\",\"skills\",\"lisbeth718\",\"pseo-skills\",\"pseo-quality-guard\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"skills\",{\"children\":[[\"owner\",\"lisbeth718\",\"d\"],{\"children\":[[\"repo\",\"pseo-skills\",\"d\"],{\"children\":[[\"skill\",\"pseo-quality-guard\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]}]}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/2473c16c0c2f6b5f.css?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/57db8c2e79c90b8c.css?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased min-h-screen flex flex-col\",\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"$L3\",null,{\"children\":[[\"$\",\"$L4\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1\",\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"flex min-h-[60vh] flex-col items-center justify-center px-4\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-6xl font-bold text-zinc-900 dark:text-white\",\"children\":\"404\"}],[\"$\",\"h2\",null,{\"className\":\"mt-4 text-xl font-semibold text-zinc-700 dark:text-zinc-300\",\"children\":\"Page Not Found\"}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-zinc-500 dark:text-zinc-400\",\"children\":\"The page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"$L7\",null,{\"href\":\"/\",\"className\":\"mt-8 inline-flex items-center rounded-lg bg-zinc-900 px-6 py-3 text-sm font-medium text-white transition-colors hover:bg-zinc-800 dark:bg-zinc-100 dark:text-zinc-900 dark:hover:bg-zinc-200\",\"children\":\"Go Home\"}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L8\",null,{}]]}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$L9\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/8544c26c9ccb1a8a.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"$b\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@c\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false]},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$b\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"S\":false}\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"12:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/d2be314c3ece3fbe.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"IconMark\"]\nc:null\n"])</script><script>self.__next_f.push([1,"10:[[\"$\",\"title\",\"0\",{\"children\":\"pseo-quality-guard | Vibe Index\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Validates programmatic SEO pages by detecting thin content, duplicates, and keyword cannibalization to prevent Google penalties.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"author\",\"content\":\"Vibe Index Team\"}],[\"$\",\"meta\",\"3\",{\"name\":\"keywords\",\"content\":\"vibe coding, vibecoding, AI coding, Claude Code, MCP servers, AI skills, AI plugins, AI development, AI assistants, Claude, cursor, windsurf, aider, cline\"}],[\"$\",\"meta\",\"4\",{\"name\":\"creator\",\"content\":\"Vibe Index\"}],[\"$\",\"meta\",\"5\",{\"name\":\"publisher\",\"content\":\"Vibe Index\"}],[\"$\",\"meta\",\"6\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"7\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"link\",\"8\",{\"rel\":\"canonical\",\"href\":\"https://vibeindex.ai\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:title\",\"content\":\"Vibe Index - The Ultimate Vibe Coding Directory\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:description\",\"content\":\"The ultimate directory for vibe coding. Discover AI coding tools - skills, plugins, MCP servers, and marketplaces for Claude Code and other AI assistants.\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:url\",\"content\":\"https://vibeindex.ai\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:site_name\",\"content\":\"Vibe Index\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image\",\"content\":\"https://vibeindex.ai/icon.png\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:image:width\",\"content\":\"512\"}],[\"$\",\"meta\",\"16\",{\"property\":\"og:image:height\",\"content\":\"512\"}],[\"$\",\"meta\",\"17\",{\"property\":\"og:image:alt\",\"content\":\"Vibe Index Logo\"}],[\"$\",\"meta\",\"18\",{\"property\":\"og:locale:alternate\",\"content\":\"ko_KR\"}],[\"$\",\"meta\",\"19\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:title\",\"content\":\"Vibe Index - Vibe Coding Directory\"}],[\"$\",\"meta\",\"22\",{\"name\":\"twitter:description\",\"content\":\"The ultimate directory for vibe coding. Discover AI coding tools - skills, plugins, MCP servers, and marketplaces for Claude Code and other AI assistants.\"}],[\"$\",\"meta\",\"23\",{\"name\":\"twitter:image\",\"content\":\"https://vibeindex.ai/icon.png\"}],[\"$\",\"link\",\"24\",{\"rel\":\"icon\",\"href\":\"/favicon-16x16.png\",\"sizes\":\"16x16\",\"type\":\"image/png\"}],[\"$\",\"link\",\"25\",{\"rel\":\"icon\",\"href\":\"/favicon-32x32.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"26\",{\"rel\":\"icon\",\"href\":\"/icon.png\",\"sizes\":\"512x512\",\"type\":\"image/png\"}],[\"$\",\"link\",\"27\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\"}],[\"$\",\"$L12\",\"28\",{}]]\n"])</script><script>self.__next_f.push([1,"13:I[74533,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/8544c26c9ccb1a8a.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"FavoriteButton\"]\n14:I[54371,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/8544c26c9ccb1a8a.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\n15:I[38848,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/8544c26c9ccb1a8a.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"9:[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-4xl px-4 py-12 sm:px-6 lg:px-8\",\"children\":[[\"$\",\"nav\",null,{\"className\":\"mb-6\",\"children\":[\"$\",\"ol\",null,{\"className\":\"flex items-center gap-2 text-sm\",\"children\":[[\"$\",\"li\",null,{\"children\":[\"$\",\"$L7\",null,{\"href\":\"/skills\",\"className\":\"text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300\",\"children\":\"Skills\"}]}],[\"$\",\"li\",null,{\"className\":\"text-zinc-400\",\"children\":\"/\"}],[\"$\",\"li\",null,{\"className\":\"text-zinc-900 dark:text-white\",\"children\":\"pseo-quality-guard\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"mb-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-start gap-4\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-5xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2 flex-wrap\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-3xl font-bold text-zinc-900 dark:text-white\",\"children\":\"pseo-quality-guard\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2.5 py-1 text-sm \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}],[\"$\",\"$L13\",null,{\"resourceId\":\"0fd56148-f856-418c-8fcf-f7978cd78ce9\",\"size\":\"sm\"}],false]}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-zinc-600 dark:text-zinc-400\",\"children\":[\"from \",\"lisbeth718\",\"/\",\"pseo-skills\"]}]]}]]}],[\"$\",\"$L14\",null,{\"description\":\"Validates programmatic SEO pages by detecting thin content, duplicates, and keyword cannibalization to prevent Google penalties.\",\"descriptionKo\":\"Programmatic SEO νŽ˜μ΄μ§€μ˜ ν’ˆμ§ˆμ„ κ²€μ¦ν•˜μ—¬ 얇은 μ½˜ν…μΈ , 쀑볡 νŽ˜μ΄μ§€, ν‚€μ›Œλ“œ μΊλ‹ˆλ°œλ¦¬μ œμ΄μ…˜μ„ κ°μ§€ν•˜κ³  Google νŽ˜λ„ν‹°λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.\",\"resourceId\":\"0fd56148-f856-418c-8fcf-f7978cd78ce9\",\"resourceName\":\"pseo-quality-guard\",\"resourceType\":\"skill\",\"descriptionType\":\"ai\"}],null,null,[\"$\",\"$L7\",null,{\"href\":\"/collection/lisbeth718/pseo-skills\",\"className\":\"mt-4 flex items-center gap-3 rounded-lg border border-zinc-200 bg-zinc-50 p-4 transition-all hover:border-zinc-300 hover:bg-zinc-100 dark:border-zinc-700 dark:bg-zinc-800/50 dark:hover:border-zinc-600 dark:hover:bg-zinc-800\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-2xl\",\"children\":\"πŸ“¦\"}],[\"$\",\"div\",null,{\"className\":\"flex-1\",\"children\":[[\"$\",\"p\",null,{\"className\":\"text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Part of\"}],[\"$\",\"p\",null,{\"className\":\"font-semibold text-zinc-900 dark:text-white\",\"children\":[\"lisbeth718\",\"/\",\"pseo-skills\",[\"$\",\"span\",null,{\"className\":\"ml-2 text-sm font-normal text-zinc-500 dark:text-zinc-400\",\"children\":[\"(\",12,\" \",\"items\",\")\"]}]]}]]}],[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"className\":\"h-5 w-5 text-zinc-400\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":2,\"d\":\"M9 5l7 7-7 7\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"mt-4 flex flex-wrap gap-2\",\"children\":[[\"$\",\"span\",\"pseo-quality-guard\",{\"onClick\":\"$undefined\",\"className\":\"inline-flex items-center rounded-full bg-zinc-100 px-2 py-0.5 text-xs font-medium text-zinc-600 transition-colors hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-400 dark:hover:bg-zinc-700 \",\"children\":\"pseo-quality-guard\"}]]}]]}],[\"$\",\"div\",null,{\"className\":\"mb-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"mb-4 text-lg font-semibold text-zinc-900 dark:text-white\",\"children\":\"Installation\"}],[\"$\",\"$L15\",null,{\"installGuide\":{\"found\":false,\"commands\":[]},\"githubUrl\":\"https://github.com/lisbeth718/pseo-skills\",\"owner\":\"lisbeth718\",\"repo\":\"pseo-skills\",\"resourceType\":\"skill\",\"resourceName\":\"pseo-quality-guard\"}]]}],[\"$\",\"div\",null,{\"className\":\"mb-8 flex gap-6 text-sm text-zinc-500 dark:text-zinc-400\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-1.5\",\"title\":\"Installs\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"className\":\"h-4 w-4\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":2,\"d\":\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"}]}],[\"$\",\"span\",null,{\"className\":\"font-medium text-zinc-700 dark:text-zinc-300\",\"children\":\"1\"}],\"$L16\"]}],false,\"$L17\",\"$L18\"]}],\"$L19\",\"$L1a\",\"$L1b\"]}]\n"])</script><script>self.__next_f.push([1,"1c:I[74533,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/8544c26c9ccb1a8a.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"FavoriteCount\"]\n1d:I[13428,[\"/_next/static/chunks/f5613062b736c8a5.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/6875684dac0d32c7.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/7ac56969506ec814.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\",\"/_next/static/chunks/8544c26c9ccb1a8a.js?dpl=dpl_6mY5EC9R9sVE9kiWq41XH3khJYTe\"],\"default\"]\n16:[\"$\",\"span\",null,{\"className\":\"text-zinc-400 dark:text-zinc-500\",\"children\":\"Installs\"}]\n17:[\"$\",\"div\",null,{\"className\":\"flex items-center gap-1.5\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"h-4 w-4 text-violet-500\",\"fill\":\"currentColor\",\"stroke\":\"currentColor\",\"strokeWidth\":0.5,\"viewBox\":\"0 0 24 24\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"d\":\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\"}]}],[\"$\",\"span\",null,{\"className\":\"font-medium text-zinc-700 dark:text-zinc-300\",\"children\":[\"$\",\"$L1c\",null,{\"resourceId\":\"0fd56148-f856-418c-8fcf-f7978cd78ce9\"}]}]]}]\n18:[\"$\",\"div\",null,{\"className\":\"flex items-center gap-1.5\",\"children\":[[\"$\",\"span\",null,{\"children\":\"Added\"}],[\"$\",\"span\",null,{\"className\":\"font-medium text-zinc-700 dark:text-zinc-300\",\"children\":\"Feb 4, 2026\"}]]}]\n"])</script><script>self.__next_f.push([1,"19:[\"$\",\"div\",null,{\"className\":\"flex flex-wrap gap-4\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://github.com/lisbeth718/pseo-skills\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex items-center gap-2 rounded-lg bg-zinc-900 px-6 py-3 text-sm font-medium text-white transition-colors hover:bg-zinc-800 dark:bg-zinc-100 dark:text-zinc-900 dark:hover:bg-zinc-200\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"h-5 w-5\",\"fill\":\"currentColor\",\"viewBox\":\"0 0 24 24\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"d\":\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\",\"clipRule\":\"evenodd\"}]}],\"View on GitHub\"]}],[\"$\",\"$L7\",null,{\"href\":\"/skills\",\"className\":\"inline-flex items-center gap-2 rounded-lg border border-zinc-300 bg-white px-6 py-3 text-sm font-medium text-zinc-700 transition-colors hover:bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-800 dark:text-zinc-300 dark:hover:bg-zinc-700\",\"children\":[[\"$\",\"svg\",null,{\"xmlns\":\"http://www.w3.org/2000/svg\",\"className\":\"h-5 w-5\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":2,\"d\":\"M10 19l-7-7m0 0l7-7m-7 7h18\"}]}],\"Back to Skills\"]}]]}]\n"])</script><script>self.__next_f.push([1,"1e:T2fb6,"])</script><script>self.__next_f.push([1,"---\nname: pseo-quality-guard\ndescription: Validate programmatic SEO pages against quality standards to prevent thin content, duplicate content, and keyword cannibalization. Use when auditing pSEO output quality, before deploying new pages, when Google Search Console reports issues, or when checking if generated pages meet quality thresholds. This skill can also be used automatically to validate changes made by other pseo-* skills.\nargument-hint: \"[check: all | thin | duplicates | cannibalization | metadata | abuse | prune | delta]\"\nallowed-tools: Read, Glob, Grep, Bash\n---\n\n# pSEO Quality Guard\n\nValidate generated pages against SEO quality standards. Detect and flag issues that would cause Google to devalue, deindex, or penalize programmatic pages.\n\n## Core Principles\n\n1. **No thin pages**: Every page must provide substantial, unique value\n2. **No duplicate content**: No two pages should have the same or near-identical content\n3. **No cannibalization**: No two pages should target the same keyword or intent\n4. **Metadata uniqueness**: Every page has unique title and description\n5. **Fail loudly**: Quality issues should block deployment, not slip through silently\n\n## Quality Checks\n\n### 1. Thin Content Detection\n\nA page is thin if it:\n- Has fewer than 300 words of unique text content (excluding navigation, footer, boilerplate)\n- Is essentially a template with only 1-2 variable substitutions\n- Contains no meaningful content beyond its metadata\n- Has the same paragraph structure as other pages with only proper nouns changed\n\n**How to check:**\n- Extract text content from each rendered page (strip HTML tags, nav, footer)\n- Count unique words per page\n- Compare content across pages β€” compute similarity ratios\n- Flag pages with \u003c 300 unique words or \u003e 80% similarity to another page\n\n### 2. Duplicate Content Detection\n\nCheck for:\n- **Exact duplicates**: Two pages with identical body content\n- **Near duplicates**: Pages with \u003e 80% text similarity (use Jaccard similarity on n-grams or cosine similarity)\n- **Title duplicates**: Two pages with the same `\u003ctitle\u003e` tag\n- **Description duplicates**: Two pages with the same meta description\n- **URL-based duplicates**: Different URLs serving the same content (www vs non-www, trailing slash variants)\n\n**How to detect:**\n\nAt small scale (\u003c 200 pages), pairwise comparison is feasible:\n```\nFor each pair of pages:\n similarity = intersection(ngrams(page_a), ngrams(page_b)) / union(ngrams(page_a), ngrams(page_b))\n if similarity \u003e 0.8: FLAG as near-duplicate\n```\n\nAt scale (200+ pages), pairwise is O(nΒ²) and impractical. Use one of:\n- **MinHash / LSH**: Hash n-gram sets into fixed-size signatures, use locality-sensitive hashing to find candidate pairs. Reduces comparisons from O(nΒ²) to near-linear.\n- **SimHash**: Compute a fingerprint per page, compare fingerprints (Hamming distance). Pages with similar fingerprints are candidates.\n- **Sampling**: Compare each page against a random sample of 50 others + all pages in the same category. Not exhaustive but catches the common cases.\n- **Template fingerprinting**: Hash the non-variable parts of each page. If two pages share the same template fingerprint, flag them β€” they differ only in variable slots.\n\n### 3. Keyword Cannibalization Detection\n\nCannibalization occurs when multiple pages target the same search query.\n\n**Detection method:**\n- Extract the primary keyword/intent from each page (from title, H1, and first paragraph)\n- Group pages that share the same primary keyword\n- Flag groups with 2+ pages targeting the same keyword\n\n**Resolution strategies:**\n- Merge thin pages targeting the same keyword into one comprehensive page\n- Differentiate intent (informational vs. transactional vs. navigational)\n- Use canonical tags to point duplicates to the primary page\n- Adjust titles and H1s to target distinct long-tail variations\n\n### 4. Metadata Quality Validation\n\nCheck every page's metadata for:\n\n| Field | Validation Rule |\n|-------|----------------|\n| Title | Present, 30-70 chars, unique across all pages |\n| Description | Present, 100-170 chars, unique across all pages |\n| H1 | Present, exactly one per page, unique across all pages |\n| Canonical | Present, absolute URL, self-referencing |\n| OG:title | Present |\n| OG:description | Present |\n| OG:url | Present, matches canonical |\n\n### 5. Schema Markup Validation\n\n- Every page has at least BreadcrumbList schema\n- Content pages have Article or appropriate type schema\n- FAQ pages have FAQPage schema with valid Q\u0026A pairs\n- No schema has empty or placeholder values\n- All URLs in schema are absolute\n\n### 6. Internal Link Health\n\n- No orphan pages (pages with zero inbound internal links)\n- No broken internal links (href targets that return 404)\n- Every page links back to its category hub\n- Breadcrumbs are present and correct\n\n### 7. Scaled Content Abuse Detection (Google 2025)\n\nGoogle's 2025 updates (March, June, August, December) increasingly target programmatic pages that exist primarily to manipulate rankings. The method (AI, templates, human) is irrelevant β€” only intent and value matter.\n\n**Check for these specific patterns that trigger Google's SpamBrain system:**\n\n- **Template repetitiveness ratio**: Extract the boilerplate (shared HTML structure and text) from all pages of a type. If boilerplate is 60-80%, flag as warning; if \u003e 80%, flag as critical risk for scaled content abuse.\n- **Variable-swap-only differentiation**: If the only differences between pages are proper nouns (city names, product names, keywords), flag as extremely high risk. Google specifically called out \"location pages that use the same template in dozens of cities.\"\n- **Filler content patterns**: Detect generic introductory paragraphs (\"In today's world...\", \"When it comes to...\", \"If you're looking for...\") that add no information. These patterns are specifically targeted by the December 2025 \"Needs Met\" enforcement.\n- **Value-first test**: Check if the primary content/answer appears within the first 200 words. Pages that bury value below filler are devalued.\n- **E-E-A-T signal presence**: Check for author attribution, data sources, last-updated dates. Absence of all trust signals on pSEO pages is a risk factor.\n- **Publication velocity**: If 500+ pages were published within a single day or week, flag for review. Gradual rollout is safer.\n\n**Severity:**\n- Template repetitiveness \u003e 80%: **Critical** β€” will likely trigger scaled content abuse penalty\n- Template repetitiveness 60-80%: **Warning** β€” at risk, needs content enrichment\n- No E-E-A-T signals on any page: **Warning**\n- All pages published same day: **Warning**\n\n### 8. Heading Hierarchy Validation\n\nCheck every page for correct heading structure:\n- Exactly one `\u003ch1\u003e` per page\n- No heading level skips (h1 β†’ h3 without h2 is invalid)\n- Headings follow a logical document outline (h1 \u003e h2 \u003e h3)\n- No empty heading tags\n- Heading content is meaningful (not generic like \"Section 1\")\n\n### 9. Robots and Indexation\n\n- Pages intended for indexing have `index, follow` (or no robots tag)\n- Thin or utility pages have `noindex`\n- No important pages accidentally blocked by robots.txt\n- Sitemap includes all indexable pages and excludes noindexed ones\n\n## Output Format\n\n```\n## pSEO Quality Report\n\n### Summary\n- Total pages checked: X\n- Issues found: X (Y critical, Z warnings)\n\n### Thin Content\n- [list of pages with word counts below threshold]\n\n### Duplicate Content\n- [list of duplicate pairs with similarity scores]\n\n### Keyword Cannibalization\n- [list of keyword groups with competing pages]\n\n### Metadata Issues\n- [list of pages with metadata problems]\n\n### Schema Issues\n- [list of pages with schema problems]\n\n### Linking Issues\n- [list of orphan pages and broken links]\n\n### Scaled Content Abuse Risk\n- Template boilerplate ratio: X%\n- Variable-swap-only pages: X\n- Pages missing E-E-A-T signals: X\n- Filler intro patterns detected: X pages\n- Risk level: [Low | Medium | High | Critical]\n\n### Pruning Recommendations\n- Pages to remove: X\n- Pages to merge: X\n- Pages to noindex: X\n- Pages to enrich: X\n- [list of specific pages and recommended action]\n\n### Action Required\n1. [prioritized list of fixes]\n```\n\n## Memory Considerations\n\nQuality checks load and compare page content across the full site. At scale this is the most memory-intensive operation in the pSEO pipeline.\n\n**Do NOT load all full page content into memory at once.** Instead:\n\n- **Stream-compare**: Load pages one at a time, compute a fingerprint (hash or MinHash signature), store only the fingerprint (~100 bytes per page). Compare fingerprints after all pages are processed.\n- **Batch by category**: Run similarity checks within each category first (most duplicates are same-category). Only run cross-category checks on a sample.\n- **Write intermediate results to disk**: For large sites, write per-page metrics (word count, fingerprint, title hash) to a JSON file, then process the file.\n\nMemory budget estimate:\n| Pages | Fingerprints only | Full content in memory |\n|-------|-------------------|----------------------|\n| 1,000 | ~100KB | ~100-500MB |\n| 10,000 | ~1MB | ~1-5GB (will OOM) |\n| 50,000 | ~5MB | ~5-25GB (impossible) |\n\nAlways use the fingerprint approach at 500+ pages.\n\n## Content Pruning Recommendations\n\nWhen quality checks find issues, don't just flag β€” recommend action. Google's own guidance: \"If you're considering deleting entire sections of your site, that's likely a sign those sections were created for search engines first, and not people.\"\n\nSee `references/thresholds.md` β†’ \"Content Pruning Decision Thresholds\" for the exact decision table (conditions and actions).\n\n200 genuinely valuable pages outperform 5,000 thin pages. Pruning is not failure β€” it's quality control.\n\n**After pruning:**\n- Add 301 redirects from removed URLs to the best related page\n- Update the sitemap to exclude removed pages\n- Update internal links that pointed to removed pages\n- Re-run quality guard to verify improved metrics\n\n## Integration as Build Check\n\nThis skill can be turned into a build-time validation script:\n\n```typescript\n// scripts/validate-pseo.ts\n// Run: npx tsx scripts/validate-pseo.ts\n// CI/CD: exits with code 1 if critical issues found\n\nimport { getAllSlugs, getPageData } from \"../lib/data\";\n\nasync function validate() {\n const slugs = await getAllSlugs();\n const issues: { slug: string; level: \"critical\" | \"warning\"; message: string }[] = [];\n\n for (const { slug } of slugs) {\n const page = await getPageData(slug);\n if (!page) {\n issues.push({ slug, level: \"critical\", message: \"Page data missing\" });\n continue;\n }\n if (!page.title || !page.metaDescription || !page.h1) {\n issues.push({ slug, level: \"critical\", message: \"Missing required metadata\" });\n }\n if (page.title.length \u003e 70) {\n issues.push({ slug, level: \"warning\", message: `Title too long: ${page.title.length} chars` });\n }\n // Add more checks: word count, duplicate titles, schema presence, etc.\n }\n\n const critical = issues.filter((i) =\u003e i.level === \"critical\");\n console.log(`Checked ${slugs.length} pages. ${issues.length} issues (${critical.length} critical).`);\n issues.forEach((i) =\u003e console.log(`[${i.level}] ${i.slug}: ${i.message}`));\n process.exit(critical.length \u003e 0 ? 1 : 0);\n}\n\nvalidate();\n```\n\n## Scope Parameter\n\nIf `$ARGUMENTS` specifies a check:\n- `all` (default): Run all checks\n- `thin`: Thin content detection only\n- `duplicates`: Duplicate content detection only\n- `cannibalization`: Keyword cannibalization only\n- `metadata`: Metadata validation only\n- `abuse`: Scaled content abuse pattern detection only\n- `prune`: Run all checks and output pruning recommendations\n- `delta`: Run all checks on pages modified since last validation only (requires content hashing β€” see pseo-scale section 4)\n\n## Relationship to Other Skills\n\n- **Validates output of**: pseo-templates, pseo-metadata, pseo-schema, pseo-linking\n- **Depends on**: pseo-data (needs access to all page data for cross-page comparisons)\n- **Run after**: Any other pseo-* skill to verify quality\n- **Extended by**: pseo-scale (incremental/delta validation, parallel category-partitioned checks, content hash storage)\n"])</script><script>self.__next_f.push([1,"1a:[\"$\",\"div\",null,{\"className\":\"mt-8\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"mb-4 text-lg font-semibold text-zinc-900 dark:text-white\",\"children\":\"Skill Details\"}],[\"$\",\"$L1d\",null,{\"content\":\"$1e\"}]]}]\n"])</script><script>self.__next_f.push([1,"1b:[\"$\",\"div\",null,{\"className\":\"mt-12 border-t border-zinc-200 pt-8 dark:border-zinc-800\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"mb-4 flex items-center gap-2 text-lg font-semibold text-zinc-900 dark:text-white\",\"children\":[[\"$\",\"span\",null,{\"children\":\"More from this repository\"}],[\"$\",\"span\",null,{\"className\":\"rounded-full bg-violet-100 px-2 py-0.5 text-sm font-medium text-violet-700 dark:bg-violet-900/50 dark:text-violet-300\",\"children\":10}]]}],[\"$\",\"div\",null,{\"className\":\"grid gap-3 sm:grid-cols-2\",\"children\":[[\"$\",\"$L7\",\"48a5d8e0-6b91-4b34-8993-a6f7b6d5e343\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-llm-visibility\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-llm-visibility\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Optimizes programmatic SEO pages for AI search visibility by structuring content for LLM extraction and citation across multiple generative engines.\"}]]}]]}],[\"$\",\"$L7\",\"3c5dce93-8170-408b-a65e-60f3f246e016\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-performance\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-performance\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Optimizes programmatic SEO applications for fast builds, excellent Core Web Vitals, and scalable performance across 1000+ pages.\"}]]}]]}],[\"$\",\"$L7\",\"8d9d3d97-cc49-457b-a2d1-318e5251a25d\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-schema\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-schema\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Generates context-specific JSON-LD structured data schemas for programmatic SEO pages to enhance search engine understanding and rich result potential.\"}]]}]]}],\"$L1f\",\"$L20\",\"$L21\",\"$L22\",\"$L23\",\"$L24\",\"$L25\"]}]]}]\n"])</script><script>self.__next_f.push([1,"1f:[\"$\",\"$L7\",\"e2e6d0e6-be2a-46c3-a0e1-f52f57d3bd51\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-orchestrate\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-orchestrate\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Orchestrates the complete programmatic SEO workflow by sequentially executing specialized skills to discover, audit, implement, and validate pSEO pages across multiple phases.\"}]]}]]}]\n20:[\"$\",\"$L7\",\"6b6f50ab-4ed5-4189-bf1c-70e53baabd3a\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-discovery\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-discovery\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Discovers programmatic SEO opportunities by analyzing codebase, business context, and data assets to identify scalable page types matching search intent.\"}]]}]]}]\n21:[\"$\",\"$L7\",\"831d2a9c-6497-4f0e-9956-986b3c24ef07\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-linking\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-linking\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Links and maps potential career pathways by analyzing professional skills, educational backgrounds, and industry connections.\"}]]}]]}]\n22:[\"$\",\"$L7\",\"d4e001e9-1491-4e57-9953-8cf8c334fedb\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-scale\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"f"])</script><script>self.__next_f.push([1,"lex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-scale\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Scales programmatic SEO systems to 10K-100K+ pages with database-backed architectures, incremental validation, and optimized content delivery.\"}]]}]]}]\n23:[\"$\",\"$L7\",\"474a6294-ba9d-41ea-8818-cb3adcbf5073\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-audit\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-audit\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Audits a codebase for programmatic SEO readiness, identifying scalability gaps and providing actionable insights for 1000+ page websites.\"}]]}]]}]\n24:[\"$\",\"$L7\",\"c311eb48-f7c0-46e5-a4b1-1fb0eef87c02\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-templates\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-templates\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Generates programmatic SEO page templates with dynamic routing, creating unique, intent-matched content for each page automatically.\"}]]}]]}]\n25:[\"$\",\"$L7\",\"c78562e0-f403-4636-8c60-f59bf70486f6\",{\"href\":\"/skills/lisbeth718/pseo-skills/pseo-data\",\"className\":\"flex items-center gap-3 rounded-lg border border-zinc-200 bg-white p-4 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:bg-zinc-900 dark:hover:border-zinc-700 dark:hover:bg-zinc-800/50\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xl\",\"children\":\"🎯\"}],[\"$\",\"div\",null,{\"className\":\"min-w-0 flex-1\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"span\",null,{\"className\":\"truncate font-medium text-zinc-900 dark:text-white\",\"children\":\"pseo-data\"}],[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-1 whitespace-nowrap font-medium rounded-full bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 px-2 py-0.5 text-xs \",\"children\":[[\"$\",\"span\",null,{\"children\":\"🎯\"}],[\"$\",\"span\",null,{\"children\":\"Skill\"}]]}]]}],[\"$\",\"p\",null,{\"className\":\"truncate text-sm text-zinc-500 dark:text-zinc-400\",\"children\":\"Designs and generates struct"])</script><script>self.__next_f.push([1,"ured data architecture for programmatic SEO pages, ensuring type-safe, SEO-optimized content models and data pipelines.\"}]]}]]}]\n"])</script></body></html>