SEO
gridaco/grida
SEO best practices for the Grida project across Next.js pages, blog posts, and documentation.
Generate complete JSON-LD schema markup for blog posts with Article/BlogPosting, Person, Organization, BreadcrumbList, ImageObject, and optional FAQPage.
$ npx skills add AgriciDaniel/claude-blog --skill blog-schema -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install AgriciDaniel/claude-blog blog-schema --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/AgriciDaniel/claude-blog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/blog-schema .claude/skills/blog-schema && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "blog-schema" agent skill from https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema into .claude/skills/blog-schema/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-schema", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schemaType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add AgriciDaniel/claude-blog --skill blog-schema -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install AgriciDaniel/claude-blog blog-schema --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AgriciDaniel/claude-blog.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/blog-schema .agents/skills/blog-schema && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "blog-schema" agent skill from https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema into .agents/skills/blog-schema/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-schema", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AgriciDaniel/claude-blog --skill blog-schema -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install AgriciDaniel/claude-blog blog-schema --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AgriciDaniel/claude-blog.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/blog-schema .cursor/skills/blog-schema && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "blog-schema" agent skill from https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema into .cursor/skills/blog-schema/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-schema", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/AgriciDaniel/claude-blog.git --path skills/blog-schema--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add AgriciDaniel/claude-blog --skill blog-schema -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install AgriciDaniel/claude-blog blog-schema --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AgriciDaniel/claude-blog.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/blog-schema .gemini/skills/blog-schema && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "blog-schema" agent skill from https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema into .gemini/skills/blog-schema/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-schema", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install AgriciDaniel/claude-blog blog-schemaInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add AgriciDaniel/claude-blog --skill blog-schema -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/AgriciDaniel/claude-blog.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/blog-schema .github/skills/blog-schema && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "blog-schema" agent skill from https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema into .github/skills/blog-schema/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-schema", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AgriciDaniel/claude-blog --skill blog-schema -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install AgriciDaniel/claude-blog blog-schema --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AgriciDaniel/claude-blog.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/blog-schema .opencode/skills/blog-schema && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "blog-schema" agent skill from https://github.com/AgriciDaniel/claude-blog/tree/main/skills/blog-schema into .opencode/skills/blog-schema/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "blog-schema", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
blog-schemaGenerate complete JSON-LD schema markup for blog posts with Article/BlogPosting, Person, Organization, BreadcrumbList, ImageObject, and optional FAQPage.
Blog Schema is an agent skill from AgriciDaniel/claude-blog. 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".
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Marketing & SEO, covering Schema markup and Blog and article writing. The repository describes itself as: 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… The licence is MIT.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 2500d4c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are json and html).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
twitter.comlinkedin.comgithub.comyoutube.comimg.youtube.comcdn.pixabay.comschema.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Blog Schema loads about 2.7k tokens when it runs. Until then it costs about 87 tokens; SKILL.md has 959 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from AgriciDaniel/claude-blog at commit 2500d4c, republished under its MIT licence (© AgriciDaniel). 959 words, ~2,675 tokens.
.claude/skills/blog-schema/SKILL.md (or your agent's skills folder).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.
Read the blog post and extract all schema-relevant data:
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).
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)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.
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.
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 visible answer text."
}
}
]
}Google retired FAQ rich results for all sites on 2026-05-07. FAQPage is not a
Google rich-result or generative-AI optimization path, and it earns no SEO or
AI-readiness credit. Only emit it when a visible FAQ genuinely helps readers,
with at least one valid Question and matching visible answer. Do not pad an
answer to a target length or add an FAQ solely for markup.
Do not substitute QAPage. Google supports QAPage for a page focused on one question where users can submit answers. Editorial FAQs, support FAQs, and blog Q&A sections do not meet that model.
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.
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:
Check per-surface support before recommending schema types:
| Type | Google Search status | Valid entity/context use |
|---|---|---|
| HowTo | No current Google rich-result experience | Valid schema.org type for genuine how-to content |
| Dataset | Used by Dataset Search, not general Google Search rich results | Valid only for an actual dataset |
| QAPage | Supported for one question with user-submitted answers | Do not use for editorial FAQ content |
| Course | Course list remains distinct from the retired Course Info experience | Use only when the current Course list documentation and visible content match |
| ClaimReview, SpecialAnnouncement, Course Info, Estimated Salary, Learning Video, Vehicle Listing | Former Google Search experiences; support was retired | May remain schema.org-valid, but never recommend them for Google eligibility |
| PracticeProblem | Removed from Google Search and its documentation | Do not recommend for Google eligibility |
| Sitelinks Search Box | No dedicated Google Search visual element | Google generates sitelinks algorithmically |
Validation checks:
QuestionGenerative AI note: Structured data is not required for Google generative AI search, and there is no special AI schema. Prioritize accurate, visible-content-consistent Article/BlogPosting, Person, Organization, and BreadcrumbList entities. Add ImageObject or VideoObject when the assets exist. FAQPage remains optional reader-facing markup and adds no Google AI advantage.
Combine all schemas into a single <script> tag using the @graph pattern:
Security requirement: build the JSON-LD with a real JSON encoder, never string
interpolation. Before embedding in HTML, make the JSON text script-safe by
escaping closing script sequences and literal less-than characters, for example
replace </ with <\/ and < with \u003c. User-controlled fields such as
headline, description, author name, image URL, and breadcrumb labels must only
enter the block as JSON-encoded values.
<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:
Output options:
<head> or before </body>Save the generated schema to the blog post file or to a separate schema file as the user prefers.
Google can process JSON-LD generated by JavaScript when it is present in the rendered DOM. Server-rendered markup is still more portable for non-Google crawlers, but source-only JSON-LD is not a Google requirement. For dynamic markup, validate the rendered URL, confirm the values match visible content, and avoid delayed or failed client requests that leave the rendered DOM empty.
© AgriciDaniel, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/blog-schema of AgriciDaniel/claude-blog.
Open the folder on GitHubat commit 2500d4c
Blog Schema next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Blog Schema this skillAgriciDaniel/claude-blog | 2.3k | — | ~2.7k | Automated safety check: Pass | MIT | |
| SEOgridaco/grida | 2.7k | — | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| SEO Optimizersecondsky/claude-skills | 227 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Youtube Search API Skillbrowser-act/skills | 6.1k | 1 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Wordpress Centric High SEO Optimized Blogwriting Skillsickn33/agentic-awesome-skills | 47k | 1 repos | ~2.1k | Automated safety check: Pass | MIT | |
| Article Writingericrisco/rsc-harness | 174 | — | ~2.9k | Automated safety check: Pass | MIT |
gridaco/grida
SEO best practices for the Grida project across Next.js pages, blog posts, and documentation.
secondsky/claude-skills
SEO optimization with keyword analysis, readability assessment, technical validation, content quality.
browser-act/skills
This skill helps users automatically extract structured data from YouTube search results using the BrowserAct API.
sickn33/agentic-awesome-skills
Generate clean, human-sounding, SEO-optimized WordPress blog posts with optional Yoast metadata, JSON-LD schema markup, and image SEO planning.
ericrisco/rsc-harness
A skill your agent uses when writing one long-form article end to end — answer-first lede, question-shaped headings, plus its on-page surface (title, meta, slug, FAQ, Article/FAQPage JSON-LD) — or…
ericrisco/rsc-harness
A skill your agent uses when one existing page needs to rank in Google AND get cited by AI answer engines — auditing a URL for on-page SEO, structured-data JSON-LD, GEO citation levers, Core Web…
AgriciDaniel/claude-blog
Google API integration for blog performance: PageSpeed Insights, CrUX Core Web Vitals with 25-week history, Search Console performance, URL Inspection, Indexing API, GA4 organic traffic, NLP entity…
AgriciDaniel/claude-blog
Generate audio narration of blog posts using Google Gemini TTS.
AgriciDaniel/claude-blog
FLOW framework integration for bloggers. An agent skill from AgriciDaniel/claude-blog.
AgriciDaniel/claude-blog
Query Google NotebookLM notebooks for source-grounded, citation-backed answers from user-uploaded documents.
AgriciDaniel/claude-blog
AI image generation and editing for blog content powered by Gemini via MCP.
AgriciDaniel/claude-blog
Semantic topic cluster planning and automated execution engine for claude-blog.
Categories
Generate complete JSON-LD schema markup for blog posts with Article/BlogPosting, Person, Organization, BreadcrumbList, ImageObject, and optional FAQPage. Blog Schema is an agent skill from AgriciDaniel/claude-blog. Generate complete JSON-LD schema markup for blog posts with Article/BlogPosting, Person, Organization, BreadcrumbList, ImageObject, and optional FAQPage.
Blog Schema fits situations like: user says schema; structured data; generate schema.
Run `npx skills add AgriciDaniel/claude-blog --skill blog-schema -a claude-code`. Or copy the skill folder (skills/blog-schema in AgriciDaniel/claude-blog) into .claude/skills/blog-schema in your project. Claude Code loads it when a task matches its description.
Run `npx skills add AgriciDaniel/claude-blog --skill blog-schema -a codex`. Or copy the skill folder (skills/blog-schema in AgriciDaniel/claude-blog) into .agents/skills/blog-schema in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add AgriciDaniel/claude-blog --skill blog-schema -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/blog-schema, .gemini/skills/blog-schema, .github/skills/blog-schema and .opencode/skills/blog-schema in your project.
SKILL.md names no scripts, command-line tools or credentials: Blog Schema is instructions for the agent only.
SKILL.md names 7 domains. In commands or code: twitter.com, linkedin.com, github.com, youtube.com, img.youtube.com, cdn.pixabay.com and schema.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Blog Schema is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Blog Schema: SEO (gridaco/grida, 2.7k stars), SEO Optimizer (secondsky/claude-skills, 227 stars), Youtube Search API Skill (browser-act/skills, 6.1k stars) and Wordpress Centric High SEO Optimized Blogwriting Skill (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
AgriciDaniel (a GitHub user) maintains it in AgriciDaniel/claude-blog, which has 2,347 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 9, 2026.
Source: AgriciDaniel/claude-blog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.