Skip to content
Marketing
Skill

/seo-drift

SEO drift monitoring: capture baselines of SEO-critical elements, detect changes, and track regressions over time. Git for SEO: baseline, diff, and track changes to your on-page SEO. Use when user says "SEO drift", "baseline", "track changes", "did anything break", "SEO

From plugin
claude-seo
28k33 skills20 agents1 hook

Claude Code

$ npx -y skills add AgriciDaniel/claude-seo --skill seo-drift --agent claude-code

SKILL.md

seo-drift.SKILL.md
name: seo-drift
description: >
  SEO drift monitoring: capture baselines of SEO-critical elements, detect changes,
  and track regressions over time. Git for SEO: baseline, diff, and track changes
  to your on-page SEO. Use when user says "SEO drift", "baseline", "track changes",
  "did anything break", "SEO regression", "compare SEO", "before and after",
  "monitor SEO changes", or "deployment check".
user-invocable: true
argument-hint: "baseline|compare|history <url>"
license: MIT
metadata:
  author: AgriciDaniel
  original_author: "Dan Colta (Pro Hub Challenge)"
  version: "2.6.0"
  category: seo

SEO Drift Monitor (April 2026)

Git for your SEO. Capture baselines, detect regressions, track changes over time.

---

Commands

| Command | Purpose | |---------|---------| | `/seo drift baseline <url>` | Capture current SEO state as a "known good" snapshot | | `/seo drift compare <url>` | Compare current page state to stored baseline | | `/seo drift history <url>` | Show change history and past comparisons |

---

What It Captures

Every baseline records these SEO-critical elements:

| Element | Field | Source | |---------|-------|--------| | Title tag | `title` | `parse_html.py` | | Meta description | `meta_description` | `parse_html.py` | | Canonical URL | `canonical` | `parse_html.py` | | Robots directives | `meta_robots` | `parse_html.py` | | H1 headings | `h1` (array) | `parse_html.py` | | H2 headings | `h2` (array) | `parse_html.py` | | H3 headings | `h3` (array) | `parse_html.py` | | JSON-LD schema | `schema` (array) | `parse_html.py` | | Open Graph tags | `open_graph` (dict) | `parse_html.py` | | Core Web Vitals | `cwv` (dict) | `pagespeed_check.py` | | HTTP status code | `status_code` | `fetch_page.py` | | HTML content hash | `html_hash` (SHA-256) | Computed | | Schema content hash | `schema_hash` (SHA-256) | Computed |

---

How Comparison Works

The comparison engine applies **17 rules across 3 severity levels**. Load `references/comparison-rules.md` for the full rule set with thresholds, recommended actions, and cross-skill references.

Severity Levels

| Level | Meaning | Response Time | |-------|---------|---------------| | **CRITICAL** | SEO-breaking change, likely traffic loss | Immediate | | **WARNING** | Potential impact, needs investigation | Within 1 week | | **INFO** | Awareness only, may be intentional | Review at convenience |

---

Storage

All data is stored locally in SQLite:

~/.cache/claude-seo/drift/baselines.db

Tables

  • **baselines**: Captured snapshots with all SEO elements
  • **comparisons**: Diff results with triggered rules and severities

URL normalization ensures consistent matching: lowercase scheme/host, strip default ports (80/443), sort query parameters, remove UTM parameters, strip trailing slashes.

---

Command: `baseline`

Captures the current state of a page and stores it.

**Steps:** 1. Validate URL (SSRF protection via `google_auth.validate_url()`) 2. Fetch page via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run fetch_page.py <URL>` 3. Parse HTML via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run parse_html.py <URL>` 4. Optionally fetch CWV via `"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run pagespeed_check.py <URL>` (use `--skip-cwv` to skip) 5. Hash HTML body and schema content (SHA-256) 6. Store snapshot in SQLite

**Execution:**

"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_baseline.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_baseline.py <url> --skip-cwv

**Output:** JSON with baseline ID, timestamp, URL, and summary of captured elements.

---

Command: `compare`

