Skill: SEO Audit for Concept Pages
Use this skill to perform a focused SEO audit on concept documentation pages for the 33 JavaScript Concepts project. The goal is to maximize search visibility for JavaScript developers.
When to Use
- Before publishing a new concept page
- When optimizing underperforming pages
- Periodic content audits
- After major content updates
- When targeting new keywords
Goal
Each concept page should rank for searches like:
- "what is [concept] in JavaScript"
- "how does [concept] work in JavaScript"
- "[concept] JavaScript explained"
- "[concept] JavaScript tutorial"
- "[concept] JavaScript example"
SEO Audit Methodology
Follow these five steps for a complete SEO audit.
Step 1: Identify Target Keywords
Before auditing, identify the keyword cluster for the concept.
Keyword Cluster Template
| Type |
Pattern |
Example (Closures) |
| Primary |
[concept] JavaScript |
closures JavaScript |
| What is |
what is [concept] in JavaScript |
what is a closure in JavaScript |
| How does |
how does [concept] work |
how do closures work |
| How to |
how to use/create [concept] |
how to use closures |
| Why |
why use [concept] |
why use closures JavaScript |
| Examples |
[concept] examples |
closure examples JavaScript |
| vs |
[concept] vs [related] |
closures vs scope |
| Interview |
[concept] interview questions |
closure interview questions |
Step 2: On-Page SEO Audit
Check all on-page SEO elements systematically.
Step 3: Featured Snippet Optimization
Verify content is structured to win featured snippets.
Step 4: Internal Linking Audit
Check the internal link structure.
Step 5: Generate Report
Document findings using the report template.
Keyword Clusters by Concept
Use these pre-built keyword clusters for each concept.
Audit Checklists
Title Tag Checklist (4 points)
| # |
Check |
Points |
How to Verify |
| 1 |
Length 50-60 characters |
1 |
Count characters in title frontmatter |
| 2 |
Primary keyword in first half |
1 |
Concept name appears early |
| 3 |
Ends with "in JavaScript" |
1 |
Check title ending |
| 4 |
Contains compelling hook |
1 |
Promises value/benefit to reader |
Scoring:
- 4/4: ✅ Excellent
- 3/4: ⚠️ Good, minor improvements possible
- 0-2/4: ❌ Needs significant work
Title Formula:
[Concept]: [What You'll Understand] in JavaScript
Good Examples:
| Concept |
Title (with character count) |
| Closures |
"Closures: How Functions Remember Their Scope in JavaScript" (58 chars) |
| Event Loop |
"Event Loop: How Async Code Actually Runs in JavaScript" (54 chars) |
| Promises |
"Promises: Handling Async Operations in JavaScript" (49 chars) |
| DOM |
"DOM: How Browsers Represent Web Pages in JavaScript" (51 chars) |
Bad Examples:
| Issue |
Bad Title |
Better Title |
| Too short |
"Closures" |
"Closures: How Functions Remember Their Scope in JavaScript" |
| Too long |
"Understanding JavaScript Closures and How They Work with Examples" (66 chars) |
"Closures: How Functions Remember Their Scope in JavaScript" (58 chars) |
| No hook |
"JavaScript Closures" |
"Closures: How Functions Remember Their Scope in JavaScript" |
| Missing "JavaScript" |
"Understanding Closures and Scope" |
Add "in JavaScript" at end |
Meta Description Checklist (4 points)
| # |
Check |
Points |
How to Verify |
| 1 |
Length 150-160 characters |
1 |
Count characters in description frontmatter |
| 2 |
Starts with action word |
1 |
"Learn", "Understand", "Discover" (NOT "Master") |
| 3 |
Contains primary keyword |
1 |
Concept name + "JavaScript" present |
| 4 |
Promises specific value |
1 |
Lists what reader will learn |
Description Formula:
[Action word] [what it is] in JavaScript. [Specific things they'll learn]: [topic 1], [topic 2], and [topic 3].
Good Examples:
| Concept |
Description |
| Closures |
"Learn JavaScript closures and how functions remember their scope. Covers lexical scoping, practical use cases, memory considerations, and common closure patterns." (159 chars) |
| Event Loop |
"Discover how the JavaScript event loop manages async code execution. Understand the call stack, task queue, microtasks, and why JavaScript is single-threaded but non-blocking." (176 chars - trim!) |
| DOM |
"Learn how the DOM works in JavaScript. Understand how browsers represent HTML as a tree, select and manipulate elements, traverse nodes, and optimize rendering." (162 chars) |
Bad Examples:
| Issue |
Bad Description |
Fix |
| Too short |
"Learn about closures" |
Expand to 150-160 chars with specifics |
| Starts with "Master" |
"Master JavaScript closures..." |
"Learn JavaScript closures..." |
| Too vague |
"A guide to closures" |
List specific topics covered |
| Missing keyword |
"Functions can remember things" |
Include "closures" and "JavaScript" |
Keyword Placement Checklist (5 points)
| # |
Check |
Points |
How to Verify |
| 1 |
Primary keyword in title |
1 |
Check frontmatter title |
| 2 |
Primary keyword in meta description |
1 |
Check frontmatter description |
| 3 |
Primary keyword in first 100 words |
1 |
Check opening paragraphs |
| 4 |
Keyword in at least one H2 heading |
1 |
Scan all ## headings |
| 5 |
No keyword stuffing |
1 |
Content reads naturally |
Keyword Placement Map:
┌─────────────────────────────────────────────────────────────────────────┐
│ KEYWORD PLACEMENT │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 🔴 CRITICAL (Must have keyword) │
│ ───────────────────────────────── │
│ • title frontmatter │
│ • description frontmatter │
│ • First paragraph (within 100 words) │
│ • At least one H2 heading │
│ │
│ 🟡 RECOMMENDED (Include naturally) │
│ ────────────────────────────────── │
│ • "What you'll learn" Info box │
│ • H3 subheadings │
│ • Key Takeaways section │
│ • First sentence after major H2s │
│ │
│ ⚠️ AVOID │
│ ───────── │
│ • Same phrase >4 times per 1000 words │
│ • Forcing keywords where pronouns work better │
│ • Awkward sentence structures to fit keywords │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Content Structure Checklist (6 points)
| # |
Check |
Points |
How to Verify |
| 1 |
Opens with question hook |
1 |
First paragraph asks engaging question |
| 2 |
Code example in first 200 words |
1 |
Simple example appears early |
| 3 |
"What you'll learn" Info box |
1 |
<Info> component after opening |
| 4 |
Short paragraphs (2-4 sentences) |
1 |
Scan content for long blocks |
| 5 |
1,500+ words |
1 |
Word count check |
| 6 |
Key terms bolded on first mention |
1 |
Important terms use **bold** |
Content Structure Template:
┌─────────────────────────────────────────────────────────────────────────┐
│ IDEAL PAGE STRUCTURE │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. QUESTION HOOK (First 50 words) │
│ "How does JavaScript...? Why do...?" │
│ │
│ 2. BRIEF ANSWER + CODE EXAMPLE (Words 50-200) │
│ Quick explanation + simple code demo │
│ │
│ 3. "WHAT YOU'LL LEARN" INFO BOX │
│ 5-7 bullet points │
│ │
│ 4. PREREQUISITES WARNING (if applicable) │
│ Link to required prior concepts │
│ │
│ 5. MAIN CONTENT SECTIONS (H2s) │
│ Each H2 answers a question or teaches a concept │
│ Include code examples, diagrams, tables │
│ │
│ 6. COMMON MISTAKES / GOTCHAS SECTION │
│ What trips people up │
│ │
│ 7. KEY TAKEAWAYS │
│ 8-10 numbered points summarizing everything │
│ │
│ 8. TEST YOUR KNOWLEDGE │
│ 5-6 Q&A accordions │
│ │
│ 9. RELATED CONCEPTS │
│ 4 cards linking to related topics │
│ │
│ 10. RESOURCES (Reference, Articles, Videos) │
│ MDN links, curated articles, videos │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Featured Snippet Checklist (4 points)
| # |
Check |
Points |
How to Verify |
| 1 |
"What is X" has 40-60 word definition |
1 |
Count words in first paragraph after "What is" H2 |
| 2 |
At least one H2 is phrased as question |
1 |
Check for "What is", "How does", "Why" H2s |
| 3 |
Numbered steps for "How to" content |
1 |
Uses <Steps> component or numbered list |
| 4 |
Comparison tables (if applicable) |
1 |
Tables for "X vs Y" content |
Featured Snippet Patterns:
┌─────────────────────────────────────────────────────────────────────────┐
│ FEATURED SNIPPET FORMATS │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ QUERY TYPE WINNING FORMAT YOUR CONTENT │
│ ─────────── ────────────── ──────────── │
│ │
│ "What is X" Paragraph 40-60 word definition │
│ after H2, bold keyword │
│ │
│ "How to X" Numbered list <Steps> component or │
│ 1. 2. 3. markdown │
│ │
│ "X vs Y" Table | Feature | X | Y | │
│ comparison table │
│ │
│ "Types of X" Bullet list - **Type 1** — desc │
│ - **Type 2** — desc │
│ │
│ "[X] examples" Code block ```javascript │
│ + explanation // example code │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Definition Paragraph Example (40-60 words):
## What is a Closure in JavaScript?
A **closure** is a function that retains access to variables from its outer
(enclosing) scope, even after that outer function has finished executing.
Closures are created every time a function is created in JavaScript, allowing
inner functions to "remember" and access their lexical environment.
(This is 52 words - perfect for a featured snippet)
Internal Linking Checklist (4 points)
| # |
Check |
Points |
How to Verify |
| 1 |
3-5 related concepts linked in body |
1 |
Count /concepts/ links in prose |
| 2 |
Descriptive anchor text |
1 |
No "click here", "here", "this" |
| 3 |
Prerequisites in Warning box |
1 |
<Warning> with links at start |
| 4 |
Related Concepts section has 4 cards |
1 |
<CardGroup> at end with 4 Cards |
Good Anchor Text:
| ❌ Bad |
✓ Good |
| "click here" |
"event loop concept" |
| "here" |
"JavaScript closures" |
| "this article" |
"our Promises guide" |
| "read more" |
"understanding the call stack" |
Link Placement Strategy:
<!-- In Prerequisites (Warning box) -->
<Warning>
**Prerequisite:** This guide assumes you understand [Promises](/concepts/promises)
and the [Event Loop](/concepts/event-loop). Read those first if needed.
</Warning>
<!-- In Body Content (natural context) -->
When the callback finishes, it's added to the task queue — managed by
the [event loop](/concepts/event-loop).
<!-- In Related Concepts Section -->
<CardGroup cols={2}>
<Card title="Promises" icon="handshake" href="/concepts/promises">
async/await is built on top of Promises
</Card>
</CardGroup>
Technical SEO Checklist (3 points)
| # |
Check |
Points |
How to Verify |
| 1 |
Single H1 per page |
1 |
Only one # heading (the title) |
| 2 |
URL slug contains keyword |
1 |
/concepts/closures not /concepts/topic-1 |
| 3 |
No orphan pages |
1 |
Page is linked from at least one other page |
H1 Rule:
Every page should have exactly ONE H1 (your main title). This is critical for SEO:
- The H1 tells Google what the page is about
- Multiple H1s confuse search engines about page hierarchy
- All other headings should be H2 (
##) and below
- The H1 should contain your primary keyword
# Closures in JavaScript ← This is your H1 (only one!)
## What is a Closure? ← H2 for sections
### Lexical Scope ← H3 for subsections
## How Closures Work ← Another H2
URL/Slug Best Practices:
| ✅ Good |
❌ Bad |
/concepts/closures |
/concepts/c1 |
/concepts/event-loop |
/concepts/topic-7 |
/concepts/type-coercion |
/concepts/abc123 |
/concepts/async-await |
/concepts/async_await |
Rules for slugs:
- Include primary keyword — The concept name should be in the URL
- Use hyphens, not underscores —
event-loop not event_loop
- Keep slugs short and readable — Under 50 characters
- No UUIDs, database IDs, or random strings
- Lowercase only —
/concepts/Event-Loop should be /concepts/event-loop
Orphan Page Detection:
An orphan page has no internal links pointing to it from other pages. This hurts SEO because:
- Google may not discover or crawl it frequently
- It signals the page isn't important to your site structure
- Users can't navigate to it naturally
- Link equity doesn't flow to the page
How to check for orphan pages:
- Search the codebase for links to this concept:
grep -r "/concepts/[slug]" docs/
- Verify it appears in at least one other concept's "Related Concepts" section
- Check that pages listing it as a prerequisite link back appropriately
- Ensure it's included in the navigation (
docs.json)
Fixing orphan pages:
- Add the concept to related pages' "Related Concepts" CardGroup
- Link to it naturally in body content of related concepts
- Ensure bidirectional linking (if A links to B, B should link back to A where relevant)
Scoring System
Total Points Available: 30
| Category |
Max Points |
| Title Tag |
4 |
| Meta Description |
4 |
| Keyword Placement |
5 |
| Content Structure |
6 |
| Featured Snippets |
4 |
| Internal Linking |
4 |
| Technical SEO |
3 |
| Total |
30 |
Score Interpretation
| Score |
Percentage |
Status |
Action |
| 27-30 |
90-100% |
✅ Excellent |
Ready to publish |
| 23-26 |
75-89% |
⚠️ Good |
Minor optimizations needed |
| 17-22 |
55-74% |
⚠️ Fair |
Several improvements needed |
| 0-16 |
<55% |
❌ Poor |
Significant work required |
Common SEO Issues and Fixes
Title Tag Issues
| Issue |
Current |
Fix |
| Too short (<50 chars) |
"Closures" (8) |
"Closures: How Functions Remember Their Scope in JavaScript" (58) |
| Too long (>60 chars) |
"Understanding JavaScript Closures and How They Work with Examples" (66) |
"Closures: How Functions Remember Their Scope in JavaScript" (58) |
| Missing keyword |
"Understanding Scope" |
Add concept name: "Closures: Understanding Scope in JavaScript" |
| No hook |
"JavaScript Closures" |
Add benefit: "Closures: How Functions Remember Their Scope in JavaScript" |
| Missing "JavaScript" |
"Closures Explained" |
Add at end: "Closures Explained in JavaScript" |
Meta Description Issues
| Issue |
Current |
Fix |
| Too short (<120 chars) |
"Learn about closures" (20) |
Expand with specifics to 150-160 chars |
| Too long (>160 chars) |
[Gets truncated] |
Edit ruthlessly, keep key information |
| Starts with "Master" |
"Master JavaScript closures..." |
"Learn JavaScript closures..." |
| No keyword |
"Functions that remember" |
Include "closures" and "JavaScript" |
| Too vague |
"A guide to closures" |
List specific topics: "Covers X, Y, and Z" |
Content Structure Issues
| Issue |
Fix |
| No question hook |
Start with "How does...?" or "Why...?" |
| Code example too late |
Move simple example to first 200 words |
| Missing Info box |
Add <Info> with "What you'll learn" |
| Long paragraphs |
Break into 2-4 sentence chunks |
| Under 1,500 words |
Add more depth, examples, edge cases |
| No bolded terms |
Bold key concepts on first mention |
Featured Snippet Issues
| Issue |
Fix |
| No "What is" definition |
Add 40-60 word definition paragraph |
| Definition too long |
Tighten to 40-60 words |
| No question H2s |
Add "What is X?" or "How does X work?" H2 |
| Steps not numbered |
Use <Steps> or numbered markdown |
| No comparison tables |
Add table for "X vs Y" sections |
Internal Linking Issues
| Issue |
Fix |
| No internal links |
Add 3-5 links to related concepts |
| Bad anchor text |
Replace "click here" with descriptive text |
| No prerequisites |
Add <Warning> with prerequisite links |
| Empty Related Concepts |
Add 4 Cards linking to related topics |
Technical SEO Issues
| Issue |
Fix |
| Multiple H1 tags |
Keep only one # heading (the title), use ## for all sections |
| Slug missing keyword |
Rename file to include concept name (e.g., closures.mdx) |
| Orphan page |
Add links from related concept pages' body or Related Concepts section |
| Underscore in slug |
Use hyphens: event-loop.mdx not event_loop.mdx |
| Uppercase in slug |
Use lowercase only: async-await.mdx not Async-Await.mdx |
| Slug too long |
Shorten to primary keyword: closures.mdx not understanding-javascript-closures-and-scope.mdx |
SEO Audit Report Template
Use this template to document your findings.
# SEO Audit Report: [Concept Name]
**File:** `/docs/concepts/[slug].mdx`
**Date:** YYYY-MM-DD
**Auditor:** [Name/Claude]
**Overall Score:** XX/30 (XX%)
**Status:** ✅ Excellent | ⚠️ Needs Work | ❌ Poor
---
## Score Summary
| Category | Score | Status |
|----------|-------|--------|
| Title Tag | X/4 | ✅/⚠️/❌ |
| Meta Description | X/4 | ✅/⚠️/❌ |
| Keyword Placement | X/5 | ✅/⚠️/❌ |
| Content Structure | X/6 | ✅/⚠️/❌ |
| Featured Snippets | X/4 | ✅/⚠️/❌ |
| Internal Linking | X/4 | ✅/⚠️/❌ |
| Technical SEO | X/3 | ✅/⚠️/❌ |
| **Total** | **X/30** | **STATUS** |
---
## Target Keywords
**Primary Keyword:** [e.g., "JavaScript closures"]
**Secondary Keywords:**
- [keyword 1]
- [keyword 2]
- [keyword 3]
**Search Intent:** Informational / How-to / Comparison
---
## Title Tag Analysis
**Current Title:** "[current title from frontmatter]"
**Character Count:** XX characters
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| Length 50-60 chars | ✅/❌ | XX characters |
| Primary keyword in first half | ✅/❌ | [notes] |
| Ends with "in JavaScript" | ✅/❌ | [notes] |
| Contains compelling hook | ✅/❌ | [notes] |
**Issues Found:** [if any]
**Recommended Title:** "[suggested title]" (XX chars)
---
## Meta Description Analysis
**Current Description:** "[current description from frontmatter]"
**Character Count:** XX characters
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| Length 150-160 chars | ✅/❌ | XX characters |
| Starts with action word | ✅/❌ | Starts with "[word]" |
| Contains primary keyword | ✅/❌ | [notes] |
| Promises specific value | ✅/❌ | [notes] |
**Issues Found:** [if any]
**Recommended Description:** "[suggested description]" (XX chars)
---
## Keyword Placement Analysis
**Score:** X/5
| Location | Present | Notes |
|----------|---------|-------|
| Title | ✅/❌ | [notes] |
| Meta description | ✅/❌ | [notes] |
| First 100 words | ✅/❌ | Found at word XX |
| H2 heading | ✅/❌ | Found in: "[H2 text]" |
| Natural reading | ✅/❌ | [no stuffing / stuffing detected] |
**Missing Keyword Placements:**
- [ ] [Location where keyword should be added]
---
## Content Structure Analysis
**Word Count:** X,XXX words
**Score:** X/6
| Check | Status | Notes |
|-------|--------|-------|
| Question hook opening | ✅/❌ | [notes] |
| Code in first 200 words | ✅/❌ | Code appears at word XX |
| "What you'll learn" box | ✅/❌ | [present/missing] |
| Short paragraphs | ✅/❌ | [notes on paragraph length] |
| 1,500+ words | ✅/❌ | X,XXX words |
| Bolded key terms | ✅/❌ | [notes] |
**Structure Issues:**
- [ ] [Issue and recommendation]
---
## Featured Snippet Analysis
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| 40-60 word definition | ✅/❌ | Currently XX words |
| Question-format H2 | ✅/❌ | Found: "[H2]" / Not found |
| Numbered steps | ✅/❌ | [notes] |
| Comparison tables | ✅/❌/N/A | [notes] |
**Snippet Opportunities:**
1. **"What is [concept]" snippet:**
- Current definition: XX words
- Action: [Expand to/Trim to] 40-60 words
2. **"How to [action]" snippet:**
- Action: [Add Steps component / Already present]
---
## Internal Linking Analysis
**Score:** X/4
| Check | Status | Notes |
|-------|--------|-------|
| 3-5 internal links in body | ✅/❌ | Found X links |
| Descriptive anchor text | ✅/❌ | [notes] |
| Prerequisites in Warning | ✅/❌ | [present/missing] |
| Related Concepts section | ✅/❌ | X cards present |
**Current Internal Links:**
1. [Anchor text] → `/concepts/[slug]`
2. [Anchor text] → `/concepts/[slug]`
**Recommended Links to Add:**
- Link to [concept] in [section/context]
- Link to [concept] in [section/context]
**Bad Anchor Text Found:**
- Line XX: "click here" → change to "[descriptive text]"
---
## Technical SEO Analysis
**Score:** X/3
| Check | Status | Notes |
|-------|--------|-------|
| Single H1 per page | ✅/❌ | [Found X H1 tags] |
| URL slug contains keyword | ✅/❌ | Current: `/concepts/[slug]` |
| Not an orphan page | ✅/❌ | Linked from X other pages |
**H1 Tags Found:**
- Line XX: `# [H1 text]` ← Should be the only one
- [List any additional H1s that need to be changed to H2]
**Slug Analysis:**
- Current slug: `[slug].mdx`
- Contains keyword: ✅/❌
- Format correct: ✅/❌ (lowercase, hyphens, no special chars)
**Incoming Links Found:**
1. `/concepts/[other-concept]` → Links to this page in [section]
2. `/concepts/[other-concept]` → Links in Related Concepts
**If orphan page, add links from:**
- [Suggested concept page] in [section]
- [Suggested concept page] in Related Concepts
---
## Priority Fixes
### High Priority (Do First)
1. **[Issue]**
- Current: [what it is now]
- Recommended: [what it should be]
- Impact: [why this matters]
2. **[Issue]**
- Current: [what it is now]
- Recommended: [what it should be]
- Impact: [why this matters]
### Medium Priority
1. **[Issue]**
- Recommendation: [fix]
### Low Priority (Nice to Have)
1. **[Issue]**
- Recommendation: [fix]
---
## Competitive Analysis (Optional)
**Top-Ranking Pages for "[primary keyword]":**
1. **[Competitor 1 - URL]**
- What they do well: [observation]
- Word count: ~X,XXX
2. **[Competitor 2 - URL]**
- What they do well: [observation]
- Word count: ~X,XXX
**Our Advantages:**
- [What we do better]
**Gaps to Fill:**
- [What we're missing that competitors have]
---
## Implementation Checklist
After making fixes, verify:
- [ ] Title is 50-60 characters with keyword and hook
- [ ] Description is 150-160 characters with action word and value
- [ ] Primary keyword in title, description, first 100 words, and H2
- [ ] Opens with question hook
- [ ] Code example in first 200 words
- [ ] "What you'll learn" Info box present
- [ ] Paragraphs are 2-4 sentences
- [ ] 1,500+ words total
- [ ] Key terms bolded on first mention
- [ ] 40-60 word definition for featured snippet
- [ ] At least one question-format H2
- [ ] 3-5 internal links with descriptive anchor text
- [ ] Prerequisites in Warning box (if applicable)
- [ ] Related Concepts section has 4 cards
- [ ] Single H1 per page (title only)
- [ ] URL slug contains primary keyword
- [ ] Page linked from at least one other concept page
- [ ] All fixes implemented and verified
---
## Final Recommendation
**Ready to Publish:** ✅ Yes / ❌ No - [reason]
**Next Review Date:** [When to re-audit, e.g., "3 months" or "after major update"]
Quick Reference
Character Counts
| Element |
Ideal Length |
| Title |
50-60 characters |
| Meta Description |
150-160 characters |
| Definition paragraph |
40-60 words |
Keyword Density
- Don't exceed 3-4 mentions of exact phrase per 1,000 words
- Use variations naturally (e.g., "closures", "closure", "JavaScript closures")
Content Length
| Length |
Assessment |
| <1,000 words |
Too thin - add depth |
| 1,000-1,500 |
Minimum viable |
| 1,500-2,500 |
Good |
| 2,500-4,000 |
Excellent |
| >4,000 |
Consider splitting |
Summary
When auditing a concept page for SEO:
- Identify target keywords using the keyword cluster for that concept
- Check title tag — 50-60 chars, keyword first, hook, ends with "JavaScript"
- Check meta description — 150-160 chars, action word, keyword, specific value
- Verify keyword placement — Title, description, first 100 words, H2
- Audit content structure — Question hook, early code, Info box, short paragraphs
- Optimize for featured snippets — 40-60 word definitions, numbered steps, tables
- Check internal linking — 3-5 links, good anchors, Related Concepts section
- Generate report — Document score, issues, and prioritized fixes
Remember: SEO isn't about gaming search engines — it's about making content easy to find for developers who need it. Every optimization should also improve the reader experience.
1---2name: seo-review3description: Perform a focused SEO audit on JavaScript concept pages to maximize search visibility, featured snippet optimization, and ranking potential4---5
6# Skill: SEO Audit for Concept Pages
7
8Use this skill to perform a focused SEO audit on concept documentation pages for the 33 JavaScript Concepts project. The goal is to maximize search visibility for JavaScript developers.
9
10## When to Use
11
12- Before publishing a new concept page
13- When optimizing underperforming pages
14- Periodic content audits
15- After major content updates
16- When targeting new keywords
17
18## Goal
19
20Each concept page should rank for searches like:
21- "what is [concept] in JavaScript"
22- "how does [concept] work in JavaScript"
23- "[concept] JavaScript explained"
24- "[concept] JavaScript tutorial"
25- "[concept] JavaScript example"
26
27---
28
29## SEO Audit Methodology
30
31Follow these five steps for a complete SEO audit.
32
33### Step 1: Identify Target Keywords
34
35Before auditing, identify the keyword cluster for the concept.
36
37#### Keyword Cluster Template
38
39| Type | Pattern | Example (Closures) |
40|------|---------|-------------------|
41| **Primary** | [concept] JavaScript | closures JavaScript |
42| **What is** | what is [concept] in JavaScript | what is a closure in JavaScript |
43| **How does** | how does [concept] work | how do closures work |
44| **How to** | how to use/create [concept] | how to use closures |
45| **Why** | why use [concept] | why use closures JavaScript |
46| **Examples** | [concept] examples | closure examples JavaScript |
47| **vs** | [concept] vs [related] | closures vs scope |
48| **Interview** | [concept] interview questions | closure interview questions |
49
50### Step 2: On-Page SEO Audit
51
52Check all on-page SEO elements systematically.
53
54### Step 3: Featured Snippet Optimization
55
56Verify content is structured to win featured snippets.
57
58### Step 4: Internal Linking Audit
59
60Check the internal link structure.
61
62### Step 5: Generate Report
63
64Document findings using the report template.
65
66---
67
68## Keyword Clusters by Concept
69
70Use these pre-built keyword clusters for each concept.
71
72<AccordionGroup>
73 <Accordion title="Call Stack">
74 | Type | Keywords |
75 |------|----------|
76 | Primary | JavaScript call stack, call stack JavaScript |
77 | What is | what is the call stack in JavaScript |
78 | How does | how does the call stack work |
79 | Error | maximum call stack size exceeded, stack overflow JavaScript |
80 | Visual | call stack visualization, call stack explained |
81 | Interview | call stack interview questions JavaScript |
82 </Accordion>
83
84 <Accordion title="Primitive Types">
85 | Type | Keywords |
86 |------|----------|
87 | Primary | JavaScript primitive types, primitives in JavaScript |
88 | What are | what are primitive types in JavaScript |
89 | List | JavaScript data types, types in JavaScript |
90 | vs | primitives vs objects JavaScript |
91 | typeof | typeof JavaScript, JavaScript typeof operator |
92 | Interview | JavaScript types interview questions |
93 </Accordion>
94
95 <Accordion title="Value vs Reference Types">
96 | Type | Keywords |
97 |------|----------|
98 | Primary | JavaScript value vs reference, pass by reference JavaScript |
99 | What is | what is pass by value in JavaScript |
100 | How does | how does JavaScript pass objects |
101 | Comparison | value types vs reference types JavaScript |
102 | Copy | how to copy objects JavaScript, deep copy JavaScript |
103 </Accordion>
104
105 <Accordion title="Type Coercion">
106 | Type | Keywords |
107 |------|----------|
108 | Primary | JavaScript type coercion, type conversion JavaScript |
109 | What is | what is type coercion in JavaScript |
110 | How does | how does type coercion work |
111 | Implicit | implicit type conversion JavaScript |
112 | Explicit | explicit type conversion JavaScript |
113 | Interview | type coercion interview questions |
114 </Accordion>
115
116 <Accordion title="Equality Operators">
117 | Type | Keywords |
118 |------|----------|
119 | Primary | JavaScript equality, == vs === JavaScript |
120 | What is | what is the difference between == and === |
121 | Comparison | loose equality vs strict equality JavaScript |
122 | Best practice | when to use == vs === |
123 | Interview | JavaScript equality interview questions |
124 </Accordion>
125
126 <Accordion title="Scope and Closures">
127 | Type | Keywords |
128 |------|----------|
129 | Primary | JavaScript closures, JavaScript scope |
130 | What is | what is a closure in JavaScript, what is scope |
131 | How does | how do closures work, how does scope work |
132 | Types | types of scope JavaScript, lexical scope |
133 | Use cases | closure use cases, why use closures |
134 | Interview | closure interview questions JavaScript |
135 </Accordion>
136
137 <Accordion title="Event Loop">
138 | Type | Keywords |
139 |------|----------|
140 | Primary | JavaScript event loop, event loop JavaScript |
141 | What is | what is the event loop in JavaScript |
142 | How does | how does the event loop work |
143 | Visual | event loop visualization, event loop explained |
144 | Related | call stack event loop, task queue JavaScript |
145 | Interview | event loop interview questions |
146 </Accordion>
147
148 <Accordion title="Promises">
149 | Type | Keywords |
150 |------|----------|
151 | Primary | JavaScript Promises, Promises in JavaScript |
152 | What is | what is a Promise in JavaScript |
153 | How to | how to use Promises, how to chain Promises |
154 | Methods | Promise.all, Promise.race, Promise.allSettled |
155 | Error | Promise error handling, Promise catch |
156 | vs | Promises vs callbacks, Promises vs async await |
157 </Accordion>
158
159 <Accordion title="async/await">
160 | Type | Keywords |
161 |------|----------|
162 | Primary | JavaScript async await, async await JavaScript |
163 | What is | what is async await in JavaScript |
164 | How to | how to use async await, async await tutorial |
165 | Error | async await error handling, try catch async |
166 | vs | async await vs Promises |
167 | Interview | async await interview questions |
168 </Accordion>
169
170 <Accordion title="this Keyword">
171 | Type | Keywords |
172 |------|----------|
173 | Primary | JavaScript this keyword, this in JavaScript |
174 | What is | what is this in JavaScript |
175 | How does | how does this work in JavaScript |
176 | Binding | call apply bind JavaScript, this binding |
177 | Arrow | this in arrow functions |
178 | Interview | this keyword interview questions |
179 </Accordion>
180
181 <Accordion title="Prototypes">
182 | Type | Keywords |
183 |------|----------|
184 | Primary | JavaScript prototype, prototype chain JavaScript |
185 | What is | what is a prototype in JavaScript |
186 | How does | how does prototype inheritance work |
187 | Chain | prototype chain explained |
188 | vs | prototype vs class JavaScript |
189 | Interview | prototype interview questions JavaScript |
190 </Accordion>
191
192 <Accordion title="DOM">
193 | Type | Keywords |
194 |------|----------|
195 | Primary | JavaScript DOM, DOM manipulation JavaScript |
196 | What is | what is the DOM in JavaScript |
197 | How to | how to manipulate DOM JavaScript |
198 | Methods | getElementById, querySelector JavaScript |
199 | Events | DOM events JavaScript, event listeners |
200 | Performance | DOM performance, virtual DOM vs DOM |
201 </Accordion>
202
203 <Accordion title="Higher-Order Functions">
204 | Type | Keywords |
205 |------|----------|
206 | Primary | JavaScript higher order functions, higher order functions |
207 | What are | what are higher order functions |
208 | Examples | map filter reduce JavaScript |
209 | How to | how to use higher order functions |
210 | Interview | higher order functions interview |
211 </Accordion>
212
213 <Accordion title="Recursion">
214 | Type | Keywords |
215 |------|----------|
216 | Primary | JavaScript recursion, recursion in JavaScript |
217 | What is | what is recursion in JavaScript |
218 | How to | how to write recursive functions |
219 | Examples | recursion examples JavaScript |
220 | vs | recursion vs iteration JavaScript |
221 | Interview | recursion interview questions |
222 </Accordion>
223</AccordionGroup>
224
225---
226
227## Audit Checklists
228
229### Title Tag Checklist (4 points)
230
231| # | Check | Points | How to Verify |
232|---|-------|--------|---------------|
233| 1 | Length 50-60 characters | 1 | Count characters in `title` frontmatter |
234| 2 | Primary keyword in first half | 1 | Concept name appears early |
235| 3 | Ends with "in JavaScript" | 1 | Check title ending |
236| 4 | Contains compelling hook | 1 | Promises value/benefit to reader |
237
238**Scoring:**
239- 4/4: ✅ Excellent
240- 3/4: ⚠️ Good, minor improvements possible
241- 0-2/4: ❌ Needs significant work
242
243**Title Formula:**
244```
245[Concept]: [What You'll Understand] in JavaScript
246```
247
248**Good Examples:**
249| Concept | Title (with character count) |
250|---------|------------------------------|
251| Closures | "Closures: How Functions Remember Their Scope in JavaScript" (58 chars) |
252| Event Loop | "Event Loop: How Async Code Actually Runs in JavaScript" (54 chars) |
253| Promises | "Promises: Handling Async Operations in JavaScript" (49 chars) |
254| DOM | "DOM: How Browsers Represent Web Pages in JavaScript" (51 chars) |
255
256**Bad Examples:**
257| Issue | Bad Title | Better Title |
258|-------|-----------|--------------|
259| Too short | "Closures" | "Closures: How Functions Remember Their Scope in JavaScript" |
260| Too long | "Understanding JavaScript Closures and How They Work with Examples" (66 chars) | "Closures: How Functions Remember Their Scope in JavaScript" (58 chars) |
261| No hook | "JavaScript Closures" | "Closures: How Functions Remember Their Scope in JavaScript" |
262| Missing "JavaScript" | "Understanding Closures and Scope" | Add "in JavaScript" at end |
263
264---
265
266### Meta Description Checklist (4 points)
267
268| # | Check | Points | How to Verify |
269|---|-------|--------|---------------|
270| 1 | Length 150-160 characters | 1 | Count characters in `description` frontmatter |
271| 2 | Starts with action word | 1 | "Learn", "Understand", "Discover" (NOT "Master") |
272| 3 | Contains primary keyword | 1 | Concept name + "JavaScript" present |
273| 4 | Promises specific value | 1 | Lists what reader will learn |
274
275**Description Formula:**
276```
277[Action word] [what it is] in JavaScript. [Specific things they'll learn]: [topic 1], [topic 2], and [topic 3].
278```
279
280**Good Examples:**
281
282| Concept | Description |
283|---------|-------------|
284| Closures | "Learn JavaScript closures and how functions remember their scope. Covers lexical scoping, practical use cases, memory considerations, and common closure patterns." (159 chars) |
285| Event Loop | "Discover how the JavaScript event loop manages async code execution. Understand the call stack, task queue, microtasks, and why JavaScript is single-threaded but non-blocking." (176 chars - trim!) |
286| DOM | "Learn how the DOM works in JavaScript. Understand how browsers represent HTML as a tree, select and manipulate elements, traverse nodes, and optimize rendering." (162 chars) |
287
288**Bad Examples:**
289
290| Issue | Bad Description | Fix |
291|-------|-----------------|-----|
292| Too short | "Learn about closures" | Expand to 150-160 chars with specifics |
293| Starts with "Master" | "Master JavaScript closures..." | "Learn JavaScript closures..." |
294| Too vague | "A guide to closures" | List specific topics covered |
295| Missing keyword | "Functions can remember things" | Include "closures" and "JavaScript" |
296
297---
298
299### Keyword Placement Checklist (5 points)
300
301| # | Check | Points | How to Verify |
302|---|-------|--------|---------------|
303| 1 | Primary keyword in title | 1 | Check frontmatter `title` |
304| 2 | Primary keyword in meta description | 1 | Check frontmatter `description` |
305| 3 | Primary keyword in first 100 words | 1 | Check opening paragraphs |
306| 4 | Keyword in at least one H2 heading | 1 | Scan all `##` headings |
307| 5 | No keyword stuffing | 1 | Content reads naturally |
308
309**Keyword Placement Map:**
310
311```
312┌─────────────────────────────────────────────────────────────────────────┐
313│ KEYWORD PLACEMENT │
314├─────────────────────────────────────────────────────────────────────────┤
315│ │
316│ 🔴 CRITICAL (Must have keyword) │
317│ ───────────────────────────────── │
318│ • title frontmatter │
319│ • description frontmatter │
320│ • First paragraph (within 100 words) │
321│ • At least one H2 heading │
322│ │
323│ 🟡 RECOMMENDED (Include naturally) │
324│ ────────────────────────────────── │
325│ • "What you'll learn" Info box │
326│ • H3 subheadings │
327│ • Key Takeaways section │
328│ • First sentence after major H2s │
329│ │
330│ ⚠️ AVOID │
331│ ───────── │
332│ • Same phrase >4 times per 1000 words │
333│ • Forcing keywords where pronouns work better │
334│ • Awkward sentence structures to fit keywords │
335│ │
336└─────────────────────────────────────────────────────────────────────────┘
337```
338
339---
340
341### Content Structure Checklist (6 points)
342
343| # | Check | Points | How to Verify |
344|---|-------|--------|---------------|
345| 1 | Opens with question hook | 1 | First paragraph asks engaging question |
346| 2 | Code example in first 200 words | 1 | Simple example appears early |
347| 3 | "What you'll learn" Info box | 1 | `<Info>` component after opening |
348| 4 | Short paragraphs (2-4 sentences) | 1 | Scan content for long blocks |
349| 5 | 1,500+ words | 1 | Word count check |
350| 6 | Key terms bolded on first mention | 1 | Important terms use `**bold**` |
351
352**Content Structure Template:**
353
354```
355┌─────────────────────────────────────────────────────────────────────────┐
356│ IDEAL PAGE STRUCTURE │
357├─────────────────────────────────────────────────────────────────────────┤
358│ │
359│ 1. QUESTION HOOK (First 50 words) │
360│ "How does JavaScript...? Why do...?" │
361│ │
362│ 2. BRIEF ANSWER + CODE EXAMPLE (Words 50-200) │
363│ Quick explanation + simple code demo │
364│ │
365│ 3. "WHAT YOU'LL LEARN" INFO BOX │
366│ 5-7 bullet points │
367│ │
368│ 4. PREREQUISITES WARNING (if applicable) │
369│ Link to required prior concepts │
370│ │
371│ 5. MAIN CONTENT SECTIONS (H2s) │
372│ Each H2 answers a question or teaches a concept │
373│ Include code examples, diagrams, tables │
374│ │
375│ 6. COMMON MISTAKES / GOTCHAS SECTION │
376│ What trips people up │
377│ │
378│ 7. KEY TAKEAWAYS │
379│ 8-10 numbered points summarizing everything │
380│ │
381│ 8. TEST YOUR KNOWLEDGE │
382│ 5-6 Q&A accordions │
383│ │
384│ 9. RELATED CONCEPTS │
385│ 4 cards linking to related topics │
386│ │
387│ 10. RESOURCES (Reference, Articles, Videos) │
388│ MDN links, curated articles, videos │
389│ │
390└─────────────────────────────────────────────────────────────────────────┘
391```
392
393---
394
395### Featured Snippet Checklist (4 points)
396
397| # | Check | Points | How to Verify |
398|---|-------|--------|---------------|
399| 1 | "What is X" has 40-60 word definition | 1 | Count words in first paragraph after "What is" H2 |
400| 2 | At least one H2 is phrased as question | 1 | Check for "What is", "How does", "Why" H2s |
401| 3 | Numbered steps for "How to" content | 1 | Uses `<Steps>` component or numbered list |
402| 4 | Comparison tables (if applicable) | 1 | Tables for "X vs Y" content |
403
404**Featured Snippet Patterns:**
405
406```
407┌─────────────────────────────────────────────────────────────────────────┐
408│ FEATURED SNIPPET FORMATS │
409├─────────────────────────────────────────────────────────────────────────┤
410│ │
411│ QUERY TYPE WINNING FORMAT YOUR CONTENT │
412│ ─────────── ────────────── ──────────── │
413│ │
414│ "What is X" Paragraph 40-60 word definition │
415│ after H2, bold keyword │
416│ │
417│ "How to X" Numbered list <Steps> component or │
418│ 1. 2. 3. markdown │
419│ │
420│ "X vs Y" Table | Feature | X | Y | │
421│ comparison table │
422│ │
423│ "Types of X" Bullet list - **Type 1** — desc │
424│ - **Type 2** — desc │
425│ │
426│ "[X] examples" Code block ```javascript │
427│ + explanation // example code │
428│ │
429└─────────────────────────────────────────────────────────────────────────┘
430```
431
432**Definition Paragraph Example (40-60 words):**
433
434```markdown
435## What is a Closure in JavaScript?
436
437A **closure** is a function that retains access to variables from its outer
438(enclosing) scope, even after that outer function has finished executing.
439Closures are created every time a function is created in JavaScript, allowing
440inner functions to "remember" and access their lexical environment.
441```
442
443(This is 52 words - perfect for a featured snippet)
444
445---
446
447### Internal Linking Checklist (4 points)
448
449| # | Check | Points | How to Verify |
450|---|-------|--------|---------------|
451| 1 | 3-5 related concepts linked in body | 1 | Count `/concepts/` links in prose |
452| 2 | Descriptive anchor text | 1 | No "click here", "here", "this" |
453| 3 | Prerequisites in Warning box | 1 | `<Warning>` with links at start |
454| 4 | Related Concepts section has 4 cards | 1 | `<CardGroup>` at end with 4 Cards |
455
456**Good Anchor Text:**
457
458| ❌ Bad | ✓ Good |
459|--------|--------|
460| "click here" | "event loop concept" |
461| "here" | "JavaScript closures" |
462| "this article" | "our Promises guide" |
463| "read more" | "understanding the call stack" |
464
465**Link Placement Strategy:**
466
467```markdown
468<!-- In Prerequisites (Warning box) -->
469<Warning>
470**Prerequisite:** This guide assumes you understand [Promises](/concepts/promises)
471and the [Event Loop](/concepts/event-loop). Read those first if needed.
472</Warning>
473
474<!-- In Body Content (natural context) -->
475When the callback finishes, it's added to the task queue — managed by
476the [event loop](/concepts/event-loop).
477
478<!-- In Related Concepts Section -->
479<CardGroup cols={2}>
480 <Card title="Promises" icon="handshake" href="/concepts/promises">
481 async/await is built on top of Promises
482 </Card>
483</CardGroup>
484```
485
486---
487
488### Technical SEO Checklist (3 points)
489
490| # | Check | Points | How to Verify |
491|---|-------|--------|---------------|
492| 1 | Single H1 per page | 1 | Only one `#` heading (the title) |
493| 2 | URL slug contains keyword | 1 | `/concepts/closures` not `/concepts/topic-1` |
494| 3 | No orphan pages | 1 | Page is linked from at least one other page |
495
496**H1 Rule:**
497
498Every page should have exactly ONE H1 (your main title). This is critical for SEO:
499- The H1 tells Google what the page is about
500- Multiple H1s confuse search engines about page hierarchy
501- All other headings should be H2 (`##`) and below
502- The H1 should contain your primary keyword
503
504```markdown
505# Closures in JavaScript ← This is your H1 (only one!)
506
507## What is a Closure? ← H2 for sections
508### Lexical Scope ← H3 for subsections
509## How Closures Work ← Another H2
510```
511
512**URL/Slug Best Practices:**
513
514| ✅ Good | ❌ Bad |
515|---------|--------|
516| `/concepts/closures` | `/concepts/c1` |
517| `/concepts/event-loop` | `/concepts/topic-7` |
518| `/concepts/type-coercion` | `/concepts/abc123` |
519| `/concepts/async-await` | `/concepts/async_await` |
520
521Rules for slugs:
522- **Include primary keyword** — The concept name should be in the URL
523- **Use hyphens, not underscores** — `event-loop` not `event_loop`
524- **Keep slugs short and readable** — Under 50 characters
525- **No UUIDs, database IDs, or random strings**
526- **Lowercase only** — `/concepts/Event-Loop` should be `/concepts/event-loop`
527
528**Orphan Page Detection:**
529
530An orphan page has no internal links pointing to it from other pages. This hurts SEO because:
531- Google may not discover or crawl it frequently
532- It signals the page isn't important to your site structure
533- Users can't navigate to it naturally
534- Link equity doesn't flow to the page
535
536**How to check for orphan pages:**
5371. Search the codebase for links to this concept: `grep -r "/concepts/[slug]" docs/`
5382. Verify it appears in at least one other concept's "Related Concepts" section
5393. Check that pages listing it as a prerequisite link back appropriately
5404. Ensure it's included in the navigation (`docs.json`)
541
542**Fixing orphan pages:**
543- Add the concept to related pages' "Related Concepts" CardGroup
544- Link to it naturally in body content of related concepts
545- Ensure bidirectional linking (if A links to B, B should link back to A where relevant)
546
547---
548
549## Scoring System
550
551### Total Points Available: 30
552
553| Category | Max Points |
554|----------|------------|
555| Title Tag | 4 |
556| Meta Description | 4 |
557| Keyword Placement | 5 |
558| Content Structure | 6 |
559| Featured Snippets | 4 |
560| Internal Linking | 4 |
561| Technical SEO | 3 |
562| **Total** | **30** |
563
564### Score Interpretation
565
566| Score | Percentage | Status | Action |
567|-------|------------|--------|--------|
568| 27-30 | 90-100% | ✅ Excellent | Ready to publish |
569| 23-26 | 75-89% | ⚠️ Good | Minor optimizations needed |
570| 17-22 | 55-74% | ⚠️ Fair | Several improvements needed |
571| 0-16 | <55% | ❌ Poor | Significant work required |
572
573---
574
575## Common SEO Issues and Fixes
576
577### Title Tag Issues
578
579| Issue | Current | Fix |
580|-------|---------|-----|
581| Too short (<50 chars) | "Closures" (8) | "Closures: How Functions Remember Their Scope in JavaScript" (58) |
582| Too long (>60 chars) | "Understanding JavaScript Closures and How They Work with Examples" (66) | "Closures: How Functions Remember Their Scope in JavaScript" (58) |
583| Missing keyword | "Understanding Scope" | Add concept name: "Closures: Understanding Scope in JavaScript" |
584| No hook | "JavaScript Closures" | Add benefit: "Closures: How Functions Remember Their Scope in JavaScript" |
585| Missing "JavaScript" | "Closures Explained" | Add at end: "Closures Explained in JavaScript" |
586
587### Meta Description Issues
588
589| Issue | Current | Fix |
590|-------|---------|-----|
591| Too short (<120 chars) | "Learn about closures" (20) | Expand with specifics to 150-160 chars |
592| Too long (>160 chars) | [Gets truncated] | Edit ruthlessly, keep key information |
593| Starts with "Master" | "Master JavaScript closures..." | "Learn JavaScript closures..." |
594| No keyword | "Functions that remember" | Include "closures" and "JavaScript" |
595| Too vague | "A guide to closures" | List specific topics: "Covers X, Y, and Z" |
596
597### Content Structure Issues
598
599| Issue | Fix |
600|-------|-----|
601| No question hook | Start with "How does...?" or "Why...?" |
602| Code example too late | Move simple example to first 200 words |
603| Missing Info box | Add `<Info>` with "What you'll learn" |
604| Long paragraphs | Break into 2-4 sentence chunks |
605| Under 1,500 words | Add more depth, examples, edge cases |
606| No bolded terms | Bold key concepts on first mention |
607
608### Featured Snippet Issues
609
610| Issue | Fix |
611|-------|-----|
612| No "What is" definition | Add 40-60 word definition paragraph |
613| Definition too long | Tighten to 40-60 words |
614| No question H2s | Add "What is X?" or "How does X work?" H2 |
615| Steps not numbered | Use `<Steps>` or numbered markdown |
616| No comparison tables | Add table for "X vs Y" sections |
617
618### Internal Linking Issues
619
620| Issue | Fix |
621|-------|-----|
622| No internal links | Add 3-5 links to related concepts |
623| Bad anchor text | Replace "click here" with descriptive text |
624| No prerequisites | Add `<Warning>` with prerequisite links |
625| Empty Related Concepts | Add 4 Cards linking to related topics |
626
627### Technical SEO Issues
628
629| Issue | Fix |
630|-------|-----|
631| Multiple H1 tags | Keep only one `#` heading (the title), use `##` for all sections |
632| Slug missing keyword | Rename file to include concept name (e.g., `closures.mdx`) |
633| Orphan page | Add links from related concept pages' body or Related Concepts section |
634| Underscore in slug | Use hyphens: `event-loop.mdx` not `event_loop.mdx` |
635| Uppercase in slug | Use lowercase only: `async-await.mdx` not `Async-Await.mdx` |
636| Slug too long | Shorten to primary keyword: `closures.mdx` not `understanding-javascript-closures-and-scope.mdx` |
637
638---
639
640## SEO Audit Report Template
641
642Use this template to document your findings.
643
644```markdown
645# SEO Audit Report: [Concept Name]
646
647**File:** `/docs/concepts/[slug].mdx`
648**Date:** YYYY-MM-DD
649**Auditor:** [Name/Claude]
650**Overall Score:** XX/30 (XX%)
651**Status:** ✅ Excellent | ⚠️ Needs Work | ❌ Poor
652
653---
654
655## Score Summary
656
657| Category | Score | Status |
658|----------|-------|--------|
659| Title Tag | X/4 | ✅/⚠️/❌ |
660| Meta Description | X/4 | ✅/⚠️/❌ |
661| Keyword Placement | X/5 | ✅/⚠️/❌ |
662| Content Structure | X/6 | ✅/⚠️/❌ |
663| Featured Snippets | X/4 | ✅/⚠️/❌ |
664| Internal Linking | X/4 | ✅/⚠️/❌ |
665| Technical SEO | X/3 | ✅/⚠️/❌ |
666| **Total** | **X/30** | **STATUS** |
667
668---
669
670## Target Keywords
671
672**Primary Keyword:** [e.g., "JavaScript closures"]
673**Secondary Keywords:**
674- [keyword 1]
675- [keyword 2]
676- [keyword 3]
677
678**Search Intent:** Informational / How-to / Comparison
679
680---
681
682## Title Tag Analysis
683
684**Current Title:** "[current title from frontmatter]"
685**Character Count:** XX characters
686**Score:** X/4
687
688| Check | Status | Notes |
689|-------|--------|-------|
690| Length 50-60 chars | ✅/❌ | XX characters |
691| Primary keyword in first half | ✅/❌ | [notes] |
692| Ends with "in JavaScript" | ✅/❌ | [notes] |
693| Contains compelling hook | ✅/❌ | [notes] |
694
695**Issues Found:** [if any]
696
697**Recommended Title:** "[suggested title]" (XX chars)
698
699---
700
701## Meta Description Analysis
702
703**Current Description:** "[current description from frontmatter]"
704**Character Count:** XX characters
705**Score:** X/4
706
707| Check | Status | Notes |
708|-------|--------|-------|
709| Length 150-160 chars | ✅/❌ | XX characters |
710| Starts with action word | ✅/❌ | Starts with "[word]" |
711| Contains primary keyword | ✅/❌ | [notes] |
712| Promises specific value | ✅/❌ | [notes] |
713
714**Issues Found:** [if any]
715
716**Recommended Description:** "[suggested description]" (XX chars)
717
718---
719
720## Keyword Placement Analysis
721
722**Score:** X/5
723
724| Location | Present | Notes |
725|----------|---------|-------|
726| Title | ✅/❌ | [notes] |
727| Meta description | ✅/❌ | [notes] |
728| First 100 words | ✅/❌ | Found at word XX |
729| H2 heading | ✅/❌ | Found in: "[H2 text]" |
730| Natural reading | ✅/❌ | [no stuffing / stuffing detected] |
731
732**Missing Keyword Placements:**
733- [ ] [Location where keyword should be added]
734
735---
736
737## Content Structure Analysis
738
739**Word Count:** X,XXX words
740**Score:** X/6
741
742| Check | Status | Notes |
743|-------|--------|-------|
744| Question hook opening | ✅/❌ | [notes] |
745| Code in first 200 words | ✅/❌ | Code appears at word XX |
746| "What you'll learn" box | ✅/❌ | [present/missing] |
747| Short paragraphs | ✅/❌ | [notes on paragraph length] |
748| 1,500+ words | ✅/❌ | X,XXX words |
749| Bolded key terms | ✅/❌ | [notes] |
750
751**Structure Issues:**
752- [ ] [Issue and recommendation]
753
754---
755
756## Featured Snippet Analysis
757
758**Score:** X/4
759
760| Check | Status | Notes |
761|-------|--------|-------|
762| 40-60 word definition | ✅/❌ | Currently XX words |
763| Question-format H2 | ✅/❌ | Found: "[H2]" / Not found |
764| Numbered steps | ✅/❌ | [notes] |
765| Comparison tables | ✅/❌/N/A | [notes] |
766
767**Snippet Opportunities:**
768
7691. **"What is [concept]" snippet:**
770 - Current definition: XX words
771 - Action: [Expand to/Trim to] 40-60 words
772
7732. **"How to [action]" snippet:**
774 - Action: [Add Steps component / Already present]
775
776---
777
778## Internal Linking Analysis
779
780**Score:** X/4
781
782| Check | Status | Notes |
783|-------|--------|-------|
784| 3-5 internal links in body | ✅/❌ | Found X links |
785| Descriptive anchor text | ✅/❌ | [notes] |
786| Prerequisites in Warning | ✅/❌ | [present/missing] |
787| Related Concepts section | ✅/❌ | X cards present |
788
789**Current Internal Links:**
7901. [Anchor text] → `/concepts/[slug]`
7912. [Anchor text] → `/concepts/[slug]`
792
793**Recommended Links to Add:**
794- Link to [concept] in [section/context]
795- Link to [concept] in [section/context]
796
797**Bad Anchor Text Found:**
798- Line XX: "click here" → change to "[descriptive text]"
799
800---
801
802## Technical SEO Analysis
803
804**Score:** X/3
805
806| Check | Status | Notes |
807|-------|--------|-------|
808| Single H1 per page | ✅/❌ | [Found X H1 tags] |
809| URL slug contains keyword | ✅/❌ | Current: `/concepts/[slug]` |
810| Not an orphan page | ✅/❌ | Linked from X other pages |
811
812**H1 Tags Found:**
813- Line XX: `# [H1 text]` ← Should be the only one
814- [List any additional H1s that need to be changed to H2]
815
816**Slug Analysis:**
817- Current slug: `[slug].mdx`
818- Contains keyword: ✅/❌
819- Format correct: ✅/❌ (lowercase, hyphens, no special chars)
820
821**Incoming Links Found:**
8221. `/concepts/[other-concept]` → Links to this page in [section]
8232. `/concepts/[other-concept]` → Links in Related Concepts
824
825**If orphan page, add links from:**
826- [Suggested concept page] in [section]
827- [Suggested concept page] in Related Concepts
828
829---
830
831## Priority Fixes
832
833### High Priority (Do First)
834
8351. **[Issue]**
836 - Current: [what it is now]
837 - Recommended: [what it should be]
838 - Impact: [why this matters]
839
8402. **[Issue]**
841 - Current: [what it is now]
842 - Recommended: [what it should be]
843 - Impact: [why this matters]
844
845### Medium Priority
846
8471. **[Issue]**
848 - Recommendation: [fix]
849
850### Low Priority (Nice to Have)
851
8521. **[Issue]**
853 - Recommendation: [fix]
854
855---
856
857## Competitive Analysis (Optional)
858
859**Top-Ranking Pages for "[primary keyword]":**
860
8611. **[Competitor 1 - URL]**
862 - What they do well: [observation]
863 - Word count: ~X,XXX
864
8652. **[Competitor 2 - URL]**
866 - What they do well: [observation]
867 - Word count: ~X,XXX
868
869**Our Advantages:**
870- [What we do better]
871
872**Gaps to Fill:**
873- [What we're missing that competitors have]
874
875---
876
877## Implementation Checklist
878
879After making fixes, verify:
880
881- [ ] Title is 50-60 characters with keyword and hook
882- [ ] Description is 150-160 characters with action word and value
883- [ ] Primary keyword in title, description, first 100 words, and H2
884- [ ] Opens with question hook
885- [ ] Code example in first 200 words
886- [ ] "What you'll learn" Info box present
887- [ ] Paragraphs are 2-4 sentences
888- [ ] 1,500+ words total
889- [ ] Key terms bolded on first mention
890- [ ] 40-60 word definition for featured snippet
891- [ ] At least one question-format H2
892- [ ] 3-5 internal links with descriptive anchor text
893- [ ] Prerequisites in Warning box (if applicable)
894- [ ] Related Concepts section has 4 cards
895- [ ] Single H1 per page (title only)
896- [ ] URL slug contains primary keyword
897- [ ] Page linked from at least one other concept page
898- [ ] All fixes implemented and verified
899
900---
901
902## Final Recommendation
903
904**Ready to Publish:** ✅ Yes / ❌ No - [reason]
905
906**Next Review Date:** [When to re-audit, e.g., "3 months" or "after major update"]
907```
908
909---
910
911## Quick Reference
912
913### Character Counts
914
915| Element | Ideal Length |
916|---------|--------------|
917| Title | 50-60 characters |
918| Meta Description | 150-160 characters |
919| Definition paragraph | 40-60 words |
920
921### Keyword Density
922
923- Don't exceed 3-4 mentions of exact phrase per 1,000 words
924- Use variations naturally (e.g., "closures", "closure", "JavaScript closures")
925
926### Content Length
927
928| Length | Assessment |
929|--------|------------|
930| <1,000 words | Too thin - add depth |
931| 1,000-1,500 | Minimum viable |
932| 1,500-2,500 | Good |
933| 2,500-4,000 | Excellent |
934| >4,000 | Consider splitting |
935
936---
937
938## Summary
939
940When auditing a concept page for SEO:
941
9421. **Identify target keywords** using the keyword cluster for that concept
9432. **Check title tag** — 50-60 chars, keyword first, hook, ends with "JavaScript"
9443. **Check meta description** — 150-160 chars, action word, keyword, specific value
9454. **Verify keyword placement** — Title, description, first 100 words, H2
9465. **Audit content structure** — Question hook, early code, Info box, short paragraphs
9476. **Optimize for featured snippets** — 40-60 word definitions, numbered steps, tables
9487. **Check internal linking** — 3-5 links, good anchors, Related Concepts section
9498. **Generate report** — Document score, issues, and prioritized fixes
950
951**Remember:** SEO isn't about gaming search engines — it's about making content easy to find for developers who need it. Every optimization should also improve the reader experience.