Skip to content
cccskills
FreePublished on GitHub

blog-schema

Generate complete JSON-LD schema markup for blog posts with Article/BlogPosting, Person, Organization, BreadcrumbList, ImageObject, and optional FAQPage. Validates against Google requirements and warns about deprecated types. Use when user says "schema", "blog schema", "json-ld", "structured data", "schema markup", "generate schema".

The English summary is being prepared. Showing the original description.

Run score Not tested

See how to install

Files included (1)

  • SKILL.md9.1 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

Blog Schema: JSON-LD Structured Data Generation

Generates complete, validated JSON-LD schema markup for blog posts using the @graph pattern. Combines multiple schema types into a single script tag with stable @id references for entity linking.

Workflow

Step 1: Read Content

Read the blog post and extract all schema-relevant data:

  • Title (headline)
  • Author (name, job title, social links, credentials)
  • Dates (datePublished, dateModified / lastUpdated)
  • Description (meta description)
  • FAQ section (question and answer pairs)
  • Images (cover image URL, dimensions, alt text; inline images)
  • Organization info (site name, URL, logo)
  • Word count (approximate from content length)
  • Tags/categories (for BreadcrumbList category)
  • Slug (from filename or frontmatter)

Step 2: Generate BlogPosting Schema

Complete BlogPosting with recommended properties when applicable:

{
  "@type": "BlogPosting",
  "@id": "{siteUrl}/blog/{slug}#article",
  "headline": "Concise post title",
  "description": "Concise page-specific meta description",
  "datePublished": "YYYY-MM-DD",
  "dateModified": "YYYY-MM-DD",
  "author": { "@id": "{siteUrl}/author/{author-slug}#person" },
  "publisher": { "@id": "{siteUrl}#organization" },
  "image": { "@id": "{siteUrl}/blog/{slug}#primaryimage" },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "{siteUrl}/blog/{slug}"
  },
  "wordCount": 2400,
  "articleBody": "First 200 characters of content as excerpt..."
}

Google's Article structured data docs do not define required Article properties. Include headline, datePublished, author, publisher, and image when applicable, validate with the Rich Results Test, and treat missing fields as warnings unless the target surface requires them. Recommended properties: description, dateModified, mainEntityOfPage, wordCount, articleBody (excerpt).

Step 3: Generate Person Schema

Author schema with stable @id for cross-referencing:

{
  "@type": "Person",
  "@id": "{siteUrl}/author/{author-slug}#person",
  "name": "Author Name",
  "jobTitle": "Role or Title",
  "url": "{siteUrl}/author/{author-slug}",
  "sameAs": [
    "https://twitter.com/handle",
    "https://linkedin.com/in/handle",
    "https://github.com/handle"
  ]
}

Optional properties (include when available):

  • alumniOf - Educational institution (Organization type)
  • worksFor - Employer (reference to Organization @id if same entity)

Step 4: Generate Organization Schema

Blog's parent organization entity:

{
  "@type": "Organization",
  "@id": "{siteUrl}#organization",
  "name": "Organization Name",
  "url": "{siteUrl}",
  "logo": {
    "@type": "ImageObject",
    "url": "{siteUrl}/logo.png",
    "width": 600,
    "height": 60
  },
  "sameAs": [
    "https://twitter.com/org",
    "https://linkedin.com/company/org",
    "https://github.com/org"
  ]
}

Logo requirements: use a valid crawlable image URL and follow the active Organization and Article documentation for the target surface. Do not invent hard logo dimensions unless the project or current docs require them.

Step 5: Generate BreadcrumbList

Navigation breadcrumb schema showing content hierarchy:

{
  "@type": "BreadcrumbList",
  "@id": "{siteUrl}/blog/{slug}#breadcrumb",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "{siteUrl}"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Category Name",
      "item": "{siteUrl}/blog/category/{category-slug}"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Post Title",
      "item": "{siteUrl}/blog/{slug}"
    }
  ]
}

If no category is available, use "Blog" as the second breadcrumb item with {siteUrl}/blog as the URL.

Step 6: Generate FAQPage Entity Schema

Extract Q&A pairs from the blog post's FAQ section:

{
  "@type": "FAQPage",
  "@id": "{siteUrl}/blog/{slug}#faq",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the question?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The complete answer text (40-60 words with statistic)."
      }
    }
  ]
}

