feat: enhance SurfSense with new skills, blog section, and improve SEO metadata
Some checks failed
Build and Push Docker Images / tag_release (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend) (push) Has been cancelled
Build and Push Docker Images / create_manifest (web, surfsense-web) (push) Has been cancelled

- Added multiple new skills to skills-lock.json from the repository `aaron-he-zhu/seo-geo-claude-skills`.
- Introduced `fuzzy-search` dependency in package.json for improved search functionality.
- Updated pnpm-lock.yaml to include the new `fuzzy-search` package.
- Enhanced SEO metadata across various pages, including canonical links and descriptions for better search visibility.
- Improved layout and structure of several components, including the homepage and changelog, to enhance user experience.
This commit is contained in:
DESKTOP-RTLN3BA\$punk 2026-04-11 23:38:12 -07:00
parent 61b3f0d7e3
commit 7ea840dbb2
120 changed files with 25729 additions and 352 deletions

View file

@ -0,0 +1,109 @@
# On-Page SEO Auditor — Worked Example & Page Type Checklists
Referenced from [SKILL.md](https://github.com/aaron-he-zhu/seo-geo-claude-skills/blob/main/optimize/on-page-seo-auditor/SKILL.md).
---
## Worked Example
**User**: "Audit the on-page SEO of https://example.com/best-noise-cancelling-headphones targeting 'best noise cancelling headphones'"
**Output**:
```markdown
# On-Page SEO Audit Report
**Page**: https://example.com/best-noise-cancelling-headphones
**Target Keyword**: best noise cancelling headphones
**Secondary Keywords**: wireless noise cancelling headphones, ANC headphones, noise cancelling headphones review
**Page Type**: commercial (reviews/roundup)
**Audit Date**: 2025-01-15
## Summary
| Audit Area | Score | Key Finding |
|------------|-------|-------------|
| Title Tag | 8/10 | Good keyword placement; slightly long at 63 chars |
| Meta Description | 6/10 | Missing CTA; keyword present but generic copy |
| Header Structure | 9/10 | Clean hierarchy; H2s cover all major products |
| Content Quality | 7/10 | 2,400 words is solid; lacks original test data |
| Keyword Optimization | 8/10 | Strong placement; density at 1.2% is healthy |
| Internal Links | 5/10 | Only 2 internal links; missing links to brand pages |
| Images | 6/10 | 3/8 images missing alt text; no WebP format |
| Technical Elements | 7/10 | Missing Product schema; good URL and mobile |
## Overall Score: 71/100
Calculation: (8x0.15 + 6x0.05 + 9x0.10 + 7x0.25 + 8x0.15 + 5x0.10 + 6x0.10 + 7x0.10) x 10 = 71
Score Breakdown:
████████░░ Title Tag: 8/10 (15%)
██████░░░░ Meta Description: 6/10 ( 5%)
█████████░ Headers: 9/10 (10%)
███████░░░ Content: 7/10 (25%)
████████░░ Keywords: 8/10 (15%)
█████░░░░░ Internal Links: 5/10 (10%)
██████░░░░ Images: 6/10 (10%)
███████░░░ Technical: 7/10 (10%)
## Priority Issues
### Critical
1. **Internal linking severely underdeveloped** — Only 2 internal links found. Add links to individual headphone review pages (/sony-wh1000xm5-review, /bose-qc-ultra-review) and the headphones category page. Target 5-8 contextual internal links.
2. **3 product images missing alt text** — Images for Sony WH-1000XM5, Bose QC Ultra, and Apple AirPods Max have empty alt attributes. Each missing alt tag is a lost ranking signal in Google Images.
### Important
1. **Meta description lacks call-to-action** — Current description states facts but does not compel clicks. Add "Compare prices and features" or "See our top picks" to drive CTR.
## Quick Wins
1. **Add alt text to 3 images** (5 min) — Use descriptive text like "Sony WH-1000XM5 noise cancelling headphones on desk" instead of empty attributes.
2. **Rewrite meta description with CTA** (5 min) — Change to: "Compare the 10 best noise cancelling headphones for 2025. Expert-tested picks from Sony, Bose, and Apple with pros, cons, and pricing. See our top picks."
3. **Add 4+ internal links** (10 min) — Link product names to their individual review pages and add a "See all headphones" link to the category hub.
```
---
## Audit Checklists by Page Type
### Blog Post Checklist
```markdown
- [ ] Title includes keyword and is compelling
- [ ] Meta description has keyword and CTA
- [ ] Single H1 with keyword
- [ ] H2s cover main topics
- [ ] Keyword in first 100 words
- [ ] 1,500+ words for competitive topics
- [ ] 3+ internal links with varied anchors
- [ ] Images with descriptive alt text
- [ ] FAQ section with schema
- [ ] Author bio with credentials
```
### Product Page Checklist
```markdown
- [ ] Product name in title
- [ ] Price and availability in description
- [ ] H1 is product name
- [ ] Product features in H2s
- [ ] Multiple product images with alt text
- [ ] Customer reviews visible
- [ ] Product schema implemented
- [ ] Related products linked
- [ ] Clear CTA button
```
### Landing Page Checklist
```markdown
- [ ] Keyword-optimized title
- [ ] Benefit-focused meta description
- [ ] Clear H1 value proposition
- [ ] Supporting H2 sections
- [ ] Trust signals (testimonials, logos)
- [ ] Single clear CTA
- [ ] Fast page load speed
- [ ] Mobile-optimized layout
```

View file

@ -0,0 +1,315 @@
# On-Page SEO Auditor — Output Templates
Detailed output templates for on-page-seo-auditor steps 5-11. Referenced from [SKILL.md](https://github.com/aaron-he-zhu/seo-geo-claude-skills/blob/main/optimize/on-page-seo-auditor/SKILL.md).
---
## Step 5: Audit Content Quality
```markdown
## Content Quality Analysis
**Word Count**: [X] words
**Reading Level**: [Grade level]
**Estimated Read Time**: [X] minutes
| Criterion | Status | Notes |
|-----------|--------|-------|
| Sufficient length | ✅/⚠️/❌ | [comparison to ranking content] |
| Comprehensive coverage | ✅/⚠️/❌ | [notes] |
| Unique value/insights | ✅/⚠️/❌ | [notes] |
| Up-to-date information | ✅/⚠️/❌ | [notes] |
| Proper formatting | ✅/⚠️/❌ | [notes] |
| Readability | ✅/⚠️/❌ | [notes] |
| E-E-A-T signals | ✅/⚠️/❌ | [notes] |
**Content Elements Present**:
- [ ] Introduction with keyword
- [ ] Clear sections/structure
- [ ] Bullet points/lists
- [ ] Tables where appropriate
- [ ] Images/visuals
- [ ] Examples/case studies
- [ ] Statistics with sources
- [ ] Expert quotes
- [ ] FAQ section
- [ ] Conclusion with CTA
**Content Score**: [X]/10
**Gaps Identified**:
- [Missing topic/section 1]
- [Missing topic/section 2]
**Recommendations**:
1. [Specific improvement]
2. [Specific improvement]
```
---
## Step 6: Audit Keyword Usage
```markdown
## Keyword Optimization Analysis
**Primary Keyword**: "[keyword]"
**Keyword Density**: [X]%
### Keyword Placement
| Location | Present | Notes |
|----------|---------|-------|
| Title tag | ✅/❌ | Position: [X] |
| Meta description | ✅/❌ | [notes] |
| H1 | ✅/❌ | [notes] |
| First 100 words | ✅/❌ | Word position: [X] |
| H2 headings | ✅/❌ | In [X]/[Y] H2s |
| Body content | ✅/❌ | [X] occurrences |
| URL slug | ✅/❌ | [notes] |
| Image alt text | ✅/❌ | In [X]/[Y] images |
| Conclusion | ✅/❌ | [notes] |
### Secondary Keywords
| Keyword | Occurrences | Status |
|---------|-------------|--------|
| [keyword 1] | [X] | ✅/⚠️/❌ |
| [keyword 2] | [X] | ✅/⚠️/❌ |
### LSI/Related Terms
**Present**: [list of related terms found]
**Missing**: [important related terms not found]
**Keyword Score**: [X]/10
**Issues**:
- [Issue 1]
**Recommendations**:
- [Suggestion 1]
```
---
## Step 7: Audit Internal Links
```markdown
## Internal Linking Analysis
**Total Internal Links**: [X]
**Unique Internal Links**: [X]
| Criterion | Status | Notes |
|-----------|--------|-------|
| Number of internal links | ✅/⚠️/❌ | [X] (recommend 3-5+) |
| Relevant anchor text | ✅/⚠️/❌ | [notes] |
| Links to related content | ✅/⚠️/❌ | [notes] |
| Links to important pages | ✅/⚠️/❌ | [notes] |
| No broken links | ✅/⚠️/❌ | [X] broken found |
| Natural placement | ✅/⚠️/❌ | [notes] |
**Current Internal Links**:
1. "[Anchor text]" → [URL]
2. "[Anchor text]" → [URL]
3. "[Anchor text]" → [URL]
**Internal Linking Score**: [X]/10
**Recommended Additional Links**:
1. Add link to "[Related page]" with anchor "[suggested anchor]"
2. Add link to "[Related page]" with anchor "[suggested anchor]"
**Anchor Text Improvements**:
- Change "[current anchor]" to "[improved anchor]"
```
---
## Step 8: Audit Images
```markdown
## Image Optimization Analysis
**Total Images**: [X]
### Image Audit Table
| Image | Alt Text | File Name | Size | Status |
|-------|----------|-----------|------|--------|
| [img1] | [alt or "missing"] | [filename] | [KB] | ✅/⚠️/❌ |
| [img2] | [alt or "missing"] | [filename] | [KB] | ✅/⚠️/❌ |
| Criterion | Status | Notes |
|-----------|--------|-------|
| All images have alt text | ✅/⚠️/❌ | [X]/[Y] have alt |
| Alt text includes keywords | ✅/⚠️/❌ | [notes] |
| Descriptive file names | ✅/⚠️/❌ | [notes] |
| Appropriate file sizes | ✅/⚠️/❌ | [notes] |
| Modern formats (WebP) | ✅/⚠️/❌ | [notes] |
| Lazy loading enabled | ✅/⚠️/❌ | [notes] |
**Image Score**: [X]/10
**Recommendations**:
1. Add alt text to image [X]: "[suggested alt text]"
2. Compress image [Y]: Currently [X]KB, should be under [Y]KB
3. Rename [filename] to [better-filename]
```
---
## Step 9: Audit Technical On-Page Elements
```markdown
## Technical On-Page Analysis
| Element | Current Value | Status | Recommendation |
|---------|---------------|--------|----------------|
| URL | [URL] | ✅/⚠️/❌ | [notes] |
| URL length | [X] chars | ✅/⚠️/❌ | [notes] |
| URL keywords | [present/absent] | ✅/⚠️/❌ | [notes] |
| Canonical tag | [URL or "missing"] | ✅/⚠️/❌ | [notes] |
| Mobile-friendly | [yes/no] | ✅/⚠️/❌ | [notes] |
| Page speed | [X]s | ✅/⚠️/❌ | [notes] |
| HTTPS | [yes/no] | ✅/⚠️/❌ | [notes] |
| Schema markup | [types or "none"] | ✅/⚠️/❌ | [notes] |
**Technical Score**: [X]/10
```
---
## Step 10: CORE-EEAT Content Quality Quick Scan
Run a quick scan of on-page-relevant CORE-EEAT items. Reference: [CORE-EEAT Benchmark](https://github.com/aaron-he-zhu/seo-geo-claude-skills/blob/main/references/core-eeat-benchmark.md)
```markdown
## CORE-EEAT Quick Scan
Content-relevant items from the 80-item benchmark:
| ID | Check Item | Status | Notes |
|----|-----------|--------|-------|
| C01 | Intent Alignment | ✅/⚠️/❌ | Title promise = content delivery |
| C02 | Direct Answer | ✅/⚠️/❌ | Core answer in first 150 words |
| C09 | FAQ Coverage | ✅/⚠️/❌ | Structured FAQ present |
| C10 | Semantic Closure | ✅/⚠️/❌ | Conclusion answers opening |
| O01 | Heading Hierarchy | ✅/⚠️/❌ | H1→H2→H3, no skipping |
| O02 | Summary Box | ✅/⚠️/❌ | TL;DR or Key Takeaways |
| O03 | Data Tables | ✅/⚠️/❌ | Comparisons in tables |
| O05 | Schema Markup | ✅/⚠️/❌ | Appropriate JSON-LD |
| O06 | Section Chunking | ✅/⚠️/❌ | Single topic per section |
| R01 | Data Precision | ✅/⚠️/❌ | ≥5 precise numbers |
| R02 | Citation Density | ✅/⚠️/❌ | ≥1 per 500 words |
| R06 | Timestamp | ✅/⚠️/❌ | Updated <1 year |
| R08 | Internal Link Graph | ✅/⚠️/❌ | Descriptive anchors |
| R10 | Content Consistency | ✅/⚠️/❌ | No contradictions |
| Exp01 | First-Person Narrative | ✅/⚠️/❌ | "I tested" or "We found" |
| Ept01 | Author Identity | ✅/⚠️/❌ | Byline + bio present |
| T04 | Disclosure Statements | ✅/⚠️/❌ | Affiliate links disclosed |
**CORE-EEAT Quick Score**: [X]/17 items passing
> For a complete 80-item audit with weighted scoring, use `content-quality-auditor`.
```
---
## Step 11: Generate Audit Summary
```markdown
# On-Page SEO Audit Report
**Page**: [URL]
**Target Keyword**: [keyword]
**Audit Date**: [date]
## Overall Score: [X]/100
```
Score Breakdown:
████████░░ Title Tag: 8/10
██████░░░░ Meta Description: 6/10
█████████░ Headers: 9/10
███████░░░ Content: 7/10
██████░░░░ Keywords: 6/10
█████░░░░░ Internal Links: 5/10
████░░░░░░ Images: 4/10
████████░░ Technical: 8/10
```
## Priority Issues
### 🔴 Critical (Fix Immediately)
1. [Critical issue 1]
2. [Critical issue 2]
### 🟡 Important (Fix Soon)
1. [Important issue 1]
2. [Important issue 2]
### 🟢 Minor (Nice to Have)
1. [Minor issue 1]
2. [Minor issue 2]
## Quick Wins
These changes will have immediate impact:
1. **[Change 1]**: [Why and how]
2. **[Change 2]**: [Why and how]
3. **[Change 3]**: [Why and how]
## Detailed Recommendations
### Title Tag
- **Current**: [current title]
- **Recommended**: [new title]
- **Impact**: [expected improvement]
### Meta Description
- **Current**: [current description]
- **Recommended**: [new description]
- **Impact**: [expected improvement]
### Content Improvements
1. [Specific content change with location]
2. [Specific content change with location]
### Internal Linking
1. Add link: "[anchor]" → [destination]
2. Add link: "[anchor]" → [destination]
### Image Optimization
1. [Image 1]: [change needed]
2. [Image 2]: [change needed]
## Competitor Comparison
| Element | Your Page | Top Competitor | Gap |
|---------|-----------|----------------|-----|
| Word count | [X] | [Y] | [+/-Z] |
| Internal links | [X] | [Y] | [+/-Z] |
| Images | [X] | [Y] | [+/-Z] |
| H2 headings | [X] | [Y] | [+/-Z] |
## Action Checklist
- [ ] Update title tag
- [ ] Rewrite meta description
- [ ] Add keyword to H1
- [ ] Add [X] more internal links
- [ ] Add alt text to [X] images
- [ ] Add [X] more content sections
- [ ] Implement FAQ schema
- [ ] [Additional action items]
## Expected Results
After implementing these changes:
- Estimated ranking improvement: [X] positions
- Estimated CTR improvement: [X]%
- Estimated traffic increase: [X]%
```

View file

@ -0,0 +1,496 @@
# On-Page SEO Scoring Rubric
Detailed scoring criteria for each of the 8 audit sections. Use this rubric to ensure consistent, objective scoring across audits.
## How to Use This Rubric
1. Score each section independently using the criteria below
2. Apply the section weight to calculate the weighted score
3. Sum all weighted scores for the overall page score (out of 100)
4. Use calibration examples to verify your scoring is consistent
## Section 1: Title Tag (Weight: 15%, Max: 15 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| Keyword presence | 3 | Primary keyword appears in title |
| Keyword position | 2 | Primary keyword in first half of title |
| Length optimization | 2 | Between 50-60 characters |
| Uniqueness | 2 | Title is unique across the site |
| Compelling copy | 2 | Includes benefit, modifier, or hook |
| Intent match | 2 | Title matches search intent accurately |
| Brand inclusion | 1 | Brand name present (at end) |
| No truncation risk | 1 | Displays fully in SERP without cutoff |
### Calibration Examples
**Score 15/15 (Excellent)**:
- Title: "Keyword Research: 7 Proven Methods to Find Low-Competition Keywords | Brand"
- 58 characters, keyword at front, benefit-driven, unique, brand at end
**Score 11/15 (Good)**:
- Title: "The Complete Guide to Keyword Research for Beginners"
- 52 characters, keyword present but not at front, no brand, still compelling
**Score 7/15 (Needs Work)**:
- Title: "Keyword Research"
- Too short (16 chars), no benefit, no brand, not compelling, generic
**Score 3/15 (Poor)**:
- Title: "Blog Post #47 - Untitled"
- No keyword, no benefit, not descriptive, not unique
**Score 0/15 (Missing)**:
- No title tag present, or title tag is empty
## Section 2: Meta Description (Weight: 5%, Max: 5 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| Keyword inclusion | 1 | Primary keyword appears naturally |
| Length optimization | 1 | Between 150-160 characters |
| Call-to-action | 1 | Contains explicit or implicit CTA |
| Unique description | 1 | Not duplicated from other pages |
| Accurate summary | 1 | Accurately describes page content |
### Calibration Examples
**Score 5/5 (Excellent)**:
- Description: "Learn 7 proven keyword research methods that top SEOs use to find low-competition opportunities. Includes free templates, real examples, and step-by-step walkthroughs. Get started today."
- 155 chars, keyword present, CTA ("Get started"), accurate, unique
**Score 3/5 (Needs Work)**:
- Description: "This page talks about keyword research and some tips you might find useful for SEO."
- 83 chars (too short), weak copy, no CTA, vague
**Score 0/5 (Missing)**:
- No meta description set; search engine generates snippet automatically
## Section 3: Header Structure (Weight: 10%, Max: 10 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| Single H1 present | 2 | Exactly one H1 on the page |
| H1 contains keyword | 2 | Primary keyword in H1 text |
| Logical hierarchy | 2 | No skipped levels (H1→H2→H3, not H1→H3) |
| H2s cover key subtopics | 2 | H2s address main topic facets |
| Descriptive headers | 1 | Headers describe section content clearly |
| Keyword variations in H2s | 1 | Secondary keywords or LSI terms in subheadings |
### Calibration Examples
**Score 10/10 (Excellent)**:
```
H1: How to Do Keyword Research: A Step-by-Step Guide
H2: What Is Keyword Research and Why Does It Matter?
H2: 7 Keyword Research Methods That Work
H3: Method 1: Seed Keyword Brainstorming
H3: Method 2: Competitor Keyword Analysis
H3: Method 3: Google Autocomplete Mining
H2: Free Keyword Research Tools Compared
H2: How to Prioritize Keywords by Difficulty
H2: Keyword Research FAQ
```
- Single H1 with keyword, logical hierarchy, descriptive H2s with variations
**Score 6/10 (Needs Work)**:
```
H1: Keyword Research
H2: Introduction
H2: Methods
H2: Tools
H2: Conclusion
```
- Single H1 but generic, H2s are vague, no keyword variations
**Score 2/10 (Poor)**:
```
H1: Welcome to Our Blog
H1: Keyword Research Guide
H3: Some Tips
H2: More Information
```
- Multiple H1s, skipped levels, generic, no keyword strategy
## Section 4: Content Quality (Weight: 25%, Max: 25 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| Sufficient length | 4 | Meets minimum for query type (see benchmarks) |
| Comprehensive coverage | 4 | Covers all major subtopics that top-ranking pages cover |
| Unique value | 4 | Original insights, data, or perspective not found elsewhere |
| Up-to-date information | 3 | Statistics, dates, and references are current |
| Proper formatting | 3 | Uses lists, tables, bold, images to improve readability |
| Readability | 3 | Appropriate reading level for target audience |
| E-E-A-T signals | 4 | Author byline, credentials, first-person experience, cited sources |
### Content Length Benchmarks (for "Sufficient length" criterion)
| Query Type | Minimum for 4/4 | Minimum for 3/4 | Minimum for 2/4 | Below 1/4 |
|-----------|-----------------|-----------------|-----------------|-----------|
| Informational | 1,500+ words | 1,000-1,499 | 500-999 | <500 |
| Commercial | 1,200+ words | 800-1,199 | 400-799 | <400 |
| Transactional | 500+ words | 350-499 | 200-349 | <200 |
| Local | 400+ words | 250-399 | 150-249 | <150 |
### Calibration Examples
**Score 25/25 (Excellent)**:
- 2,400-word guide on keyword research
- Covers all subtopics competitors cover plus unique methods
- Contains original data from author's experiments
- All statistics from the last 12 months
- Well-formatted with tables, lists, images, code examples
- Written at appropriate level for target audience
- Author byline with SEO credentials, first-person "I tested" language
**Score 16/25 (Good)**:
- 1,600-word guide, covers main subtopics
- Some unique insights but mostly curated information
- Most statistics current, a few outdated
- Good formatting but could use more visual elements
- Author byline present but limited credentials
**Score 8/25 (Needs Work)**:
- 700-word article on an informational query (too thin)
- Missing several subtopics competitors cover
- No original data or insights
- Several outdated statistics
- Wall of text with minimal formatting
- No author byline or E-E-A-T signals
## Section 5: Keyword Optimization (Weight: 15%, Max: 15 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| Keyword in title | 2 | Primary keyword in title tag |
| Keyword in H1 | 2 | Primary keyword in H1 |
| Keyword in first 100 words | 2 | Primary keyword appears early in content |
| Keyword density (0.5-2.5%) | 2 | Natural density, not stuffed, not too sparse |
| Secondary keywords present | 2 | 2-3 secondary/related keywords used |
| LSI/semantic terms | 2 | Related terms and synonyms present |
| Keyword in URL | 1 | Primary keyword in URL slug |
| Keyword in image alt text | 1 | At least one image alt contains keyword naturally |
| Keyword in meta description | 1 | Primary keyword in meta description |
### Keyword Density Guidelines
| Density | Score Impact | Assessment |
|---------|-------------|-----------|
| 0.5-1.0% | Full points | Natural, well-integrated |
| 1.0-2.0% | Full points | Acceptable, slightly keyword-focused |
| 2.0-2.5% | -1 point | Borderline, review for naturalness |
| 2.5-3.0% | -2 points | Over-optimized, needs reduction |
| >3.0% | 0 points for density | Keyword stuffing, immediate fix needed |
| <0.5% | -1 point | Under-optimized, add more natural usage |
### Calibration Examples
**Score 15/15 (Excellent)**:
- "keyword research" in title (position 1), H1, first sentence, URL slug, 1 image alt
- Density: 1.2% across 2,000 words (24 occurrences, well-distributed)
- Secondary keywords: "keyword tool", "search volume", "keyword difficulty" all present
- LSI terms: "SEO", "search terms", "Google", "organic traffic", "SERP" present
**Score 9/15 (Needs Work)**:
- Keyword in title and H1, but not in first 100 words
- Density: 0.3% (too sparse for a 2,000-word article)
- Missing secondary keywords
- No LSI/semantic terms beyond the primary keyword
## Section 6: Internal/External Links (Weight: 10%, Max: 10 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| Internal link count | 2 | 3-5+ contextual internal links (per 1,000 words) |
| Internal link relevance | 2 | Links point to topically related pages |
| Descriptive anchor text | 2 | Anchors describe destination, not "click here" |
| External link quality | 2 | Links to authoritative, relevant external sources |
| No broken links | 1 | All links return 200 status |
| Link placement | 1 | Links placed naturally within content flow |
### Internal Link Count Guidelines
| Content Length | Minimum Links | Ideal Range | Too Many |
|---------------|--------------|-------------|---------|
| <500 words | 2 | 2-4 | >8 |
| 500-1,000 words | 3 | 3-6 | >12 |
| 1,000-2,000 words | 4 | 5-10 | >20 |
| 2,000+ words | 5 | 8-15 | >25 |
### Calibration Examples
**Score 10/10 (Excellent)**:
- 8 internal links in a 2,000-word article
- All link to relevant related content
- Anchor text like "learn about keyword difficulty scoring" (descriptive)
- 3 external links to authoritative sources (Google documentation, industry studies)
- Zero broken links
**Score 5/10 (Needs Work)**:
- 2 internal links in a 2,000-word article (too few)
- One link uses "click here" anchor text
- No external links to sources
- One broken link found
## Section 7: Image Optimization (Weight: 10%, Max: 10 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| All images have alt text | 3 | Every image has descriptive alt attribute |
| Alt text includes keywords | 2 | At least 1 image alt naturally includes primary keyword |
| Descriptive file names | 1 | Files named descriptively (keyword-research-tool.webp, not IMG_4532.jpg) |
| Optimized file sizes | 2 | Images compressed appropriately (<200KB for photos, <50KB for graphics) |
| Modern formats | 1 | Uses WebP or AVIF where supported |
| Lazy loading | 1 | Below-fold images use loading="lazy" |
### Image Size Guidelines
| Image Type | Target Size | Format | Notes |
|-----------|------------|--------|-------|
| Hero/banner | <200KB | WebP | Resize to actual display dimensions |
| Content photos | <150KB | WebP | Compress at 80% quality |
| Screenshots | <100KB | WebP/PNG | Use PNG only if text clarity critical |
| Icons/graphics | <30KB | SVG/WebP | SVG preferred for vector graphics |
| Thumbnails | <50KB | WebP | Generate at actual thumbnail dimensions |
### Calibration Examples
**Score 10/10 (Excellent)**:
- 5 images, all with descriptive alt text
- Alt text: "screenshot of Ahrefs keyword research tool showing difficulty score"
- Files named: keyword-research-tool-ahrefs.webp
- All images <150KB, WebP format, lazy loading on below-fold images
**Score 4/10 (Needs Work)**:
- 3 images, 1 missing alt text
- Alt text on others: "image1", "screenshot" (not descriptive)
- Files named: IMG_3421.jpg, photo.png
- One image is 1.2MB uncompressed JPEG
## Section 8: Page-Level Technical (Weight: 10%, Max: 10 points)
### Scoring Criteria
| Criterion | Points | Requirement |
|-----------|--------|-------------|
| Clean URL structure | 2 | Short, descriptive, keyword-containing URL |
| Correct canonical tag | 2 | Self-referencing canonical or appropriate cross-domain canonical |
| Mobile-friendly | 2 | Passes mobile-friendly test, responsive layout |
| Page speed (LCP) | 2 | LCP ≤2.5s on mobile |
| HTTPS | 1 | Page served over HTTPS with valid certificate |
| Schema markup | 1 | Appropriate schema type implemented (Article, FAQ, HowTo, etc.) |
### URL Quality Guidelines
| Aspect | Good | Bad |
|--------|------|-----|
| Length | /blog/keyword-research-guide | /blog/2024/01/15/the-complete-ultimate-guide-to-keyword-research-for-beginners-and-experts |
| Keywords | /services/seo-audit | /services/page-id-4532 |
| Characters | lowercase, hyphens | UPPERCASE, underscores, special chars |
| Parameters | /products/shoes (clean) | /products?id=432&color=red&size=9 |
### Calibration Examples
**Score 10/10 (Excellent)**:
- URL: /blog/keyword-research-guide (clean, keyword-present)
- Self-referencing canonical tag present
- Fully responsive, passes mobile-friendly test
- LCP: 1.8s on mobile
- HTTPS with valid certificate
- Article + FAQ schema implemented
**Score 5/10 (Needs Work)**:
- URL: /blog/?p=4532 (not descriptive)
- No canonical tag
- Mobile-friendly but some tap targets too small
- LCP: 3.2s (needs improvement)
- HTTPS present
- No schema markup
## Overall Score Calculation
### Formula
```
Overall Score = Sum of (Section Score / Section Max * Section Weight * 100)
```
### Example Calculation
| Section | Raw Score | Max | Weight | Weighted Score |
|---------|-----------|-----|--------|---------------|
| Title Tag | 12 | 15 | 15% | 12.0 |
| Meta Description | 4 | 5 | 5% | 4.0 |
| Header Structure | 8 | 10 | 10% | 8.0 |
| Content Quality | 20 | 25 | 25% | 20.0 |
| Keyword Optimization | 11 | 15 | 15% | 11.0 |
| Internal/External Links | 7 | 10 | 10% | 7.0 |
| Image Optimization | 6 | 10 | 10% | 6.0 |
| Page-Level Technical | 8 | 10 | 10% | 8.0 |
| **Total** | | | **100%** | **76.0/100** |
### Overall Score Interpretation
| Score Range | Grade | Assessment |
|------------|-------|-----------|
| 90-100 | A+ | Exceptional — minor tweaks only |
| 80-89 | A | Strong — a few optimization opportunities |
| 70-79 | B | Good — several areas need attention |
| 60-69 | C | Average — significant improvements needed |
| 50-59 | D | Below average — major issues present |
| <50 | F | Poor comprehensive overhaul required |
## Calibration Guidance
### Avoiding Common Scoring Errors
1. **Halo effect**: A great title does not mean great content. Score each section independently.
2. **Recency bias**: Do not inflate scores for recently published content. Freshness is one factor among many.
3. **Tool dependency**: If you cannot verify a metric (e.g., page speed without tool access), note it as "unverified" rather than guessing.
4. **Competitor anchoring**: Score against the rubric criteria, not relative to competitors. Competitor comparison is a separate analysis step.
5. **Intent mismatch**: A page with perfect technical SEO but wrong intent alignment should still score low on Content Quality.
### When to Adjust Weights
The default weights suit most content pages. Consider adjusting for:
| Page Type | Increase Weight | Decrease Weight | Reason |
|-----------|----------------|----------------|--------|
| E-commerce product | Image Optimization, Technical | Content Quality | Products need visuals and speed more than long-form |
| Long-form guide | Content Quality, Keywords | Image Optimization | Content depth matters most |
| Landing page | Technical, Title | Content Quality | Speed and CTR drive conversions |
| Local service page | Technical, Links | Keywords | NAP consistency and local signals matter more |
Always document weight adjustments and the reasoning in the audit report.
---
## Scoring Rubric
### Section Weight Distribution
| Audit Section | Weight | Max Score | Rationale |
|--------------|--------|-----------|-----------|
| Title Tag | 15% | 15 | Strongest single ranking signal |
| Meta Description | 5% | 5 | CTR impact, not direct ranking factor |
| Header Structure | 10% | 10 | Content organization, semantic signals |
| Content Quality | 25% | 25 | Strongest holistic ranking factor |
| Keyword Optimization | 15% | 15 | Relevance signals |
| Internal/External Links | 10% | 10 | Authority flow, context signals |
| Image Optimization | 10% | 10 | Accessibility + image search opportunity |
| Page-Level Technical | 10% | 10 | Core Web Vitals, mobile, security |
### Scoring Scale per Factor
| Score | Meaning | Action Required |
|-------|---------|-----------------|
| 10/10 | Excellent — follows all best practices | None |
| 7-9/10 | Good — minor improvements possible | Optional optimization |
| 4-6/10 | Needs work — notable issues | Fix within this week |
| 1-3/10 | Poor — significant problems | Fix immediately (Critical) |
| 0/10 | Missing or broken | Fix immediately (Blocking) |
### Scoring Conversion Formula
Each section is scored out of 10, then converted to the 100-point overall score using section weights:
```
Overall Score = Sum of (section_score x section_weight) x 10
```
Where section weights are: Title 0.15, Meta 0.05, Headers 0.10, Content 0.25, Keywords 0.15, Links 0.10, Images 0.10, Technical 0.10.
**Worked example:**
| Section | Score /10 | Weight | Weighted |
|---------|-----------|--------|----------|
| Title Tag | 8 | 0.15 | 1.20 |
| Meta Description | 6 | 0.05 | 0.30 |
| Header Structure | 9 | 0.10 | 0.90 |
| Content Quality | 7 | 0.25 | 1.75 |
| Keyword Optimization | 8 | 0.15 | 1.20 |
| Internal/External Links | 5 | 0.10 | 0.50 |
| Image Optimization | 6 | 0.10 | 0.60 |
| Page-Level Technical | 7 | 0.10 | 0.70 |
| **Total** | | **1.00** | **7.15** |
**Overall Score** = 7.15 x 10 = **71 / 100**
## Common Issue Resolution Playbook
### Title Tag Issues
| Issue | Impact | Quick Fix Template |
|-------|--------|-------------------|
| Missing title | Critical | Add: "[Primary Keyword]: [Benefit] | [Brand]" |
| Too long (>60 chars) | Medium | Shorten: move brand to end, remove filler words |
| Too short (<30 chars) | Medium | Expand: add modifier, benefit, or year |
| Missing keyword | High | Rewrite to include primary keyword in first half |
| Duplicate title | High | Make each page title unique; add page-specific modifier |
### Meta Description Issues
| Issue | Impact | Quick Fix Template |
|-------|--------|-------------------|
| Missing description | Medium | Write: "[What this page covers]. [Key benefit]. [CTA]." (150-160 chars) |
| Too long (>160 chars) | Low | Trim from end; ensure core message fits in 150 chars |
| Missing keyword | Low | Naturally incorporate primary keyword |
| No CTA | Low | Add: "Learn more", "Discover", "Find out", "Get started" |
| Duplicated across pages | Medium | Write unique description for each page |
### Header Issues
| Issue | Impact | Quick Fix |
|-------|--------|-----------|
| Missing H1 | Critical | Add one H1 per page containing primary keyword |
| Multiple H1s | High | Keep one H1, convert others to H2 |
| Skipped heading levels | Medium | Use sequential hierarchy: H1→H2→H3 |
| Headers not descriptive | Medium | Rewrite to include keyword variations |
| No H2s (single long block) | Medium | Break content into sections with descriptive H2s every 200-300 words |
### Content Issues
| Issue | Impact | Quick Fix |
|-------|--------|-----------|
| Thin content (<300 words) | Critical | Expand with subtopics, FAQ, examples |
| Keyword stuffing (>3%) | High | Reduce usage, use synonyms and related terms |
| No structured data | Medium | Add relevant schema (FAQ, HowTo, Article) |
| Missing internal links | Medium | Add 3-5 contextual internal links |
| No images | Low | Add 2-3 relevant images with alt text |
## Industry Benchmark Data
### Content Length Benchmarks by Query Type
| Query Type | Top 10 Average Word Count | Recommended Minimum |
|-----------|--------------------------|-------------------|
| Informational (guides) | 2,200 words | 1,500 words |
| Commercial (reviews) | 1,800 words | 1,200 words |
| Transactional (product) | 800 words | 500 words |
| Local (service pages) | 600 words | 400 words |
| Definition queries | 1,200 words | 800 words |
### Page Speed Benchmarks
| Metric | Good | Needs Improvement | Poor |
|--------|------|-------------------|------|
| LCP | ≤2.5s | 2.5-4.0s | >4.0s |
| FID/INP | ≤100ms/200ms | 100-300ms | >300ms |
| CLS | ≤0.1 | 0.1-0.25 | >0.25 |
| TTFB | ≤800ms | 800-1800ms | >1800ms |