Fetches the current page state and diffs it against the most recent baseline.

**Steps:** 1. Validate URL 2. Load most recent baseline from SQLite (or specific `--baseline-id`) 3. Fetch and parse current page state 4. Run all 17 comparison rules 5. Classify findings by severity 6. Store comparison result 7. Output JSON diff report

**Execution:**

"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url> --baseline-id 5
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_compare.py <url> --skip-cwv

**Output:** JSON with all triggered rules, old/new values, severity, and actions.

After comparison, offer to generate an HTML report:

"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_report.py <comparison_json_file> --output drift-report.html

---

Command: `history`

Shows all baselines and comparisons for a URL.

**Execution:**

"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_history.py <url>
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run drift_history.py <url> --limit 10

**Output:** JSON array of baselines (newest first) with timestamps and comparison summaries.

---

Cross-Skill Integration

When drift is detected, recommend the appropriate specialized skill:

| Finding | Recommendation | |---------|----------------| | Schema removed or modified | Run `/seo schema <url>` for full validation | | CWV regression | Run `/seo technical <url>` for performance audit | | Title or meta description changed | Run `/seo page <url>` for content analysis | | Canonical changed or removed | Run `/seo technical <url>` for indexability check | | Noindex added | Run `/seo technical <url>` for crawlability audit | | H1/heading structure changed | Run `/seo content <url>` for E-E-A-T review | | OG tags removed | Run `/seo page <url>` for social sharing analysis | | Status code changed to error | Run `/seo technical <url>` for full diagnostics |

---

Error Handling

| Scenario | Action | |----------|--------| | URL unreachable | Report error from `fetch_page.py`. Do not guess state. Suggest user verify URL. | | No baseline exists for URL | Inform user and suggest running `baseline` first. | | SSRF blocked (private IP) | Report `validate_url()` rejection. Never bypass. | | SQLite datab

Read more
@agricidaniel
Ships withclaude-seo

Universal SEO skill for Claude Code. 26 sub-skills + 19 sub-agents covering technical SEO, E-E-A-T, schema, GEO/AEO, agent readiness (Lighthouse Agentic Browsing, WebMCP, llms.txt), backlinks, local SEO, e-commerce, international SEO, Google APIs, and PDF/Excel reporting. 9 optional extensions for live SEO data.

28k33 skills20 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
27.8k
Star history of AgriciDaniel/claude-seo on GitHub, a chart by star-history.com

Other skills on claude-seo.

seo-ahrefs

seo-ahrefs

Ahrefs API analyst (extension). Reads referring domains, backlinks, organic keywords, and content explorer data via the tested…

seo-image-gen

seo-image-gen

AI image generation for SEO assets: OG/social preview images, blog hero images, schema images, product photography, infographics.…

seo-bing

seo-bing

Bing Webmaster Tools + IndexNow extension. Microsoft Copilot citations are fed by the Bing index; this skill makes Bing…

seo-dataforseo

seo-dataforseo

Live SEO data via DataForSEO MCP server: SERP analysis, keyword research (volume, difficulty, intent, trends), backlink profiles,…

seo-firecrawl

seo-firecrawl

Full-site crawling, scraping, and site mapping via Firecrawl MCP. Use when user says "crawl site", "map site", "full crawl",…

seo-matomo

seo-matomo

Matomo Reporting API extension. Self-hosted or Matomo Cloud analytics as a GA4 alternative or complement. Organic traffic,…

More skills from other plugins.

brag

brag

Turn the current project website into a short, polished, shareable launch video using Hyperframes. Use when someone says "/brag",…

brag2w21k
@latent-spaces@latent-spacesInstall Skill
geo-audit

geo-audit

Full website GEO+SEO audit with parallel subagent delegation. Orchestrates a comprehensive Generative Engine Optimization audit…

scroll-world

scroll-world

Build an immersive scroll-scrubbed "fly through the world" landing page for any industry or brand using Higgsfield. As the…

@oso95@oso95Install Skill

Questions about seo-drift.

Which coding agents can use seo-drift?
seo-drift installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.