Important note: Google retired FAQ rich results for all sites on 2026-05-07. FAQPage is not a Google rich result path. Only emit FAQPage when visible FAQ content exists, with at least one valid Question and matching visible answer. Treat it as entity clarity markup, not a Google rich-result promise. The Article/BlogPosting schema remains the priority for blog search eligibility.

Step 7: Generate VideoObject (if videos present)

For each YouTube video embedded in the post, generate a VideoObject schema:

{
  "@type": "VideoObject",
  "@id": "{siteUrl}/blog/{slug}#video-{index}",
  "name": "Video title",
  "description": "Video description excerpt (first 200 chars)",
  "thumbnailUrl": "https://img.youtube.com/vi/{videoId}/hqdefault.jpg",
  "uploadDate": "{ISO 8601 date}",
  "contentUrl": "https://www.youtube.com/watch?v={videoId}",
  "embedUrl": "https://www.youtube.com/embed/{videoId}",
  "duration": "PT{M}M{S}S",
  "interactionStatistic": {
    "@type": "InteractionCounter",
    "interactionType": { "@type": "WatchAction" },
    "userInteractionCount": {viewCount}
  }
}

Add each VideoObject to the @graph array. Use #video-1, #video-2 etc. for the @id fragment. Extract video metadata from the embed's noscript fallback or from YouTube Data API if available via blog-google.

Step 7.5: Generate ImageObject

Cover image schema for the post's primary image:

{
  "@type": "ImageObject",
  "@id": "{siteUrl}/blog/{slug}#primaryimage",
  "url": "https://cdn.pixabay.com/photo/.../image.jpg",
  "width": 1200,
  "height": 630,
  "caption": "Descriptive caption matching alt text"
}

Image requirements:

  • URL must be crawlable and publicly accessible
  • Width and height should reflect actual image dimensions
  • Caption should match or closely align with the image alt text
  • Preferred dimensions: 1200x630 (OG-compatible) or 1920x1080

Step 8: Validate & Warn

Check per-surface support before recommending schema types:

TypeGoogle rich-result statusValid entity/context use
HowToNot a current Google rich-result tacticValid schema.org type when the page genuinely contains how-to content
DatasetNot for generic blog rich resultsValid for dataset pages and Dataset Search eligibility
QAPageNot the same as FAQPageValid when the page contains one question with user-submitted answers
SpecialAnnouncement, PracticeProblem, Sitelinks Search BoxDo not recommend for general blog postsUse only when current official docs and page content match

Validation checks:

  1. All @id references resolve to entities within the @graph
  2. dateModified is equal to or after datePublished
  3. headline is concise. Warn when it may truncate or becomes unclear
  4. description is concise, page-specific, and not duplicated across posts
  5. All URLs are absolute (not relative)
  6. Image dimensions are positive integers
  7. BreadcrumbList positions are sequential starting from 1
  8. If FAQPage is emitted, visible Q&A content exists and includes at least 1 valid Question

AI citation optimization note: Relevant schema helps entity clarity and rich-result eligibility where supported, but structured data is not required for Google generative AI search visibility. Prioritize Article/BlogPosting, Person, Organization, and BreadcrumbList. Add ImageObject or VideoObject when assets exist, and add FAQPage only when visible FAQ content exists.

Step 9: Output

Combine all schemas into a single <script> tag using the @graph pattern:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    { "@type": "BlogPosting", ... },
    { "@type": "Person", ... },
    { "@type": "Organization", ... },
    { "@type": "BreadcrumbList", ... },
    { "@type": "FAQPage", ... },
    { "@type": "VideoObject", ... },
    { "@type": "ImageObject", ... }
  ]
}
</script>

@graph pattern benefits:

  • Single script tag instead of multiple - cleaner HTML
  • Entity linking via stable @id references (e.g., author references Person by @id)
  • Google and AI systems parse @graph arrays correctly
  • Easier to maintain and update as a single block

Output options:

  • Embedded HTML - Ready to paste into <head> or before </body>
  • Standalone JSON - For CMS schema fields or API injection
  • MDX component - If the project uses MDX, wrap in a component

Save the generated schema to the blog post file or to a separate schema file as the user prefers.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

blog

Free

