Seo rendering
Audit a page's rendering strategy and JavaScript dependency — diff raw HTML against the rendered DOM to measure how much primary content, links, headings, and JSON-LD exist only after JS executes, classify CSR-only / SSR / SSG / ISR, and emit framework-specific guidance. Module M4. Feeds both the Search SEO and AI Visibility scores.From its SKILL.md
npx -y skills add Hainrixz/claude-seo-ai --skill seo-renderingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
SKILL.md
4.3 KB, 926 tokens by cl100k_base, as published. Nobody here has run it
seo-rendering (M4)
Most AI crawlers do not execute JavaScript, so content that only exists after hydration is invisible to them — CSR-only is a hard AI gate. JS dependency also delays first paint; see references/cwv-thresholds.md for how this feeds LCP/INP.
Audits
Working from the PageSnapshot (rendered_dom if present, else raw_html) and the raw HTML the server first returned:
- Content delta: diff
raw_htmlvsrendered_dom— measure the share of primary text, internal links, headings (h1–h3), and<script type="application/ld+json">blocks that appear only after JavaScript runs. - Classify the strategy: CSR-only (empty/near-empty raw shell, content injected client-side) / SSR / SSG (prerendered static) / ISR (prerendered + revalidated). Use raw-HTML completeness and framework signals (
__NEXT_DATA__, hydration markers,data-reactroot, build manifests). - Hydration-blocked text: primary content present in raw HTML but hidden/empty until hydration, or rendered only into a client-only island.
- Lazy-loaded main content: above-the-fold or primary content that requires scroll/intersection/interaction to load — invisible to a non-interacting crawler.
- AI gate: if the h1, primary body, or JSON-LD exist only in
rendered_dom, flag the page as not reliably consumable by non-JS AI crawlers.
Fixes (fixable: advisory)
Rendering strategy is a framework/architecture decision with high breakage risk, so M4 is ADVISORY only — it diagnoses and prioritizes, it never auto-edits build/server code.
- Emit framework-specific guidance: e.g. move CSR-only routes to SSG/ISR or SSR (Next.js App Router server components /
generateStaticParams+revalidate; Nuxt/Astro/SvelteKit equivalents). - Recommend prerendering or partial prerendering for primary content; reserve client-only islands for genuinely interactive widgets.
- Where the right strategy depends on data freshness or constraints the snapshot can't reveal, leave a clearly-marked TODO for the user — never fabricate a
revalidateinterval or assert a strategy choice. Every finding carriesfixable: advisory.
Verification
render_diff: compute the content-delta ratio ofraw_htmlvsrendered_dom(primary text / links / headings / JSON-LD present in rendered but absent in raw). A high delta on primary content confirms the JS dependency.- Rendering an accurate
rendered_domrequires a headless-browser data tier. When that tier is unavailable, status isneeds_api— never a falsepass.
Findings
Emit findings per schema/finding.schema.json. Examples:
M4.render.csr_only_primary_content— h1 and body text exist only inrendered_dom, raw HTML is an empty shell (statusfail, severity 5, axisboth,fixable: advisory, confidenceestablished).M4.render.jsonld_js_injected— JSON-LD blocks present only after hydration, so non-JS crawlers see no structured data (statuswarn, severity 4, axisai,fixable: advisory, confidenceestablished).M4.render.lazy_main_content— primary content loads only on scroll/interaction (statuswarn, severity 4, axisboth,fixable: advisory, confidencedirectional). Each finding:evidence.observedquotes the raw vs rendered delta on the page;verification.reproduceis a runnablerender_diffassertion;expected_impactis banded + confidence-tagged (no naked %).
Honesty
- Googlebot does render JavaScript (second-wave, queued), so a well-built CSR app can still rank in classic Search — frame CSR-only as an AI-visibility and crawl-efficiency problem, not an automatic Google-ranking failure.
- Don't claim "SSR ranks higher than CSR" as a ranking factor; the documented effect is content availability to non-JS consumers and faster paint, not a rendering-mode boost. Keep CSR if the page is interactive-by-nature and primary content is still server-delivered.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most marketing audience skills give in 926 tokens
Counted across 690 of the 894 authors here whose files we hold, read 2026-08-07
- Apply Poppins font to headingsin 41 of 690, across 6 files
- Apply Lora font to body textin 41 of 690, across 6 files
- Use Arial fallback for headingsin 39 of 690, across 4 files
- Use Georgia fallback for body textin 39 of 690, across 4 files
- Maintain text hierarchy and formattingin 39 of 690, across 4 files
- Use accent colors for non-text shapesin 38 of 690, across 3 files
- Use RGB values for precise color matchingin 38 of 690, across 3 files
- Use brand colors for primary text and backgroundsin 36 of 690, across 1 file
- Read product marketing context file before asking questions, starting, or auditingin 35 of 690, across 23 files
- Use active voice instead of passive voicein 26 of 690, across 10 files
- Implement or generate appropriate JSON-LD structured datain 24 of 690, across 17 files
- Prioritize clarity over clevernessin 22 of 690, across 8 files
Said here and by no other author read
- emit findings per finding schema
- classify the rendering strategy
- measure hydration-blocked text
- check for lazy-loaded main content
- flag non-JS AI crawler gates
- emit framework-specific migration guidance
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.