{"id":"2df7bbba-d4bf-45d7-8603-83a10c6310c0","shortId":"5CeD6X","kind":"skill","title":"blog-schema","tagline":"Generate complete JSON-LD schema markup for blog posts including BlogPosting, Person, Organization, BreadcrumbList, FAQPage, and ImageObject. Validates against Google requirements and warns about deprecated types. Use when user says \"schema\", \"blog schema\", \"json-ld\", \"structured","description":"# Blog Schema -- JSON-LD Structured Data Generation\n\nGenerates complete, validated JSON-LD schema markup for blog posts using the\n@graph pattern. Combines multiple schema types into a single script tag with\nstable @id references for entity linking.\n\n## Workflow\n\n### Step 1: Read Content\n\nRead the blog post and extract all schema-relevant data:\n- **Title** (headline)\n- **Author** (name, job title, social links, credentials)\n- **Dates** (datePublished, dateModified / lastUpdated)\n- **Description** (meta description)\n- **FAQ section** (question and answer pairs)\n- **Images** (cover image URL, dimensions, alt text; inline images)\n- **Organization info** (site name, URL, logo)\n- **Word count** (approximate from content length)\n- **Tags/categories** (for BreadcrumbList category)\n- **Slug** (from filename or frontmatter)\n\n### Step 2: Generate BlogPosting Schema\n\nComplete BlogPosting with all required and recommended properties:\n\n```json\n{\n  \"@type\": \"BlogPosting\",\n  \"@id\": \"{siteUrl}/blog/{slug}#article\",\n  \"headline\": \"Post title (max 110 chars)\",\n  \"description\": \"Meta description (150-160 chars)\",\n  \"datePublished\": \"YYYY-MM-DD\",\n  \"dateModified\": \"YYYY-MM-DD\",\n  \"author\": { \"@id\": \"{siteUrl}/author/{author-slug}#person\" },\n  \"publisher\": { \"@id\": \"{siteUrl}#organization\" },\n  \"image\": { \"@id\": \"{siteUrl}/blog/{slug}#primaryimage\" },\n  \"mainEntityOfPage\": {\n    \"@type\": \"WebPage\",\n    \"@id\": \"{siteUrl}/blog/{slug}\"\n  },\n  \"wordCount\": 2400,\n  \"articleBody\": \"First 200 characters of content as excerpt...\"\n}\n```\n\nRequired properties: @type, headline, datePublished, author, publisher, image.\nRecommended properties: description, dateModified, mainEntityOfPage, wordCount,\narticleBody (excerpt).\n\n### Step 3: Generate Person Schema\n\nAuthor schema with stable @id for cross-referencing:\n\n```json\n{\n  \"@type\": \"Person\",\n  \"@id\": \"{siteUrl}/author/{author-slug}#person\",\n  \"name\": \"Author Name\",\n  \"jobTitle\": \"Role or Title\",\n  \"url\": \"{siteUrl}/author/{author-slug}\",\n  \"sameAs\": [\n    \"https://twitter.com/handle\",\n    \"https://linkedin.com/in/handle\",\n    \"https://github.com/handle\"\n  ]\n}\n```\n\nOptional properties (include when available):\n- `alumniOf` - Educational institution (Organization type)\n- `worksFor` - Employer (reference to Organization @id if same entity)\n\n### Step 4: Generate Organization Schema\n\nBlog's parent organization entity:\n\n```json\n{\n  \"@type\": \"Organization\",\n  \"@id\": \"{siteUrl}#organization\",\n  \"name\": \"Organization Name\",\n  \"url\": \"{siteUrl}\",\n  \"logo\": {\n    \"@type\": \"ImageObject\",\n    \"url\": \"{siteUrl}/logo.png\",\n    \"width\": 600,\n    \"height\": 60\n  },\n  \"sameAs\": [\n    \"https://twitter.com/org\",\n    \"https://linkedin.com/company/org\",\n    \"https://github.com/org\"\n  ]\n}\n```\n\nLogo requirements: must be a valid image URL. Google recommends logos be\n112x112px minimum, 600px wide maximum. Rectangular logos preferred for\nBlogPosting publishers.\n\n### Step 5: Generate BreadcrumbList\n\nNavigation breadcrumb schema showing content hierarchy:\n\n```json\n{\n  \"@type\": \"BreadcrumbList\",\n  \"@id\": \"{siteUrl}/blog/{slug}#breadcrumb\",\n  \"itemListElement\": [\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 1,\n      \"name\": \"Home\",\n      \"item\": \"{siteUrl}\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 2,\n      \"name\": \"Category Name\",\n      \"item\": \"{siteUrl}/blog/category/{category-slug}\"\n    },\n    {\n      \"@type\": \"ListItem\",\n      \"position\": 3,\n      \"name\": \"Post Title\",\n      \"item\": \"{siteUrl}/blog/{slug}\"\n    }\n  ]\n}\n```\n\nIf no category is available, use \"Blog\" as the second breadcrumb item with\n`{siteUrl}/blog` as the URL.\n\n### Step 6: Generate FAQPage Schema\n\nExtract Q&A pairs from the blog post's FAQ section:\n\n```json\n{\n  \"@type\": \"FAQPage\",\n  \"@id\": \"{siteUrl}/blog/{slug}#faq\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the question?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The complete answer text (40-60 words with statistic).\"\n      }\n    }\n  ]\n}\n```\n\nImportant note: Google restricted FAQ rich results to government and health\nsites since August 2023. However, FAQ schema markup still provides value\nbecause:\n- AI systems (ChatGPT, Perplexity, Gemini) extract FAQ data for citations\n- It structures content for future rich result eligibility changes\n- It improves content organization signals\n\n### Step 7: Generate VideoObject (if videos present)\n\nFor each YouTube video embedded in the post, generate a VideoObject schema:\n\n```json\n{\n  \"@type\": \"VideoObject\",\n  \"@id\": \"{siteUrl}/blog/{slug}#video-{index}\",\n  \"name\": \"Video title\",\n  \"description\": \"Video description excerpt (first 200 chars)\",\n  \"thumbnailUrl\": \"https://img.youtube.com/vi/{videoId}/hqdefault.jpg\",\n  \"uploadDate\": \"{ISO 8601 date}\",\n  \"contentUrl\": \"https://www.youtube.com/watch?v={videoId}\",\n  \"embedUrl\": \"https://www.youtube.com/embed/{videoId}\",\n  \"duration\": \"PT{M}M{S}S\",\n  \"interactionStatistic\": {\n    \"@type\": \"InteractionCounter\",\n    \"interactionType\": { \"@type\": \"WatchAction\" },\n    \"userInteractionCount\": {viewCount}\n  }\n}\n```\n\nAdd each VideoObject to the @graph array. Use `#video-1`, `#video-2` etc. for\nthe @id fragment. Extract video metadata from the embed's noscript fallback or\nfrom YouTube Data API if available via `blog-google`.\n\n### Step 7.5: Generate ImageObject\n\nCover image schema for the post's primary image:\n\n```json\n{\n  \"@type\": \"ImageObject\",\n  \"@id\": \"{siteUrl}/blog/{slug}#primaryimage\",\n  \"url\": \"https://cdn.pixabay.com/photo/.../image.jpg\",\n  \"width\": 1200,\n  \"height\": 630,\n  \"caption\": \"Descriptive caption matching alt text\"\n}\n```\n\nImage requirements:\n- URL must be crawlable and publicly accessible\n- Width and height should reflect actual image dimensions\n- Caption should match or closely align with the image alt text\n- Preferred dimensions: 1200x630 (OG-compatible) or 1920x1080\n\n### Step 8: Validate & Warn\n\nCheck for deprecated schema types and apply validation rules:\n\n**NEVER use these deprecated types:**\n- **HowTo** - Deprecated September 2023 (Google no longer shows rich results)\n- **SpecialAnnouncement** - Deprecated July 2025\n- **Practice Problem** - Deprecated (education markup)\n- **Dataset** - Deprecated for general use\n- **Sitelinks Search Box** - Deprecated\n- **Q&A** - Deprecated January 2026 (distinct from FAQPage)\n\n**Validation checks:**\n1. All @id references resolve to entities within the @graph\n2. dateModified is equal to or after datePublished\n3. headline does not exceed 110 characters\n4. description is between 50-160 characters\n5. All URLs are absolute (not relative)\n6. Image dimensions are positive integers\n7. BreadcrumbList positions are sequential starting from 1\n8. FAQPage has at least 2 questions\n\n**AI citation optimization note:** Pages using 3 or more schema types have\napproximately 13% higher AI citation likelihood. This skill generates up to 7\ntypes (BlogPosting, Person, Organization, BreadcrumbList, FAQPage, ImageObject,\nVideoObject) to maximize both search engine understanding and AI extraction.\n\n### Step 9: Output\n\nCombine all schemas into a single `<script>` tag using the @graph pattern:\n\n```html\n<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@graph\": [\n    { \"@type\": \"BlogPosting\", ... },\n    { \"@type\": \"Person\", ... },\n    { \"@type\": \"Organization\", ... },\n    { \"@type\": \"BreadcrumbList\", ... },\n    { \"@type\": \"FAQPage\", ... },\n    { \"@type\": \"VideoObject\", ... },\n    { \"@type\": \"ImageObject\", ... }\n  ]\n}\n</script>\n```\n\n**@graph pattern benefits:**\n- Single script tag instead of multiple - cleaner HTML\n- Entity linking via stable @id references (e.g., author references Person by @id)\n- Google and AI systems parse @graph arrays correctly\n- Easier to maintain and update as a single block\n\n**Output options:**\n- **Embedded HTML** - Ready to paste into `<head>` or before `</body>`\n- **Standalone JSON** - For CMS schema fields or API injection\n- **MDX component** - If the project uses MDX, wrap in a component\n\nSave the generated schema to the blog post file or to a separate schema file\nas the user prefers.","tags":["blog","schema","claude","agricidaniel","agent-skills","ai-citations","ai-content","ai-marketing","ai-marketing-hub","blog-writing","claude-code","claude-code-skill"],"capabilities":["skill","source-agricidaniel","skill-blog-schema","topic-agent-skills","topic-ai-citations","topic-ai-content","topic-ai-marketing","topic-ai-marketing-hub","topic-blog","topic-blog-writing","topic-claude-code","topic-claude-code-skill","topic-claude-plugin","topic-claude-skill","topic-content-creation"],"categories":["claude-blog"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/AgriciDaniel/claude-blog/blog-schema","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add AgriciDaniel/claude-blog","source_repo":"https://github.com/AgriciDaniel/claude-blog","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 753 github stars · SKILL.md body (8,075 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:31.422Z","embedding":null,"createdAt":"2026-05-18T12:54:54.205Z","updatedAt":"2026-05-18T18:53:31.422Z","lastSeenAt":"2026-05-18T18:53:31.422Z","tsv":"'-1':615 '-160':180,800 '-2':617 '-60':483 '/author':195,262,276 '/blog':167,207,215,388,422,438,463,558,661 '/blog/category':409 '/company/org':346 '/embed/':590 '/handle':283,289 '/hqdefault.jpg':577 '/in/handle':286 '/logo.png':335 '/org':343,349 '/photo/.../image.jpg':667 '/vi/':575 '/watch?v=':585 '1':83,395,770,822 '110':174,793 '112x112px':362 '1200':669 '1200x630':708 '13':843 '150':179 '1920x1080':713 '2':150,403,780,828 '200':221,570 '2023':501,735 '2025':745 '2026':764 '2400':218 '3':244,416,788,836 '4':310,795 '40':482 '5':374,802 '50':799 '6':443,809 '60':339 '600':337 '600px':364 '630':671 '7':535,815,853 '7.5':644 '8':715,823 '8601':580 '9':872 'absolut':806 'acceptedansw':474 'access':686 'actual':692 'add':606 'ai':510,830,845,869,905 'align':700 'alt':124,676,704 'alumniof':295 'answer':117,476,480 'api':636,937 'appli':724 'approxim':136,842 'array':612,909 'articl':169 'articlebodi':219,241 'august':500 'author':99,192,197,232,248,264,268,278,898 'author-slug':196,263,277 'avail':294,428,638 'benefit':882 'block':919 'blog':2,12,36,42,59,88,314,430,453,641,956 'blog-googl':640 'blog-schema':1 'blogpost':15,152,155,164,371,855 'box':758 'breadcrumb':378,390,434 'breadcrumblist':18,142,376,385,816,858 'caption':672,674,695 'categori':143,405,411,426 'category-slug':410 'cdn.pixabay.com':666 'cdn.pixabay.com/photo/.../image.jpg':665 'chang':528 'char':175,181,571 'charact':222,794,801 'chatgpt':512 'check':718,769 'citat':519,831,846 'cleaner':889 'close':699 'cms':933 'combin':65,874 'compat':711 'complet':5,51,154,479 'compon':940,949 'content':85,138,224,381,522,531 'contenturl':582 'correct':910 'count':135 'cover':120,647 'crawlabl':683 'credenti':105 'cross':255 'cross-referenc':254 'data':48,96,517,635 'dataset':751 'date':106,581 'datemodifi':108,187,238,781 'datepublish':107,182,231,787 'dd':186,191 'deprec':29,720,730,733,743,748,752,759,762 'descript':110,112,176,178,237,565,567,673,796 'dimens':123,694,707,811 'distinct':765 'durat':592 'e.g':897 'easier':911 'educ':296,749 'elig':527 'emb':628 'embed':545,922 'embedurl':587 'employ':301 'engin':866 'entiti':79,308,318,776,891 'equal':783 'etc':618 'exceed':792 'excerpt':226,242,568 'extract':91,447,515,623,870 'fallback':631 'faq':113,456,465,491,503,516 'faqpag':19,445,460,767,824,859 'field':935 'file':958,964 'filenam':146 'first':220,569 'fragment':622 'frontmatt':148 'futur':524 'gemini':514 'general':754 'generat':4,49,50,151,245,311,375,444,536,549,645,850,952 'github.com':288,348 'github.com/handle':287 'github.com/org':347 'googl':24,358,489,642,736,903 'govern':495 'graph':63,611,779,880,908 'headlin':98,170,230,789 'health':497 'height':338,670,689 'hierarchi':382 'higher':844 'home':397 'howev':502 'howto':732 'html':890,923 'id':76,165,193,201,205,213,252,260,305,322,386,461,556,621,659,772,895,902 'imag':119,121,127,204,234,356,648,655,678,693,703,810 'imageobject':21,332,646,658,860 'img.youtube.com':574 'img.youtube.com/vi/':573 'import':487 'improv':530 'includ':14,292 'index':561 'info':129 'inject':938 'inlin':126 'instead':886 'institut':297 'integ':814 'interactioncount':600 'interactionstatist':598 'interactiontyp':601 'iso':579 'item':398,407,420,435 'itemlistel':391 'januari':763 'job':101 'jobtitl':270 'json':7,39,45,54,162,257,319,383,458,553,656,931 'json-ld':6,38,44,53 'juli':744 'lastupd':109 'ld':8,40,46,55 'least':827 'length':139 'likelihood':847 'link':80,104,892 'linkedin.com':285,345 'linkedin.com/company/org':344 'linkedin.com/in/handle':284 'listitem':393,401,414 'logo':133,330,350,360,368 'longer':738 'm':594,595 'mainent':466 'mainentityofpag':210,239 'maintain':913 'markup':10,57,505,750 'match':675,697 'max':173 'maxim':863 'maximum':366 'mdx':939,945 'meta':111,177 'metadata':625 'minimum':363 'mm':185,190 'multipl':66,888 'must':352,681 'name':100,131,267,269,325,327,396,404,406,417,469,562 'navig':377 'never':727 'noscript':630 'note':488,833 'og':710 'og-compat':709 'optim':832 'option':290,921 'organ':17,128,203,298,304,312,317,321,324,326,532,857 'output':873,920 'page':834 'pair':118,450 'parent':316 'pars':907 'past':926 'pattern':64,881 'perplex':513 'person':16,199,246,259,266,856,900 'posit':394,402,415,813,817 'post':13,60,89,171,418,454,548,652,957 'practic':746 'prefer':369,706,968 'present':540 'primari':654 'primaryimag':209,663 'problem':747 'project':943 'properti':161,228,236,291 'provid':507 'pt':593 'public':685 'publish':200,233,372 'q':448,760 'question':115,468,473,829 'read':84,86 'readi':924 'recommend':160,235,359 'rectangular':367 'refer':77,302,773,896,899 'referenc':256 'reflect':691 'relat':808 'relev':95 'requir':25,158,227,351,679 'resolv':774 'restrict':490 'result':493,526,741 'rich':492,525,740 'role':271 'rule':726 'samea':280,340 'save':950 'say':34 'schema':3,9,35,37,43,56,67,94,153,247,249,313,379,446,504,552,649,721,839,876,934,953,963 'schema-relev':93 'script':72,884 'search':757,865 'second':433 'section':114,457 'separ':962 'septemb':734 'sequenti':819 'show':380,739 'signal':533 'sinc':499 'singl':71,879,883,918 'site':130,498 'sitelink':756 'siteurl':166,194,202,206,214,261,275,323,329,334,387,399,408,421,437,462,557,660 'skill':849 'skill-blog-schema' 'slug':144,168,198,208,216,265,279,389,412,423,464,559,662 'social':103 'source-agricidaniel' 'specialannounc':742 'stabl':75,251,894 'standalon':930 'start':820 'statist':486 'step':82,149,243,309,373,442,534,643,714,871 'still':506 'structur':41,47,521 'system':511,906 'tag':73,885 'tags/categories':140 'text':125,477,481,677,705 'thumbnailurl':572 'titl':97,102,172,273,419,564 'topic-agent-skills' 'topic-ai-citations' 'topic-ai-content' 'topic-ai-marketing' 'topic-ai-marketing-hub' 'topic-blog' 'topic-blog-writing' 'topic-claude-code' 'topic-claude-code-skill' 'topic-claude-plugin' 'topic-claude-skill' 'topic-content-creation' 'twitter.com':282,342 'twitter.com/handle':281 'twitter.com/org':341 'type':30,68,163,211,229,258,299,320,331,384,392,400,413,459,467,475,554,599,602,657,722,731,840,854 'understand':867 'updat':915 'uploadd':578 'url':122,132,274,328,333,357,441,664,680,804 'use':31,61,429,613,728,755,835,944 'user':33,967 'userinteractioncount':604 'valid':22,52,355,716,725,768 'valu':508 'via':639,893 'video':539,544,560,563,566,614,616,624 'videoid':576,586,591 'videoobject':537,551,555,608,861 'viewcount':605 'warn':27,717 'watchact':603 'webpag':212 'wide':365 'width':336,668,687 'within':777 'word':134,484 'wordcount':217,240 'workflow':81 'worksfor':300 'wrap':946 'www.youtube.com':584,589 'www.youtube.com/embed/':588 'www.youtube.com/watch?v=':583 'youtub':543,634 'yyyi':184,189 'yyyy-mm-dd':183,188","prices":[{"id":"e78a72c2-d630-44c9-a35c-c1b47e2a19d3","listingId":"2df7bbba-d4bf-45d7-8603-83a10c6310c0","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"AgriciDaniel","category":"claude-blog","install_from":"skills.sh"},"createdAt":"2026-05-18T12:54:54.205Z"}],"sources":[{"listingId":"2df7bbba-d4bf-45d7-8603-83a10c6310c0","source":"github","sourceId":"AgriciDaniel/claude-blog/blog-schema","sourceUrl":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema","isPrimary":false,"firstSeenAt":"2026-05-18T12:54:54.205Z","lastSeenAt":"2026-05-18T18:53:31.422Z"}],"details":{"listingId":"2df7bbba-d4bf-45d7-8603-83a10c6310c0","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AgriciDaniel","slug":"blog-schema","github":{"repo":"AgriciDaniel/claude-blog","stars":753,"topics":["agent-skills","ai","ai-citations","ai-content","ai-marketing","ai-marketing-hub","blog","blog-writing","claude-code","claude-code-skill","claude-plugin","claude-skill","content-creation","content-optimization","content-strategy","eeat","geo","multilingual","open-source","seo"],"license":"mit","html_url":"https://github.com/AgriciDaniel/claude-blog","pushed_at":"2026-05-15T04:45:18Z","description":"Claude Code blog skill suite: 30 sub-skills, 5 agents, 5-gate v1.9.0 Blog Delivery Contract, dual-optimized for Google rankings and AI citations. Active development at AI-Marketing-Hub/claude-blog (AI Marketing Hub Pro community); public releases ship here.","skill_md_sha":"27a66d31912cc48f0c606459d425a3b31cb837c6","skill_md_path":"skills/blog-schema/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema"},"layout":"multi","source":"github","category":"claude-blog","frontmatter":{"name":"blog-schema","license":"MIT","description":"Generate complete JSON-LD schema markup for blog posts including BlogPosting, Person, Organization, BreadcrumbList, FAQPage, and ImageObject. Validates against Google requirements and warns about deprecated types. Use when user says \"schema\", \"blog schema\", \"json-ld\", \"structured data\", \"schema markup\", \"generate schema\"."},"skills_sh_url":"https://skills.sh/AgriciDaniel/claude-blog/blog-schema"},"updatedAt":"2026-05-18T18:53:31.422Z"}}