From asyrafhussin-agent-skills-1
SEO patterns, conventions, and audit for web applications. Use when implementing meta tags, structured data, Core Web Vitals, sitemaps, Open Graph, auditing SEO, or optimizing pages for search engines. Triggers on "audit SEO", "check SEO", "review SEO", or tasks involving search optimization, schema markup, or social sharing meta tags.
npx claudepluginhub joshuarweaver/cascade-code-languages-misc-1 --plugin asyrafhussin-agent-skills-1This skill uses the workspace's default tool permissions.
Comprehensive SEO patterns for web applications built with React and Laravel. Contains 31 rules across 8 categories covering Core Web Vitals, technical SEO, structured data, performance, social sharing, and mobile-first indexing. Supports both **coding reference** and **audit mode**.
AGENTS.mdREADME.mdmetadata.jsonrules/_sections.mdrules/_template.mdrules/cwv-cls.mdrules/cwv-inp.mdrules/cwv-lcp.mdrules/mobile-content-parity.mdrules/mobile-ux.mdrules/mobile-viewport.mdrules/onpage-headings.mdrules/onpage-images.mdrules/onpage-internal-linking.mdrules/onpage-semantic-html.mdrules/perf-font-loading.mdrules/perf-image-formats.mdrules/perf-lazy-loading.mdrules/perf-resource-hints.mdrules/schema-article.mdSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Checks Next.js compilation errors using a running Turbopack dev server after code edits. Fixes actionable issues before reporting complete. Replaces `next build`.
Comprehensive SEO patterns for web applications built with React and Laravel. Contains 31 rules across 8 categories covering Core Web Vitals, technical SEO, structured data, performance, social sharing, and mobile-first indexing. Supports both coding reference and audit mode.
When the user asks to "audit SEO", "check SEO", or "review SEO" — run the checklist below against their codebase.
$ARGUMENTS): audit only those pages or filesUse the detection logic in "Step 1: Detect Project Type" below to determine Laravel Blade vs Laravel + Inertia + React.
Work through every item below. For each, output:
file:line, description of the issue, and fix recommendationfetchpriority="high" and are preloaded (LCP < 2.5s)width/height attributes (CLS < 0.1)<title> tag (50-60 characters)<meta name="description"> (150-160 characters)<link rel="canonical"> pointing to the correct URLrobots.txt exists and does not block important pages<h1> per page containing the primary keywordalt text (not empty, not "image", not filename)<article>, <section>, <nav>, <main>)@graph when combining multiple schema typesloading="lazy"font-display: swap or optional<link rel="preconnect"> or <link rel="preload">og:title, og:description, og:image, og:url, og:type)og:image is at least 1200x630pxtwitter:card, at minimum summary_large_image)<Head> component or equivalent)head-key attribute used to prevent duplicate meta tags (Inertia.js)<meta name="viewport" content="width=device-width, initial-scale=1"> presentEnd the audit with:
## SEO Audit Summary
- **PASS**: X checks
- **FAIL**: X checks
- **N/A**: X checks
- **Top Priority Fixes**: (list the 3 most impactful FAIL items)
Reference these guidelines when:
<title>, description, canonical, robots)Always check the project stack before giving advice. Different stacks need different SEO approaches.
Check package.json and project structure:
| Signal | Project Type |
|---|---|
@inertiajs/react in dependencies | Laravel + Inertia + React |
resources/views/**/*.blade.php only (no React) | Laravel Blade (server-rendered) |
If Laravel Blade: Apply tech-, onpage-, schema-, perf-, social-, mobile- rules. Meta tags go in Blade layouts. Sitemaps via spatie/laravel-sitemap. Skip spa- rules — pages are already server-rendered.
If Laravel + Inertia + React: Apply all rules. Meta tags via @inertiaHead in Blade layout + <Head> component from @inertiajs/react in React pages. For SSR, create resources/js/ssr.jsx using createServer from @inertiajs/react/server, add ssr: 'resources/js/ssr.jsx' to Vite config, build with vite build && vite build --ssr, and run php artisan inertia:start-ssr. Use head-key attribute on meta tags to prevent duplicates between layout and page. Focus on schema-, social-, and perf- rules.
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Core Web Vitals | CRITICAL | cwv- |
| 2 | Technical SEO | CRITICAL | tech- |
| 3 | On-Page SEO | HIGH | onpage- |
| 4 | Structured Data | HIGH | schema- |
| 5 | Performance SEO | HIGH | perf- |
| 6 | Social Sharing | HIGH | social- |
| 7 | React/SPA SEO | HIGH | spa- |
| 8 | Mobile-First | MEDIUM | mobile- |
cwv-lcp - Largest Contentful Paint optimization (<2.5s)cwv-inp - Interaction to Next Paint optimization (<200ms)cwv-cls - Cumulative Layout Shift prevention (<0.1)tech-meta-tags - Essential HTML meta tags (title, description, canonical)tech-canonical-urls - Canonical URL implementationtech-robots-txt - Robots.txt configurationtech-sitemap-xml - XML sitemap generationtech-url-structure - SEO-friendly URL patternsonpage-headings - Heading hierarchy and structureonpage-semantic-html - Semantic HTML for SEO and accessibilityonpage-internal-linking - Internal linking strategyonpage-images - Image optimization and alt textschema-json-ld - JSON-LD structured data basicsschema-article - Article and BlogPosting markupschema-product - Product schema for e-commerceschema-breadcrumb - BreadcrumbList navigation markupschema-graph - Combining multiple schema types with @graphschema-faq - FAQ page schema markupschema-validation - Structured data validation and monitoringperf-image-formats - Modern image formats (WebP/AVIF)perf-lazy-loading - Lazy loading implementationperf-font-loading - Web font loading strategyperf-resource-hints - Preconnect, preload, and prefetchsocial-open-graph - Open Graph meta tagssocial-twitter-cards - Twitter/X Card meta tagsspa-rendering-strategy - SSR vs CSR vs SSG for SEOspa-meta-management - Dynamic meta tag managementspa-routing - SPA routing and crawlabilitymobile-viewport - Viewport and responsive configurationmobile-content-parity - Content parity between mobile and desktopmobile-ux - Mobile UX requirements for SEO<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Page Title — Site Name</title>
<meta name="description" content="Concise 150-160 character description of page content." />
<link rel="canonical" href="https://example.com/page" />
<!-- Open Graph -->
<meta property="og:title" content="Page Title" />
<meta property="og:description" content="Description for social sharing." />
<meta property="og:image" content="https://example.com/og-image.jpg" />
<meta property="og:url" content="https://example.com/page" />
<meta property="og:type" content="website" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
</head>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Article Title",
"author": {
"@type": "Person",
"name": "Author Name"
},
"datePublished": "2026-03-14",
"dateModified": "2026-03-14",
"image": "https://example.com/article-image.jpg",
"publisher": {
"@type": "Organization",
"name": "Site Name",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
}
}
</script>
import { Head } from '@inertiajs/react'
interface Post {
title: string;
slug: string;
excerpt: string;
image: string;
}
function BlogPost({ post }: { post: Post }) {
return (
<>
<Head>
<title>{post.title} — Blog</title>
<meta head-key="description" name="description" content={post.excerpt} />
<link rel="canonical" href={`https://example.com/blog/${post.slug}`} />
<meta property="og:title" content={post.title} />
<meta property="og:description" content={post.excerpt} />
<meta property="og:image" content={post.image} />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary_large_image" />
</Head>
<article>{/* content */}</article>
</>
)
}
LCP < 2.5s Preload hero image, use fetchpriority="high"
INP < 200ms Break long tasks, yield to main thread
CLS < 0.1 Set width/height on images, reserve space for dynamic content
<!-- Modern formats with fallback -->
<picture>
<source srcset="hero.avif" type="image/avif" />
<source srcset="hero.webp" type="image/webp" />
<img
src="hero.jpg"
alt="Descriptive alt text for the image"
width="1200"
height="630"
fetchpriority="high"
/>
</picture>
<!-- Responsive images -->
<img
srcset="photo-400.webp 400w, photo-800.webp 800w, photo-1200.webp 1200w"
sizes="(max-width: 600px) 400px, (max-width: 900px) 800px, 1200px"
src="photo-800.webp"
alt="Descriptive alt text"
width="1200"
height="800"
loading="lazy"
/>
Read individual rule files for detailed explanations and code examples:
rules/tech-meta-tags.md
rules/schema-json-ld.md
rules/cwv-lcp.md
rules/spa-rendering-strategy.md
rules/social-open-graph.md
Each rule file contains:
For the complete guide with all rules expanded: AGENTS.md