Full-lifecycle blog engine with 31 sub-skills, 12 templates, 100-point scoring, and 5 agents. Routes requests to the right sub-skill: writing, rewriting, analysis, outlines, audits, schema, charts, images, repurposing, AI citation SEO, FLOW prompts, topic clusters, and multilingual publishing. Optimized for Google rankings, E-E-A-T, and AI citations. Supports any platform. Use when the user asks to create, revise, analyze, plan, translate, localize, audit, or repurpose blog content, or invokes a /blog subcommand. Do not activate merely because the word "blog" appears in an unrelated coding, theme-debugging, database, log-analysis, or definition request.

The English summary is being prepared. Showing the original description.

AgriciDaniel/claude-blog2.5KUpdated Oct 14, 2026

blog

Free

Full-lifecycle blog engine with 31 sub-skills, 12 content templates, 5-category 100-point scoring, and 5 specialized agents. Routes user requests to the right sub-skill: writing, rewriting, analysis, outlines, audits, schema, charts, images, repurposing, AI citation SEO, FLOW framework prompts, topic-cluster execution, and multilingual publishing. Optimized for Google rankings around the May 2026 Core Update, E-E-A-T, and AI citations as one SEO discipline. Supports any platform (WordPress, Next.js MDX, Hugo, Ghost, Astro, Jekyll, 11ty, Gatsby, HTML). Use when user says "blog", "write a blog", "blog post", "blog strategy", "content brief", "editorial calendar", "blog audit", "blog optimization", "topic cluster", "multilingual blog", "FLOW framework", or any /blog subcommand. Sub-skill descriptions cover narrower triggers.

The English summary is being prepared. Showing the original description.

AgriciDaniel/claude-blog2.5KUpdated Oct 14, 2026

Audit and score blog posts on a 5-category 100-point scoring system covering content quality, SEO optimization, E-E-A-T signals, technical elements, and AI citation readiness. Includes AI content detection (burstiness, phrase flagging, vocabulary diversity). Supports export formats (markdown, JSON, table) and batch analysis with sorting. Generates prioritized recommendations (Critical/High/Medium/Low) with specific fixes. Works with any format (MDX, markdown, HTML, URL). Use when user says "analyze blog", "audit blog", "blog score", "check blog quality", "blog review", "rate this blog", "blog health check".

The English summary is being prepared. Showing the original description.

AgriciDaniel/claude-blog2.5KUpdated Oct 14, 2026

Score one blog post (or a folder of posts) on a 5-category 100-point scale covering content quality, SEO, E-E-A-T, technical elements, and AI citation readiness. Runs the deterministic analyzer first, then adds judgment and prioritized Critical/High/Medium/Low fixes. Advisory style diagnostics never infer authorship or affect the score. Exports markdown, JSON or table; works with MDX, markdown, HTML or a URL. Use when the user asks to analyze, score, rate or check the quality of specific posts ("analyze blog", "blog score", "check blog quality", "rate this post"). For a site-wide health check (orphan pages, cannibalization, stale content, schema across all posts) use blog-audit instead.

The English summary is being prepared. Showing the original description.

AgriciDaniel/claude-blog2.5KUpdated Oct 14, 2026

Paid Gemini TTS audio for a finished blog post: summary, full read-aloud, or two-speaker dialogue, with an MP3 and an HTML5 embed. Asks for explicit consent before the first paid call. Runs only on an explicit request: /blog audio, "generate audio for this blog post", "narrate this blog post", "audio version of this post", or "podcast version of this post". Not for general speech or dictation questions.

The English summary is being prepared. Showing the original description.

AgriciDaniel/claude-blog2.5KUpdated Oct 14, 2026

Generate audio narration of blog posts using Google Gemini TTS. Supports summary narration, full article read-aloud, and two-speaker podcast/dialogue mode with 30 voice options. Outputs MP3 with HTML5 audio embed code. Works standalone via /blog audio or internally from blog-write. Falls back gracefully when API key is not configured. Use when user says "blog audio", "narrate blog", "audio version", "text to speech", "tts", "podcast mode", "read aloud", "audio narration", "voice", "narration", "generate audio".

The English summary is being prepared. Showing the original description.

AgriciDaniel/claude-blog2.5KUpdated Oct 14, 2026

See all skills by AgriciDaniel

Report a problem with this skill