
Seo Fundamentals
- 546 installs
- 29.9k repo stars
- Updated July 27, 2026
- davila7/claude-code-templates
seo-fundamentals is a Claude Code skill that runs an automated on-repo SEO audit on public HTML, JSX, and TSX page files for developers who ship or refresh landing and marketing routes.
About
seo-fundamentals is a repository SEO audit skill from davila7/claude-code-templates backed by a Python seo_checker.py script. The checker scans HTML files and JSX/TSX React page components that represent public routes, verifying meta titles and descriptions, Open Graph tags for social sharing, heading hierarchy, and image alt attributes. Run it with `python seo_checker.py <project_path>` before shipping or refreshing marketing pages. Use seo-fundamentals when you need a repeatable on-repo pass over public page files instead of manual tag inspection or external-only Lighthouse runs.
- Python auditor scans HTML plus JSX/TSX components that look like public pages
- Verifies meta title, description, and Open Graph tags for social sharing
- Validates heading hierarchy and image alt attributes for accessibility and SEO
- Skips node_modules, tests, docs, and utility modules so results focus on shippable URLs
- CLI usage: python seo_checker.py <project_path> with JSON-friendly stdout on Windows UTF-8
Seo Fundamentals by the numbers
- 546 all-time installs (skills.sh)
- Ranked #715 of 1,881 Marketing & SEO skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/davila7/claude-code-templates --skill seo-fundamentalsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 546 |
|---|---|
| repo stars | ★ 29.9k |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 27, 2026 |
| Repository | davila7/claude-code-templates ↗ |
How do you audit SEO on React pages?
Run an automated on-repo SEO audit on public HTML and React page files before you ship or refresh landing and marketing routes.
Who is it for?
Frontend developers shipping landing or marketing routes who want automated on-repo SEO checks before release.
Skip if: Backend-only APIs or private admin pages with no public HTML, JSX, or TSX routes to audit.
When should I use this skill?
Public HTML or React marketing pages need an automated SEO audit before ship or refresh.
What you get
SEO audit report with meta tag, Open Graph, heading, and alt-text findings per public page
- SEO audit report
- Per-page finding list
By the numbers
- Audits 3 file types: HTML, JSX, and TSX
- Checks 4 SEO areas: meta tags, Open Graph, headings, and alt attributes
Files
SEO Fundamentals
Principles for search engine visibility.
---
1. E-E-A-T Framework
| Principle | Signals |
|---|---|
| Experience | First-hand knowledge, real examples |
| Expertise | Credentials, depth of knowledge |
| Authoritativeness | Backlinks, mentions, industry recognition |
| Trustworthiness | HTTPS, transparency, accurate info |
---
2. Core Web Vitals
| Metric | Target | Measures |
|---|---|---|
| LCP | < 2.5s | Loading performance |
| INP | < 200ms | Interactivity |
| CLS | < 0.1 | Visual stability |
---
3. Technical SEO Principles
Site Structure
| Element | Purpose |
|---|---|
| XML sitemap | Help crawling |
| robots.txt | Control access |
| Canonical tags | Prevent duplicates |
| HTTPS | Security signal |
Performance
| Factor | Impact |
|---|---|
| Page speed | Core Web Vital |
| Mobile-friendly | Ranking factor |
| Clean URLs | Crawlability |
---
4. Content SEO Principles
Page Elements
| Element | Best Practice |
|---|---|
| Title tag | 50-60 chars, keyword front |
| Meta description | 150-160 chars, compelling |
| H1 | One per page, main keyword |
| H2-H6 | Logical hierarchy |
| Alt text | Descriptive, not stuffed |
Content Quality
| Factor | Importance |
|---|---|
| Depth | Comprehensive coverage |
| Freshness | Regular updates |
| Uniqueness | Original value |
| Readability | Clear writing |
---
5. Schema Markup Types
| Type | Use |
|---|---|
| Article | Blog posts, news |
| Organization | Company info |
| Person | Author profiles |
| FAQPage | Q&A content |
| Product | E-commerce |
| Review | Ratings |
| BreadcrumbList | Navigation |
---
6. AI Content Guidelines
What Google Looks For
| ✅ Do | ❌ Don't |
|---|---|
| AI draft + human edit | Publish raw AI content |
| Add original insights | Copy without value |
| Expert review | Skip fact-checking |
| Follow E-E-A-T | Keyword stuffing |
---
7. Ranking Factors (Prioritized)
| Priority | Factor |
|---|---|
| 1 | Quality, relevant content |
| 2 | Backlinks from authority sites |
| 3 | Page experience (Core Web Vitals) |
| 4 | Mobile optimization |
| 5 | Technical SEO fundamentals |
---
8. Measurement
| Metric | Tool |
|---|---|
| Rankings | Search Console, Ahrefs |
| Traffic | Analytics |
| Core Web Vitals | PageSpeed Insights |
| Indexing | Search Console |
| Backlinks | Ahrefs, Semrush |
---
Remember: SEO is a long-term game. Quality content + technical excellence + patience = results.
#!/usr/bin/env python3
"""
SEO Checker - Search Engine Optimization Audit
Checks HTML/JSX/TSX pages for SEO best practices.
PURPOSE:
- Verify meta tags, titles, descriptions
- Check Open Graph tags for social sharing
- Validate heading hierarchy
- Check image accessibility (alt attributes)
WHAT IT CHECKS:
- HTML files (actual web pages)
- JSX/TSX files (React page components)
- Only files that are likely PUBLIC pages
Usage:
python seo_checker.py <project_path>
"""
import sys
import json
import re
from pathlib import Path
from datetime import datetime
# Fix Windows console encoding
try:
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
except:
pass
# Directories to skip
SKIP_DIRS = {
'node_modules', '.next', 'dist', 'build', '.git', '.github',
'__pycache__', '.vscode', '.idea', 'coverage', 'test', 'tests',
'__tests__', 'spec', 'docs', 'documentation', 'examples'
}
# Files to skip (not pages)
SKIP_PATTERNS = [
'config', 'setup', 'util', 'helper', 'hook', 'context', 'store',
'service', 'api', 'lib', 'constant', 'type', 'interface', 'mock',
'.test.', '.spec.', '_test.', '_spec.'
]
def is_page_file(file_path: Path) -> bool:
"""Check if this file is likely a public-facing page."""
name = file_path.name.lower()
stem = file_path.stem.lower()
# Skip utility/config files
if any(skip in name for skip in SKIP_PATTERNS):
return False
# Check path - pages in specific directories are likely pages
parts = [p.lower() for p in file_path.parts]
page_dirs = ['pages', 'app', 'routes', 'views', 'screens']
if any(d in parts for d in page_dirs):
return True
# Filename indicators for pages
page_names = ['page', 'index', 'home', 'about', 'contact', 'blog',
'post', 'article', 'product', 'landing', 'layout']
if any(p in stem for p in page_names):
return True
# HTML files are usually pages
if file_path.suffix.lower() in ['.html', '.htm']:
return True
return False
def find_pages(project_path: Path) -> list:
"""Find page files to check."""
patterns = ['**/*.html', '**/*.htm', '**/*.jsx', '**/*.tsx']
files = []
for pattern in patterns:
for f in project_path.glob(pattern):
# Skip excluded directories
if any(skip in f.parts for skip in SKIP_DIRS):
continue
# Check if it's likely a page
if is_page_file(f):
files.append(f)
return files[:50] # Limit to 50 files
def check_page(file_path: Path) -> dict:
"""Check a single page for SEO issues."""
issues = []
try:
content = file_path.read_text(encoding='utf-8', errors='ignore')
except Exception as e:
return {"file": str(file_path.name), "issues": [f"Error: {e}"]}
# Detect if this is a layout/template file (has Head component)
is_layout = 'Head>' in content or '<head' in content.lower()
# 1. Title tag
has_title = '<title' in content.lower() or 'title=' in content or 'Head>' in content
if not has_title and is_layout:
issues.append("Missing <title> tag")
# 2. Meta description
has_description = 'name="description"' in content.lower() or 'name=\'description\'' in content.lower()
if not has_description and is_layout:
issues.append("Missing meta description")
# 3. Open Graph tags
has_og = 'og:' in content or 'property="og:' in content.lower()
if not has_og and is_layout:
issues.append("Missing Open Graph tags")
# 4. Heading hierarchy - multiple H1s
h1_matches = re.findall(r'<h1[^>]*>', content, re.I)
if len(h1_matches) > 1:
issues.append(f"Multiple H1 tags ({len(h1_matches)})")
# 5. Images without alt
img_pattern = r'<img[^>]+>'
imgs = re.findall(img_pattern, content, re.I)
for img in imgs:
if 'alt=' not in img.lower():
issues.append("Image missing alt attribute")
break
if 'alt=""' in img or "alt=''" in img:
issues.append("Image has empty alt attribute")
break
# 6. Check for canonical link (nice to have)
# has_canonical = 'rel="canonical"' in content.lower()
return {
"file": str(file_path.name),
"issues": issues
}
def main():
project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
print(f"\n{'='*60}")
print(f" SEO CHECKER - Search Engine Optimization Audit")
print(f"{'='*60}")
print(f"Project: {project_path}")
print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("-"*60)
# Find pages
pages = find_pages(project_path)
if not pages:
print("\n[!] No page files found.")
print(" Looking for: HTML, JSX, TSX in pages/app/routes directories")
output = {"script": "seo_checker", "files_checked": 0, "passed": True}
print("\n" + json.dumps(output, indent=2))
sys.exit(0)
print(f"Found {len(pages)} page files to analyze\n")
# Check each page
all_issues = []
for f in pages:
result = check_page(f)
if result["issues"]:
all_issues.append(result)
# Summary
print("=" * 60)
print("SEO ANALYSIS RESULTS")
print("=" * 60)
if all_issues:
# Group by issue type
issue_counts = {}
for item in all_issues:
for issue in item["issues"]:
issue_counts[issue] = issue_counts.get(issue, 0) + 1
print("\nIssue Summary:")
for issue, count in sorted(issue_counts.items(), key=lambda x: -x[1]):
print(f" [{count}] {issue}")
print(f"\nAffected files ({len(all_issues)}):")
for item in all_issues[:5]:
print(f" - {item['file']}")
if len(all_issues) > 5:
print(f" ... and {len(all_issues) - 5} more")
else:
print("\n[OK] No SEO issues found!")
total_issues = sum(len(item["issues"]) for item in all_issues)
passed = total_issues == 0
output = {
"script": "seo_checker",
"project": str(project_path),
"files_checked": len(pages),
"files_with_issues": len(all_issues),
"issues_found": total_issues,
"passed": passed
}
print("\n" + json.dumps(output, indent=2))
sys.exit(0 if passed else 1)
if __name__ == "__main__":
main()
Related skills
How it compares
Pick seo-fundamentals over meta-tag generators when you need to audit existing pages, not author new tag blocks.
FAQ
What files does seo-fundamentals check?
seo-fundamentals checks HTML files and JSX/TSX React page components that are likely public routes. The bundled seo_checker.py script scans project paths for meta tags, Open Graph tags, heading hierarchy, and image alt attributes.
How do you run the seo-fundamentals audit?
Run the bundled Python script with `python seo_checker.py <project_path>`. seo-fundamentals targets public marketing and landing pages before ship or refresh, not private admin routes.
Is Seo Fundamentals safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.