$npx -y skills add AgriciDaniel/claude-blog --skill blog-seo-checkPost-writing SEO validation with pass/fail checklist covering title tag length and keyword placement, meta description quality, heading hierarchy and keyword density, internal/external link audit with anchor text analysis, canonical URL verification, Open Graph meta tags (og:titl
| 1 | # Blog SEO Check: Post-Writing Validation |
| 2 | |
| 3 | Runs a comprehensive on-page SEO validation against a completed blog post and |
| 4 | generates a pass/fail checklist with specific fixes for each failure. Designed |
| 5 | to run after writing - catches issues before publishing. |
| 6 | |
| 7 | ## Workflow |
| 8 | |
| 9 | ### Step 1: Read Content |
| 10 | |
| 11 | Read the target file and extract: |
| 12 | - **Frontmatter** - title, description, date, lastUpdated, author, tags, |
| 13 | canonical, og:image, slug/URL |
| 14 | - **Heading structure** - H1, H2, H3 hierarchy with full text |
| 15 | - **Links** - All internal and external links with anchor text |
| 16 | - **Meta tags** - OG tags, Twitter Card tags, canonical URL |
| 17 | - **Body content** - Full text for keyword and structural analysis |
| 18 | |
| 19 | If the user provides a URL instead of a file path, use WebFetch to retrieve |
| 20 | the page and extract the relevant elements. |
| 21 | |
| 22 | ### Step 2: Title Tag Validation |
| 23 | |
| 24 | | Check | Pass Criteria | |
| 25 | |-------|---------------| |
| 26 | | Character count | 40-60 characters (no truncation in SERPs) | |
| 27 | | Keyword placement | Primary keyword in first half of title | |
| 28 | | Power word | Contains at least one power word (e.g., Guide, Best, How, Why, Essential, Proven, Complete) | |
| 29 | | Truncation risk | No critical meaning lost if truncated at 60 chars | |
| 30 | | Uniqueness | Not generic - specific to the content | |
| 31 | |
| 32 | ### Step 3: Meta Description |
| 33 | |
| 34 | | Check | Pass Criteria | |
| 35 | |-------|---------------| |
| 36 | | Character count | 150-160 characters | |
| 37 | | Statistic included | Contains at least one specific number or data point | |
| 38 | | Value proposition | Ends with clear reader benefit or value proposition | |
| 39 | | Keyword presence | Primary keyword appears naturally (not stuffed) | |
| 40 | | No keyword stuffing | Keyword appears at most once | |
| 41 | | Call to action | Implies action (learn, discover, find out, see) | |
| 42 | |
| 43 | ### Step 4: Heading Hierarchy |
| 44 | |
| 45 | | Check | Pass Criteria | |
| 46 | |-------|---------------| |
| 47 | | Single H1 | Exactly one H1 tag (the title) | |
| 48 | | No skipped levels | H1 -> H2 -> H3, never H1 -> H3 or H2 -> H4 | |
| 49 | | Keyword in headings | Primary keyword in 2-3 headings (natural, not forced) | |
| 50 | | Question format | 60-70% of H2 headings are questions | |
| 51 | | H2 count | 6-8 H2 sections for a standard blog post | |
| 52 | | Heading length | Each heading under 70 characters | |
| 53 | |
| 54 | ### Step 5: Internal Links |
| 55 | |
| 56 | | Check | Pass Criteria | |
| 57 | |-------|---------------| |
| 58 | | Link count | 3-10 internal links per post | |
| 59 | | Anchor text | Descriptive (not "click here" or "read more") | |
| 60 | | Bidirectional | Check if linked pages also link back (flag if not) | |
| 61 | | No orphan status | Post links to at least 3 other pages on the site | |
| 62 | | Link distribution | Links spread across the post, not clustered | |
| 63 | | No self-links | Post does not link to itself | |
| 64 | |
| 65 | Use Grep and Glob to scan the project for existing blog content and verify |
| 66 | bidirectional linking where possible. |
| 67 | |
| 68 | ### Step 5.5: Link Deduplication |
| 69 | |
| 70 | | Check | Pass Criteria | |
| 71 | |-------|---------------| |
| 72 | | No duplicate URLs | Each URL appears at most once in body content | |
| 73 | | Best instance kept | If duplicates exist, keep the one with most descriptive anchor text | |
| 74 | | Navigation exempt | Header/footer nav links don't count toward body dedup | |
| 75 | | Fragment normalization | URLs with different #fragments treated as same URL | |
| 76 | |
| 77 | For each duplicate found: |
| 78 | 1. Normalize URLs (strip trailing slashes, query parameters, fragments) |
| 79 | 2. Score each instance by anchor text descriptiveness (keyword-rich > generic) |
| 80 | 3. Recommend keeping the highest-scored instance, removing others |
| 81 | 4. Deduct 1 point per duplicate from SEO Optimization score |
| 82 | |
| 83 | Google records 1-2 anchor texts per URL per page (Zyppy 2023). Optimal: link to |
| 84 | same URL once in body content; 5-10 internal links per 2,000 words; max ~50 total |
| 85 | links per page. |
| 86 | |
| 87 | ### Step 6: External Links |
| 88 | |
| 89 | | Check | Pass Criteria | |
| 90 | |-------|---------------| |
| 91 | | Source tier | Links to tier 1-3 sources only (authoritative, not SEO blogs) | |
| 92 | | Broken links | Use WebFetch to verify top external links are reachable | |
| 93 | | Rel attributes | External links have appropriate rel attributes (nofollow for sponsored/UGC) | |
| 94 | | Link count | At least 3 external links to authoritative sources | |
| 95 | | No competitor links | Not linking to direct competitors unnecessarily | |
| 96 | |
| 97 | ### FLOW evidence triple (citations) |
| 98 | |
| 99 | For every public statistic in the post, verify all three components: |
| 100 | |
| 101 | - Year anchor appears in |