🎯

pseo-schema

🎯Skill

from lisbeth718/pseo-skills

VibeIndex|
What it does

Generates context-specific JSON-LD structured data schemas for programmatic SEO pages to enhance search engine understanding and rich result potential.

πŸ“¦

Part of

lisbeth718/pseo-skills(12 items)

pseo-schema

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-schema
1Installs
-
AddedFeb 4, 2026

Skill Details

SKILL.md

Implement JSON-LD structured data and schema markup for programmatic SEO pages, including Article, FAQ, Breadcrumb, Product, and other context-specific schema types. Use when adding or fixing schema markup, implementing structured data, or when Google Search Console reports schema errors.

Overview

# pSEO Schema Markup

Implement JSON-LD structured data that gives search engines explicit semantic understanding of every programmatic page.

Core Principles

  1. JSON-LD format: Always use JSON-LD, not Microdata or RDFa
  2. Context-appropriate types: Match schema type to the page's actual content
  3. Data-driven generation: Schema is built from the same data that drives the page
  4. Valid and complete: Every schema block must pass Google's Rich Results Test
  5. No fabrication: Only include fields backed by real data

Baseline Schema (Every Page)

Every pSEO page should include these foundational types:

  • WebSite β€” once per site (on the homepage or via a shared layout), declares site-level search and name
  • WebPage β€” on every page, declares the page URL, name, description, and dateModified
  • BreadcrumbList β€” on every page with navigation hierarchy

These are in addition to the content-specific types below.

Schema Types by Page Context

| Page Type | Primary Schema | Supporting Schema |

|-----------|---------------|-------------------|

| Content/article page | Article | BreadcrumbList, FAQPage, WebPage |

| Product page | Product | BreadcrumbList, AggregateRating, WebPage |

| FAQ/Q&A page | FAQPage | BreadcrumbList, WebPage |

| How-to/tutorial page | HowTo | BreadcrumbList, FAQPage, WebPage |

| Category/hub page | CollectionPage | BreadcrumbList, ItemList, WebPage |

| Local/location page | LocalBusiness | BreadcrumbList, FAQPage, WebPage |

Implementation Steps

1. Create Schema Generator Functions

Build a module of pure functions that produce schema objects from page data:

```typescript

// lib/schema.ts

export function generateArticleSchema(data: PageData, url: string) {

return {

"@context": "https://schema.org",

"@type": "Article",

headline: data.h1,

description: data.metaDescription,

url,

datePublished: data.publishedDate,

dateModified: data.lastModified,

author: { "@type": "Organization", name: "..." },

publisher: { "@type": "Organization", name: "..." },

};

}

// IMPORTANT: FAQPage schema is ONLY valid when the FAQ content is

// visible on the page itself. Google requires the questions and answers

// to be present in the rendered HTML, not just in the JSON-LD.

// Never add FAQPage schema to a page that does not render the FAQs.

export function generateFAQSchema(faqs: FAQ[]) {

if (!faqs?.length) return null;

return {

"@context": "https://schema.org",

"@type": "FAQPage",

mainEntity: faqs.map((faq) => ({

"@type": "Question",

name: faq.question,

acceptedAnswer: {

"@type": "Answer",

text: faq.answer,

},

})),

};

}

export function generateWebPageSchema(data: PageData, url: string) {

return {

"@context": "https://schema.org",

"@type": "WebPage",

name: data.title,

description: data.metaDescription,

url,

dateModified: data.lastModified,

};

}

export function generateBreadcrumbSchema(

items: { name: string; url: string }[]

) {

return {

"@context": "https://schema.org",

"@type": "BreadcrumbList",

itemListElement: items.map((item, i) => ({

"@type": "ListItem",

position: i + 1,

name: item.name,

item: item.url,

})),

};

}

```

2. Create the Schema Renderer Component

Build a reusable component that injects JSON-LD into the page head:

```typescript

export function JsonLd({ data }: { data: Record | null }) {

if (!data) return null;

return (

type="application/ld+json"

dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}

/>

);

}

```

3. Compose Schema per Page

Each page template composes its schema from multiple generators:

```typescript

// In the page component

const schemas = [

generateArticleSchema(data, canonicalUrl),

generateBreadcrumbSchema(breadcrumbItems),

data.faqs?.length ? generateFAQSchema(data.faqs) : null,

].filter(Boolean);

// Render each as a separate script tag

{schemas.map((schema, i) => )}

```

4. Schema Field Rules

Required fields per type:

  • Article: headline, url, datePublished, dateModified, author, publisher
  • FAQPage: mainEntity with at least 1 Question/Answer pair
  • BreadcrumbList: itemListElement with position, name, item
  • Product: name, description; offers or review if available
  • HowTo: name, step (with text for each step)

Field integrity rules:

  • headline must match the page's H1 or title
  • url must match the canonical URL
  • dateModified must be a valid ISO 8601 date
  • Never include empty strings or placeholder values
  • Never include fields with fabricated data (e.g., fake reviews)

5. Handle Multiple Schema Types

A single page can have multiple schema blocks. Render them as separate