🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

PLS SEO Audit

by @mattvalenta

Scan websites and content to identify SEO gaps, analyze meta tags, technical factors, keyword use, and provide competitor comparison insights.

Versionv1.0.0
Downloads2,816
Installs13
Stars⭐ 1
TERMINAL
clawhub install pls-seo-audit

πŸ“– About This Skill


name: seo-audit description: Scan content and websites for SEO gaps, identify opportunities to outrank competitors. Use when: (1) Analyzing page SEO, (2) Checking meta tags and structured data, (3) Reviewing content for keyword optimization, (4) Auditing technical SEO factors.

SEO Audit

Comprehensive SEO analysis for content and websites.

Quick Audit Checklist

On-Page SEO

- [ ] Title tag (50-60 chars, keyword near front)
  • [ ] Meta description (150-160 chars, compelling)
  • [ ] H1 tag (one per page, includes target keyword)
  • [ ] H2-H6 hierarchy (logical structure)
  • [ ] Image alt text (descriptive, keyword-relevant)
  • [ ] Internal links (3-5 per page minimum)
  • [ ] URL structure (short, descriptive, hyphens)
  • [ ] Canonical tags (prevent duplicate content)
  • Technical SEO

    - [ ] Page speed (<3s load time)
    
  • [ ] Mobile-friendly (responsive design)
  • [ ] HTTPS (SSL certificate valid)
  • [ ] XML sitemap (submitted to Search Console)
  • [ ] Robots.txt (properly configured)
  • [ ] Structured data (Schema.org markup)
  • [ ] Core Web Vitals (LCP, FID, CLS)
  • Content Quality

    - [ ] Keyword in first 100 words
    
  • [ ] Content length matches intent
  • [ ] No keyword stuffing (<2% density)
  • [ ] Readable (Flesch-Kincaid score)
  • [ ] Unique value (not duplicate content)
  • [ ] Fresh content (updated regularly)

  • Technical SEO Commands

    Page Speed Analysis

    # Using PageSpeed Insights API
    curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&strategy=mobile"

    Using lighthouse locally

    npx lighthouse https://example.com --view

    Check Robots.txt

    curl https://example.com/robots.txt
    

    Check Sitemap

    curl https://example.com/sitemap.xml | xmllint --format -
    

    SSL Certificate Check

    openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
    

    Mobile-Friendly Test

    # Google's Mobile-Friendly Test API
    curl "https://searchconsole.googleapis.com/v1/urlTestingTools/mobileFriendlyTest:run?key=YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"url":"https://example.com"}'
    


    Content Analysis

    Keyword Density

    import re
    from collections import Counter

    def keyword_density(text, keyword): words = re.findall(r'\b\w+\b', text.lower()) keyword_count = text.lower().count(keyword.lower()) density = (keyword_count / len(words)) * 100 return { "keyword": keyword, "count": keyword_count, "total_words": len(words), "density": f"{density:.2f}%" }

    Target: 1-2% density

    Readability Score

    import textstat

    text = "Your content here..."

    flesch = textstat.flesch_reading_ease(text)

    90-100: Very Easy

    60-70: Standard

    0-30: Very Difficult

    grade = textstat.flesch_kincaid_grade(text)

    Target: 8-9 for general audience

    Content Structure Analysis

    from bs4 import BeautifulSoup

    def analyze_headings(html): soup = BeautifulSoup(html, 'html.parser') headings = { 'h1': soup.find_all('h1'), 'h2': soup.find_all('h2'), 'h3': soup.find_all('h3'), } issues = [] if len(headings['h1']) == 0: issues.append("Missing H1 tag") elif len(headings['h1']) > 1: issues.append("Multiple H1 tags (should be one)") return { "counts": {k: len(v) for k, v in headings.items()}, "issues": issues }


    Meta Tag Analysis

    Extract Meta Tags

    from bs4 import BeautifulSoup
    import requests

    def audit_meta_tags(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') title = soup.find('title') description = soup.find('meta', attrs={'name': 'description'}) keywords = soup.find('meta', attrs={'name': 'keywords'}) issues = [] if not title or len(title.text) < 30: issues.append("Title too short or missing") elif len(title.text) > 60: issues.append("Title too long (>60 chars)") if not description: issues.append("Meta description missing") elif len(description.get('content', '')) < 120: issues.append("Meta description too short") elif len(description.get('content', '')) > 160: issues.append("Meta description too long") return { "title": title.text if title else None, "description": description.get('content') if description else None, "issues": issues }


    Structured Data Check

    Validate Schema Markup

    # Using Google's Rich Results Test
    curl "https://searchconsole.googleapis.com/v1/urlTestingTools/richResultsTest:run" \
      -H "Authorization: Bearer YOUR_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"url":"https://example.com"}'
    

    Common Schema Types

    // Article
    {
      "@context": "https://schema.org",
      "@type": "Article",
      "headline": "Title",
      "author": {"@type": "Person", "name": "Author"},
      "datePublished": "2026-01-01"
    }

    // Local Business { "@context": "https://schema.org", "@type": "LocalBusiness", "name": "Business Name", "address": {"@type": "PostalAddress", "streetAddress": "123 Main"}, "telephone": "+1-555-555-5555" }

    // FAQ { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{ "@type": "Question", "name": "Question?", "acceptedAnswer": {"@type": "Answer", "text": "Answer"} }] }


    Competitor Analysis

    Compare Page Metrics

    import requests
    from bs4 import BeautifulSoup

    def compare_seo(target_url, competitor_url): def get_metrics(url): r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') return { "title_len": len(soup.find('title').text) if soup.find('title') else 0, "h1_count": len(soup.find_all('h1')), "h2_count": len(soup.find_all('h2')), "word_count": len(soup.get_text().split()), "images": len(soup.find_all('img')), "images_no_alt": len([i for i in soup.find_all('img') if not i.get('alt')]) } return { "target": get_metrics(target_url), "competitor": get_metrics(competitor_url) }


    SEO Audit Report Template

    # SEO Audit Report

    Summary

  • Score: X/100
  • Critical Issues: X
  • Warnings: X
  • Passed: X
  • Critical Issues

    1. [Issue description] - Impact: [High/Medium/Low] - Fix: [Recommended action]

    Technical SEO

    | Factor | Status | Notes | |--------|--------|-------| | Page Speed | ⚠️ | 4.2s load time | | Mobile | βœ… | Responsive | | HTTPS | βœ… | Valid SSL | | Sitemap | βœ… | Submitted |

    On-Page SEO

    | Factor | Status | Notes | |--------|--------|-------| | Title | βœ… | 55 chars | | Meta Desc | ⚠️ | Too short | | H1 | βœ… | Present | | Images | ⚠️ | 3 missing alt |

    Recommendations

    1. [Priority 1] 2. [Priority 2] 3. [Priority 3]