seo-decay-check — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited seo-decay-check (Hook) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
End-to-end SEO + Generative Engine Optimization (GEO) for technical builders. One command. Pure stdlib. $0 marginal cost.
Status: v0.5.1 — Leveled-up, pure stdlib offline toolchain, dogfooded on vibecrafting.ai. All 18 skills and deterministic tools tested and active.
>
Part of the [Brokenbranch Lab](https://www.brokenbranch.dev/lab/).
A Claude Code plugin and deterministic toolchain that turns SEO and GEO from an intimidating, SaaS-bloated chore into a normal developer workflow. Run /seo, get a reviewable Git Pull Request. The terminal and codebase you already live in become your SEO workspace.
npm install, no pip install required for core offline diagnostics.# In Claude Code:
/seo-setup # One-time guided wizard (~5 min) — configures free-tier GSC & PageSpeed
/seo # Daily dev loop — diagnoses lifecycle phase, triages, and ships a PR
/seo-check # Fast pre-deploy audit & environment readiness check (no OAuth required)Jump in: QUICKSTART.md · soul.md · skills/REGISTRY.md · MCP_SERVERS.md · INSTALL.md
Our product philosophy is codified in soul.md. We adhere strictly to Five Inviolable Tenets:
External crawlers only guess how a site works from the outside. seo-superpower runs inside your repository: it analyzes your real Next.js, Astro, or SvelteKit route structures, inspects Markdown/MDX frontmatter, evaluates layout components, and traces your git commit history. We don't hand you an 80-item PDF checklist; we give you an SEO_AUDIT.md ranked by impact × effort alongside a ready-to-merge Git Pull Request containing minimal, idiomatic code changes. Git is our primary interface: traffic drops trigger refresh branches, lost AI citations trigger git blame investigations, and topic briefs become draft: true scaffolds on isolated feature branches.
$0 marginal cost is a non-negotiable architectural requirement. We never require paid third-party SEO APIs (Ahrefs, Semrush, Moz, DataForSEO). If a capability cannot run on free-tier APIs (Google Search Console, PageSpeed Insights) or deterministic local compute, it does not belong in this project. Graceful degradation is our default experience: first-time builders can run comprehensive local audits, schema checks, and linting in under 60 seconds without creating accounts, generating API keys, or configuring OAuth. Value comes first; credentials unlock deeper longitudinal data later.
No vibes-based SEO. Every threshold, parse cap, and architectural recommendation traces directly to a verified primary source: Google Search Central documentation, schema.org specifications, W3C standards, or peer-reviewed research (documented in SOURCES.md). When the industry chases unproven fads, we demand empirical validation (e.g. citing 500M-visit log analyses showing no AI citation lift for llms.txt). When specifications clarify, we lock correct rules into regression unit tests (such as Google's 50,000 URLs / 50 MB uncompressed sitemap limits versus the 500 KiB robots.txt parse cap).
Technical founders should never navigate complex configuration menus or answer lengthy intake questionnaires. The /seo command diagnoses, triages, and acts. At most one clarifying question is permitted when genuine ambiguity requires it. Diagnostic passes run in parallel to establish site context, and every execution returns a predictable, compact output:
If a check can be calculated deterministically, an LLM must never eyeball it. We do not count checklist items with prompt tokens; we run deterministic Node.js and Python scripts that emit explicit exit codes (0, 1, 2) to drive routing logic. Clear trust boundaries govern automation:
draft: true. We never hallucinate or publish synthetic content without human review.To keep the system robust, testable, and maintainable, every capability in seo-superpower is split into three clean layers:
┌─────────────────────────────────────────────────────────────┐
│ 1. SKILLS (The Mind) │
│ 18 Markdown playbooks defining expert judgment, lifecycle │
│ routing, anti-patterns, and step-by-step dev workflows. │
└──────────────────────────────┬──────────────────────────────┘
│ guides
┌──────────────────────────────▼──────────────────────────────┐
│ 2. TOOLS & SEAMS (The Hands) │
│ MCP servers (gsc, pagespeed, geo-check, schema-validate) │
│ and live fetch seams that retrieve external ground truth. │
└──────────────────────────────┬──────────────────────────────┘
│ feeds
┌──────────────────────────────▼──────────────────────────────┐
│ 3. SCRIPTS (The Bedrock) │
│ Pure, deterministic, stdlib-only Node.js & Python tools. │
│ Zero external dependencies. Fully unit-tested offline. │
└─────────────────────────────────────────────────────────────┘seo-superpower provides a comprehensive suite of offline-first command-line tools that run locally, in pre-commit hooks, or inside CI/CD pipelines with zero external dependencies.
┌────────────────────────────────────────────────────────────────────────────────────────┐
│ OFFLINE TOOL SUITE SUMMARY │
├─────────────────────────┬──────────────┬───────────────────────────────────────────────┤
│ Tool │ Runtime │ Primary Purpose │
├─────────────────────────┼──────────────┼───────────────────────────────────────────────┤
│ schema-quick.py │ Python 3.10+ │ Pure stdlib JSON-LD & Rich Result validator │
│ schema-check.js │ Node.js 18+ │ Pure stdlib Node JSON-LD validator │
│ baseline-check.js │ Node.js 18+ │ Deterministic Pass A site & --dir audit │
│ seo-lint.js │ Node.js 18+ │ Pre-commit placeholder & SEO bug linter │
│ check.py │ Python 3.10+ │ Cross-platform environment & credential check │
│ detect-framework.js │ Node.js 18+ │ App framework & route structure detector │
│ hreflang-tool.js │ Node.js 18+ │ Syntax, reciprocal link & x-default validator │
│ cross-site-compare.js │ Node.js 18+ │ Multi-site portfolio audit & compare matrix │
│ decay-automation.js │ Node.js 18+ │ Automated content decay sweep & hook runner │
│ codebase-mirror.js │ Node.js 18+ │ Template & SERP structure competitor diff │
│ geo-diff-bot.js │ Node.js 18+ │ AI citation delta & git commit correlator │
│ ci-validate.py │ Python 3.10+ │ Manifest, frontmatter & dangling link checker │
└─────────────────────────┴──────────────┴───────────────────────────────────────────────┘schema-quick.py & schema-check.js)Validates JSON-LD syntax, schema.org context, case-sensitive @type naming (e.g. catching faqpage or Website instead of FAQPage or WebSite), and Google Rich Result required and recommended fields.
Supports 11 major schema types: Article, BlogPosting, Product, FAQPage, BreadcrumbList, Organization, HowTo, Recipe, Event, JobPosting, and WebSite.
#### Python Stdlib Validator (scripts/schema-quick.py)
# Validate local file (JSON-LD or HTML with embedded <script type="application/ld+json">)
python scripts/schema-quick.py --file path/to/page.html
# Human-readable formatted output
python scripts/schema-quick.py path/to/schema.json --text
# Validate inline JSON string
python scripts/schema-quick.py --json '{"@context":"https://schema.org","@type":"Article","headline":"SEO Guide","author":{"@type":"Person","name":"Jane"},"image":"https://example.com/img.jpg","datePublished":"2026-01-01"}'
# Pipe from stdin or fetch live URL
cat schema.json | python scripts/schema-quick.py
python scripts/schema-quick.py --url https://example.com#### Node.js Stdlib Validator (scripts/schema-check.js)
# Validate local file or directory output
node scripts/schema-check.js --file ./dist/index.html
# Validate with text report
node scripts/schema-check.js --file schema.json --text
# Direct inline JSON validation
node scripts/schema-check.js --json '{"@context":"https://schema.org","@type":"WebSite","name":"My Site","url":"https://example.com"}'#### Exit Codes & Output Example
0: Valid schema, 0 errors, 0 warnings (rich-result eligible and clean).1: Valid schema syntax and required fields present, but has warnings (missing recommended fields).2: Schema errors: invalid JSON syntax, missing @context, mis-cased @type, missing required fields, or unreadable input.$ python scripts/schema-quick.py fixtures/codebase-mirror/ours/home.html --text
Schema Validation Result: WARNINGS
Schema Types Detected: WebSite
Warnings (1):
⚠️ root (WebSite): missing recommended field 'potentialAction'
✅ Valid JSON-LD syntax and required fields present (rich-result eligible).baseline-check.js)Performs a deterministic, spec-compliant 10-point Pass A health check. Unlike external crawlers, it supports both live URLs and local build directories (--dir).
Key Capabilities:
<h1> tag, and JSON-LD structured data blocks.#### Usage
# Pre-deploy local build directory audit (e.g. dist, out, build, public)
node scripts/baseline-check.js --dir ./dist
# Machine-readable JSON output for CI pipelines
node scripts/baseline-check.js --dir ./out --json
# Strict mode (requires >=8/10 score AND zero critical blockers)
node scripts/baseline-check.js --dir ./dist --strict
# Live URL audit
node scripts/baseline-check.js https://example.com --timeout=5000#### Exit Codes & Output Example
0: Baseline healthy (score ≥ 8/10; in --strict mode, requires zero blockers).1: Baseline incomplete or failing (< 8/10 or has critical blockers).2: Fatal error (unreachable target or missing directory).$ node scripts/baseline-check.js --dir ./dist
Baseline — ./dist [local directory audit]
Pass A: 10/10 HEALTHY
PASS robots.txt 200 + non-empty + Sitemap: line
1 sitemap ref(s)
PASS sitemap.xml 200 + valid XML + >0 URLs
1 URL(s)
PASS <title> present
44 chars
PASS <meta name=description> present
109 chars
PASS <link rel=canonical> present
https://example.com/
PASS <meta name=viewport> present
width=device-width, initial-scale=1
PASS at least one valid JSON-LD block
1/1 valid — WebSite
PASS HTTPS + valid certificate
local directory audit (skipped)
PASS exactly one <h1>
1 found
PASS AI-bot policy on >=3 crawlers
3 named — OAI-SearchBot, Claude-SearchBot, GPTBot
AI citation readiness (retrieval bots — these decide if you can be cited):
ALLOWED OAI-SearchBot
ALLOWED Claude-SearchBot
ALLOWED PerplexityBot (not named — inherits User-agent: *)
Route: growth -> finding-underserved-keywords (GSC data) or planning-topic-clusters (no GSC)
10/10 baseline checks pass — past bootstrapseo-lint.js)A zero-dependency pre-commit and CI guardrail that prevents disastrous SEO regressions before they ship to production.
Scans project files (.html, .tsx, .jsx, .astro, .svelte, .vue, .md, .mdx, .xml, .json) for:
REPLACE-WITH-CANONICAL-ORIGIN, REPLACE-WITH-SITE-NAME, and REPLACE-WITH-DEFAULT-DESCRIPTION.<meta name="robots" content="noindex"> on production routes (safely exempting 404 error pages, admin consoles, and staging templates).<loc>/path</loc>) and canonical links (<link rel="canonical" href="/path">).product -> Product, faqpage -> FAQPage).#### Usage
# Scan entire project
node scripts/seo-lint.js .
# Scan specific directory or build output
node scripts/seo-lint.js ./src
node scripts/seo-lint.js ./dist
# Machine-readable JSON output for pre-commit hooks
node scripts/seo-lint.js . --json#### Exit Codes & Output Example
0: Clean! 0 issues found across all scanned files.1: Lint issues found (placeholders, accidental noindex, relative URLs, schema casing).2: Runtime error (invalid directory or unreadable file).$ node scripts/seo-lint.js ./src
SEO Lint: 2 issue(s) found across 42 file(s):
src/routes/about.html:14:22 [no-placeholder-tokens]
Unreplaced placeholder token 'REPLACE-WITH-CANONICAL-ORIGIN' must be resolved before deployment.
src/routes/pricing.html:8:5 [no-accidental-noindex]
Accidental noindex directive '<meta name="robots" content="noindex">' found in production template.check.py)A pure Python 3 standard library environment and prerequisite checker. Runs natively on Windows, macOS, and Linux without requiring bash, WSL, or external packages. Replaces and supersedes legacy shell scripts.
Verifies:
.env location (~/.config/seo-superpower/.env or ~/.openclaw/.env).uvx, node (>= 18), python3 (>= 3.10), and git.#### Usage
# Standard interactive check with ANSI color output
python scripts/check.py
# Offline / CI check (skips external network requests)
python scripts/check.py --no-network
# Machine-readable JSON output
python scripts/check.py --json
# Plain text output without ANSI color escapes
python scripts/check.py --no-color#### Output Example
$ python scripts/check.py --no-network
=== SEO Superpower Readiness Check ===
[OK] Env file: ~/.config/seo-superpower/.env
[OK] GSC client secrets file: ~/.config/seo-superpower/gsc_client_secret.json
[OK] PAGESPEED_API_KEY set (AIzaSyA...)
[OK] uvx available (uvx 0.10.8)
[OK] node v22.23.2 (>= 18)
[OK] python 3.11.9 (>= 3.10)
[OK] git version 2.52.0
=== Summary ===
Pass: 7 Fail: 0 Warn: 0
System is ready for full SEO Superpower execution!hreflang-tool.js)A pure Node.js stdlib utility for international SEO. Validates BCP 47 language codes (ISO 639-1) and regional subtags (ISO 3166-1 alpha-2), detects self-referential links, enforces x-default catch-all targets, verifies bidirectional reciprocal links, and generates framework-ready tags.
# Validate alternate links in local HTML file
node scripts/hreflang-tool.js --validate ./dist/es/index.html
# Verify bidirectional reciprocal links across all language variants
node scripts/hreflang-tool.js --reciprocal en:https://example.com/ es:https://example.com/es/ de:https://example.com/de/
# Generate HTML alternate tags with x-default
node scripts/hreflang-tool.js --generate en:https://example.com/ es:https://example.com/es/ --x-default https://example.com/
# Generate Next.js App Router metadata alternates
node scripts/hreflang-tool.js --generate en:https://example.com/ fr:https://example.com/fr/ --format nextjs
# Machine-readable JSON output
node scripts/hreflang-tool.js --validate ./dist/index.html --json#### Exit Codes
0: Valid hreflang syntax, reciprocal links confirmed, and x-default present.1: Validation warnings or reciprocal errors found (missing reciprocal backlink, invalid language code, missing x-default).2: Bad arguments or syntax error.cross-site-compare.js)Compares multiple web properties or local build directories side-by-side in a single diagnostic matrix. Evaluates tech stack fingerprints, SEO health score, robots.txt status, AI search bot accessibility (OAI-SearchBot, PerplexityBot), sitemap limits, and structured data schemas.
# Compare multiple project build directories
node scripts/cross-site-compare.js ./apps/marketing/dist ./apps/docs/dist
# Compare baseline audit JSON outputs
node scripts/cross-site-compare.js ./audit-site-a.json ./audit-site-b.json
# Format as GitHub-flavored Markdown table (ideal for PR summaries and CI)
node scripts/cross-site-compare.js ./site1 ./site2 --format markdown
# Machine-readable JSON comparison matrix
node scripts/cross-site-compare.js ./site1 ./site2 --jsondecay-automation.js)Automates weekly content decay triage by inspecting Search Console impression trajectories and historical snapshots. Flags pages suffering >20% decay, identifies striking-distance keyword drop-offs, updates state in .seoconfig.json, and integrates directly with scheduled GitHub Actions (.github/workflows/decay-sweep.yml) and Claude Code event hooks (hooks/seo-decay-check.json).
--data is required. The runner has no built-in data source, so a sweep with nothing to read exits 2 rather than reporting that your content is healthy — "no decay found" must never be reachable from a missing file or a wrong schema.
# Standard sweep. Export GSC impressions to a JSON array of
# { url, current_impressions, prior_impressions } and pass the path.
node scripts/decay-automation.js --data ./gsc-impressions.json
# Custom decay threshold percentage
node scripts/decay-automation.js --data ./gsc-impressions.json --threshold-pct 25
# Dry-run mode (runs full analysis without updating timestamp state)
node scripts/decay-automation.js --data ./gsc-impressions.json --dry-runExit codes: 0 no decay, 1 decaying pages found, 2 could not evaluate (missing/unreadable data, or no row carried the expected numeric fields).
seo-superpower provides two core slash commands in Claude Code:
/seo — The Unified Diagnostic & Action EngineRuns the full diagnostic flow, triages site maturity, and routes directly to the highest-leverage task. You can run /seo with no arguments, or pass an explicit intent:
/seo # Auto-diagnose phase, triage, and open a PR
/seo audit <url> # Fast no-OAuth audit (<60s). Ideal first-time entry point!
/seo bootstrap # Generate sitemaps, robots.txt, OG image, and JSON-LD
/seo underserved # GSC query analysis for high-opportunity striking-distance keywords
/seo brief "<topic>" # Generate research-backed brief and open a draft PR (draft: true)
/seo mirror <url> # Reverse-engineer competitor templates, schema, and heading models
/seo hreflang # Validate alternate tags, reciprocal links, and x-default targets
/seo refresh # Detect decaying content (>20% loss) and prepare refresh PR
/seo geo-check # Benchmark domain citations across ChatGPT, Claude, Perplexity, Gemini
/seo geo-diff # Diff two citation snapshots and correlate changes to git commits/seo-check & /seo-setuppython scripts/check.py), runs the baseline audit (node scripts/baseline-check.js), and executes the SEO asset linter (node scripts/seo-lint.js)./seo bootstrap automatically detects your project's framework and route layout using scripts/detect-framework.js (tested against deterministic fixtures in fixtures/):
node scripts/detect-framework.js . # Human-readable report
node scripts/detect-framework.js . --json # Machine-readable output| Framework | Detection Signature | Generated Production Artifacts |
|---|---|---|
| Next.js (App Router) | next + app/ directory | app/sitemap.ts, app/robots.ts, app/opengraph-image.tsx, layout metadataBase + JSON-LD |
| Next.js (Pages Router) | next + pages/ directory | pages/sitemap.xml.ts (getServerSideProps), static public/robots.txt, Head tags |
| Astro | astro in dependencies | @astrojs/sitemap integration, public/robots.txt, src/components/SeoHead.astro |
| SvelteKit | @sveltejs/kit in dependencies | src/routes/sitemap.xml/+server.ts, static/robots.txt, <svelte:head> SEO block |
| Vite + React Router | react-router-dom (no meta-framework) | Static public/robots.txt, public/sitemap.xml, HTML Head fallbacks |
Monorepo Support: If the root package.json does not contain a recognized meta-framework, detect-framework.js recursively scans subdirectories (apps/*, web/, site/, etc.) two levels deep, identifies the relevant workspace app, and reports its path.
The complete suite of 18 skills (1 meta-router + 17 specialized playbooks) is fully implemented and active:
| Skill | Lifecycle Phase | Trigger Phrases | Key Deliverable |
|---|---|---|---|
| `seo-superpower` | Meta-router | Vague intent, /seo | Diagnoses site phase, selects skill, outputs routing plan |
| `setting-up-seo-measurement` | Initial | "verify GSC", "set up Search Console", "measure SEO" | Step-by-step Search Console verification & DNS records |
| `seo-bootstrap` | Initial | "set up SEO", "add sitemap", "I just shipped" | Framework-native sitemap, robots.txt, OG image, and JSON-LD PR |
| `researching-keywords-pre-launch` | Initial | "what should I write about", "cold-start SEO" | Clustered KEYWORD_MAP.md from PAA, Autocomplete, Reddit demand |
| `auditing-technical-seo` | Initial / Maintenance | "audit my site", "Core Web Vitals", "why aren't we ranking" | Ranked SEO_AUDIT.md by impact × effort with fix diffs |
| `planning-topic-clusters` | Initial → Growth | "topic clusters", "pillar page", "content architecture" | Cluster architecture with pillar and supporting post plan |
| `optimizing-on-page` | Cross-cutting | "polish this page", "title and meta", "internal linking" | Exact diff for <title>, description, headers, and internal anchors |
| `adding-schema-markup` | Cross-cutting | "add schema", "JSON-LD", "FAQ schema", "rich results" | Rich-result eligible JSON-LD components validated via stdlib tools |
| `generating-hreflang` | Cross-cutting / Initial → Growth | "hreflang", "international SEO", "multilingual", "x-default" | Syntax validation, reciprocal links, and framework-native alternate tags |
| `optimizing-for-generative-engines` | Cross-cutting | "GEO", "ChatGPT citations", "AI Overview", "track AI search" | Quotable answer capsules, citation tables, author entity markup |
| `tracking-citation-diffs` | Cross-cutting / Mature | "citation diff", "did my PR win citations", "GEO diff" | Correlates AI citation movement to specific git commits via geo-diff-bot.js |
| `analyzing-content-gaps` | Growth | "why does X outrank us", "content gap", "SERP diff" | Heading, topic, and entity gap analysis against top 3 ranking URLs |
| `generating-content-briefs` | Growth | "/seo brief", "brief to PR", "write brief and draft" | Comprehensive brief + opening a production draft PR (draft: true) |
| `mirroring-competitor-codebases` | Growth → Mature | "mirror their codebase", "reverse-engineer their SEO" | Codebase template diff ranking missing schema, links, and structure |
| `finding-underserved-keywords` | Growth → Mature | "GSC analysis", "striking distance", "impression gap" | High-impression keywords ranking positions 8–20 ready for optimization |
| `building-eeat-and-authority` | Growth → Mature | "E-E-A-T", "author bios", "build authority", "YMYL" | Author entity schemas, Wikidata/sameAs link chains, fact citations |
| `generating-programmatic-seo` | Growth → Mature | "programmatic SEO", "scale content", "city pages from data" | Pattern templates passing strict uniqueness (≥60%) and depth gates |
| `refreshing-stale-content` | Mature | "traffic is dropping", "content decay", "refresh post" | Refresh PR updating decayed copy, dateModified, and IndexNow ping |
mcp-servers/)Model Context Protocol (MCP) servers act as the "hands" that connect Claude to external services:
mcp-search-console): Interfaces with Google Search Console API. Retrieves search analytics, query clicks, impressions, average positions, and indexing status.pagespeed-insights-mcp): Connects to Google PageSpeed Insights. Retrieves lab Lighthouse audits, field Core Web Vitals (LCP, INP, CLS), and optimization opportunities.mcp-servers/geo-check/server.py). Queries ChatGPT, Claude, Perplexity, and Gemini to track whether your domain is cited for strategic category queries.mcp-servers/schema-validate/server.py). Deep Python validation using pyld and extruct with Google Rich Result eligibility testing.# Add marketplace and install plugin
/plugin marketplace add benskamps/seo-superpower
/plugin install seo-superpower@benskamps-marketplace
# Run guided setup wizard
/seo-setupYou do not need to configure credentials to start using seo-superpower. Run:
# Perform a static baseline audit on your local build output right now:
node scripts/baseline-check.js --dir ./dist
# Lint your project for placeholders and missing tags:
node scripts/seo-lint.js .
# Run a quick audit on any public URL:
/seo audit https://example.comDocumentation:
Every script, validator, and skill in seo-superpower is guarded by comprehensive offline unit tests and static analysis. Tests run in under 5 seconds with zero network calls:
# 1. Run Node.js unit tests (293 tests across all scripts & fixtures)
node --test test/*.test.js
# 2. Run Python unit tests (47 tests across schema & CI validators)
python -m unittest discover -s test
# 3. Run comprehensive CI integrity validation (92 structural checks)
python scripts/ci-validate.pyci-validate.py Checks:name and description) across all 18 skills.commands/..claude-plugin/plugin.json and marketplace.json schema and paths.commands/seo.md → skills/<name>/) resolve to existing directories.hooks/*.json) map to existing executable scripts.Every pull request to seo-superpower must uphold our charter in soul.md:
test/.MIT © Benjamin Schippers. See LICENSE for details. Built on empirical SEO research and community insights documented in SOURCES.md.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.