Agent skill

Blog Cannibalization

by AgriciDaniel in AgriciDaniel/claude-blog

Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search…

MITAuto-check passedWriting & Content

Install Blog Cannibalization

skills CLI
$ npx skills add AgriciDaniel/claude-blog --skill blog-cannibalization -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install AgriciDaniel/claude-blog blog-cannibalization --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/AgriciDaniel/claude-blog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/blog-cannibalization .claude/skills/blog-cannibalization && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
blog-cannibalization
GitHub stars
2.3k
Used in
1 other repo
Token cost
~2.2k tokens
SKILL.md length
993 words
Files
1
Skills in repo
39
Repo updated
First seen
Licence
MIT

At a glance

Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search…

  • Works in 5 steps: Scan Blog Files → Extract Primary Keywords → Cluster by Similarity → …
  • User says cannibalization
  • SKILL.md covers Two Modes, Local Mode Workflow, API Mode Workflow (DataForSEO) and Severity Scoring, plus 3 more sections
  • Reaches api.dataforseo.com; needs DATAFORSEO_PASSWORD

What it does

Blog Cannibalization is an agent skill from AgriciDaniel/claude-blog. Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search intent. Supports local-only mode (grep-based) and DataForSEO API mode (Page Intersection endpoint at ~$0.01/call). Outputs severity-scored report with merge or differentiate recommendations. Use when user says "cannibalization", "keyword overlap", "competing pages", "duplicate keywords", "cannibalize".

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Writing & Content, covering Keyword research and Blog and article writing. The repository describes itself as: Claude Code blog skill suite: 30 sub-skills, 5 agents, 5-gate v1.9.0 Blog Delivery Contract, dual-optimized for Google rankings and AI citations. Active development at… The licence is MIT.

When your agent uses it

  • User says cannibalization
  • Keyword overlap
  • Competing pages
  • Duplicate keywords

Example prompts

  • “cannibalization”
  • “keyword overlap”
  • “competing pages”
  • “/blog-cannibalization”

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Scan Blog Files
  2. Extract Primary Keywords
  3. Cluster by Similarity
  4. Score and Flag
  5. Output Report

What it can do on your machine

Read from SKILL.md and the folder at commit 2500d4c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • api.dataforseo.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • DATAFORSEO_PASSWORD

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Blog Cannibalization loads about 2.2k tokens when it runs. Until then it costs about 130 tokens; SKILL.md has 993 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~130
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from AgriciDaniel/claude-blog at commit 2500d4c, republished under its MIT licence (© AgriciDaniel). 993 words, ~2,199 tokens.

Download SKILL.mdSave it as .claude/skills/blog-cannibalization/SKILL.md (or your agent's skills folder).
name
blog-cannibalization
description
Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search intent. Supports local-only mode (grep-based) and DataForSEO API mode (Page Intersection endpoint at ~$0.01/call). Outputs severity-scored report with merge or differentiate recommendations. Use when user says "cannibalization", "keyword overlap", "competing pages", "duplicate keywords", "cannibalize".
user-invokable
true
argument-hint
[directory] [--api]
license
MIT

Blog Cannibalization - Keyword Overlap Detection

Detect when multiple blog posts compete for the same search keywords. Two modes: local-only analysis (default) and DataForSEO API mode for SERP-level data.

Two Modes

ModeFlagCostData Source
Local(default)FreeFile content analysis via Grep/Read
API--api~$0.01/callDataForSEO Page Intersection + Ranked Keywords

Local mode works without any API keys. API mode requires DataForSEO credentials set as environment variables: DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD.

Local Mode Workflow

Step 1: Scan Blog Files

Use Glob to find all content files in the target directory:

  • Patterns: **/*.md, **/*.mdx, **/*.html
  • Skip files in node_modules/, .git/, drafts/
Step 2: Extract Primary Keywords

For each file, read and extract keyword signals from:

  • Title tag or H1 heading (highest weight)
  • H2 headings (medium weight)
  • First paragraph (supporting signal)
  • Meta description if present in frontmatter

Primary keyword extraction method:

  1. Tokenize title, H1, H2s, meta description, and first paragraph into 1-gram, 2-gram, and 3-gram phrases.
  2. Normalize deterministically: lowercase, remove locale-aware stop words, lemmatize or stem consistently, preserve product names, and keep intent modifiers such as "best", "pricing", "vs", "review", "template", and year.
  3. Score sections separately: title/H1 highest, meta description and H2s medium, first paragraph supporting.
  4. Select the top-scoring 2-3 word phrase as the primary keyword and record secondary keywords from H2 headings.
Step 3: Cluster by Similarity

Group posts into clusters using these matching rules (in priority order):

  1. Exact match - identical primary keyword across 2+ posts
  2. Stem match - same root word (e.g., "optimize" vs "optimization")
  3. Semantic overlap - Assign explicit intent labels such as informational, commercial, transactional, comparison, or troubleshooting. Include confidence and a one-sentence rationale, or use an embeddings workflow with a documented threshold.
  4. Subset match - one keyword contains another (e.g., "email marketing" vs "email marketing for startups")
Step 4: Score and Flag

For each cluster with 2+ posts, assess severity and generate a recommendation.

Step 5: Output Report

Display the results table and per-cluster recommendations.

API Mode Workflow (DataForSEO)

Requires the --api flag and a dedicated local CLI wrapper that reads DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD from the environment and emits JSON. Do not use WebFetch for DataForSEO POST calls and never expose Basic auth headers, login, password, or encoded credentials in prompts or reports. If no wrapper exists in the project, report SKIPPED: DataForSEO wrapper unavailable and run local mode.

Endpoints Used

Page Intersection - find keywords where multiple URLs rank:

POST https://api.dataforseo.com/v3/dataforseo_labs/google/page_intersection/live

{
  "pages": {
    "1": "https://example.com/post-a",
    "2": "https://example.com/post-b"
  },
  "language_code": "en",
  "location_code": 2840
}

Cost: ~$0.01 per call. Returns overlapping keywords with position, volume, CPC.

Ranked Keywords - get all keywords a single URL ranks for:

POST https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live

{
  "target": "https://example.com/post-a",
  "language_code": "en",
  "location_code": 2840
}

The wrapper sends DataForSEO auth headers from environment variables and never prints them.

API Analysis Steps
  1. Collect all published URLs from the user (or sitemap)
  2. Run Ranked Keywords for each URL to build keyword profiles
  3. Run Page Intersection for URL pairs that share keyword clusters
  4. Calculate severity using the formula below
  5. Output enriched report with search volume and position data

Severity Scoring

Four severity levels based on overlap signals:

LevelCriteriaAction Urgency
CriticalSame exact keyword, both pages in top 20Immediate
HighSame keyword cluster, one page outranks the otherThis week
MediumRelated keywords with partial SERP overlapThis month
LowSemantic similarity but different confirmed intentsMonitor
Severity Formula (API Mode)
severity_score = overlap_count x avg_search_volume x (1 / position_gap)

Where:

  • overlap_count = number of shared ranking keywords
  • avg_search_volume = mean monthly volume of shared keywords
  • position_gap = absolute difference in average ranking position (min 1)

Higher score = more urgent cannibalization problem.

Severity Heuristic (Local Mode)

Without SERP data, use a simplified scoring:

  • Critical: Exact primary keyword match between posts
  • High: Stem match on primary keyword, or 3+ shared H2 keywords
  • Medium: Semantic overlap on primary keyword
  • Low: Subset match only, or shared secondary keywords
Show full SKILL.md (384 more words)Show less

Output Format

Summary Table
| Post A | Post B | Shared Keywords | Severity | Recommendation |
|--------|--------|-----------------|----------|----------------|
| /best-crm-tools | /top-crm-software | best crm, crm tools, crm software | Critical | MERGE |
| /email-tips | /email-marketing-guide | email marketing | High | DIFFERENTIATE |
| /seo-basics | /seo-for-beginners | seo basics, beginner seo | Critical | CANONICAL |
| /react-hooks | /react-state-mgmt | react, state | Low | NO ACTION |
Per-Cluster Detail

For each flagged cluster, provide:

  • Both post titles and URLs
  • Full list of overlapping keywords (with volume if API mode)
  • Which post is stronger (more comprehensive, better structured)
  • Specific recommendation with rationale

Recommendations

Four possible actions for each cannibalization cluster:

MERGE

When both pages are thin or cover the same intent with similar depth.

  • Combine the best content from both into one comprehensive post
  • 301 redirect the weaker URL to the merged post
  • Preserve all internal links pointing to either URL
DIFFERENTIATE

When pages serve different intents but keyword targeting overlaps.

  • Shift the primary keyword of the weaker post to a related long-tail
  • Update the title, H1, and meta description to reflect the new focus
  • Add internal links between the two posts to signal distinct topics
CANONICAL

When one post is clearly the authority and the other is a lesser duplicate.

  • Add rel="canonical" on the weaker page pointing to the authority
  • Do not combine canonical and noindex casually. Use noindex only when removal from search is intended
  • Link from the weaker page to the authority page
NOINDEX

When a page should be removed from search results but still exist for users.

  • Confirm the page has no meaningful unique search demand or business value
  • Keep it crawlable until the noindex directive is observed
  • Do not use as the default duplicate-content fix
NO ACTION

When intent is genuinely different despite surface-level keyword similarity.

  • Document the reasoning for future audits
  • Monitor rankings quarterly for any position changes
  • Re-evaluate if either post drops in rankings

Error Handling

  • No blog files found: If the directory contains no .md, .mdx, or .html files, report "No blog files found in [directory]" and suggest checking the path
  • DataForSEO credentials missing: In API mode, if credentials are not configured, fall back to local mode automatically and notify the user
  • API rate limits: DataForSEO has per-minute rate limits. If a 429 response is received, wait and retry once. If it persists, switch to local mode for remaining URLs
  • API request failures: If DataForSEO returns an error, retry once within rate limits. If it still fails, switch to local mode for remaining URLs and report the failed endpoint without credentials
  • Single-post directory: If only one blog post exists, report "Cannibalization analysis requires at least 2 posts" and exit gracefully

© AgriciDaniel, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/blog-cannibalization of AgriciDaniel/claude-blog.

Open the folder on GitHubat commit 2500d4c

Used in 1 other repository

We found 4 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in AgriciDaniel/claude-blog, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Blog Cannibalization next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Blog Cannibalization compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Blog Cannibalization this skillAgriciDaniel/claude-blog2.3k1 repos~2.2kAutomated safety check: PassMIT
Article Writingericrisco/rsc-harness174—~2.9kAutomated safety check: PassMIT
Ink Briefjeremylongshore/tons-of-skills-marketplace2.8k—~1.2kAutomated safety check: NotesMIT
SEO Keyword ResearchVarnan-Tech/opendirectory674—~1.8kAutomated safety check: PassMIT
Content Engineericrisco/rsc-harness174—~2.9kAutomated safety check: PassMIT
AI Content Creatorhuifer/claude-code-seo110—~1.7kAutomated safety check: NotesMIT

Similar skills

  • Article Writing

    ericrisco/rsc-harness

    A skill your agent uses when writing one long-form article end to end — answer-first lede, question-shaped headings, plus its on-page surface (title, meta, slug, FAQ, Article/FAQPage JSON-LD) — or…

    174 GitHub stars~2.9k tokensUpdated 2 days ago
    Writing & ContentAuto-check passed
  • Ink Brief

    jeremylongshore/tons-of-skills-marketplace

    Content brief generator — takes a topic or keyword and produces a complete content brief with target keyword, search intent, recommended structure, internal link targets, word count, CTA, and…

    2.8k GitHub stars~1.2k tokensUpdated yesterday
    Writing & ContentAuto-check: notes
  • SEO Keyword Research

    Varnan-Tech/opendirectory

    SEO keyword research workflow for blog generation using Google Trends data.

    674 GitHub stars~1.8k tokensUpdated 1 mo ago
    Marketing & SEOAuto-check passed
  • Content Engine

    ericrisco/rsc-harness

    A skill your agent uses when a content operation needs a SYSTEM: a dated editorial calendar built top-down from pillars, plus the stage gates, briefs, WIP limits and 1:10 atomization plan that move…

    174 GitHub stars~2.9k tokensUpdated 2 days ago
    Marketing & SEOAuto-check passed
  • AI Content Creator

    huifer/claude-code-seo

    AI 内容创作专家,生成高质量的 SEO 和 GEO 优化内容,支持多种内容类型和风格. An agent skill from huifer/claude-code-seo.

    110 GitHub stars~1.7k tokensUpdated 9 mo ago
    Writing & ContentAuto-check: notes
  • Content Brief

    MadAppGang/claude-code

    Content brief template and creation methodology for SEO-optimized content.

    285 GitHub starsUsed in 1 repo~959 tokens
    Writing & ContentAuto-check passed

More from AgriciDaniel/claude-blog

All 39 skills in this repo
  • Blog Google

    AgriciDaniel/claude-blog

    Google API integration for blog performance: PageSpeed Insights, CrUX Core Web Vitals with 25-week history, Search Console performance, URL Inspection, Indexing API, GA4 organic traffic, NLP entity…

    2.3k GitHub starsUsed in 1 repo~3.3k tokens
    Auto-check: notes
  • Blog Audio

    AgriciDaniel/claude-blog

    Generate audio narration of blog posts using Google Gemini TTS.

    2.3k GitHub starsUsed in 1 repo~2.2k tokens
    Auto-check: notes
  • Blog Flow

    AgriciDaniel/claude-blog

    FLOW framework integration for bloggers. An agent skill from AgriciDaniel/claude-blog.

    2.3k GitHub starsUsed in 1 repo~2k tokens
    Auto-check passed
  • Blog Notebooklm

    AgriciDaniel/claude-blog

    Query Google NotebookLM notebooks for source-grounded, citation-backed answers from user-uploaded documents.

    2.3k GitHub starsUsed in 1 repo~2.5k tokens
    Auto-check: warnings
  • Blog Image

    AgriciDaniel/claude-blog

    AI image generation and editing for blog content powered by Gemini via MCP.

    2.3k GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Blog Cluster

    AgriciDaniel/claude-blog

    Semantic topic cluster planning and automated execution engine for claude-blog.

    2.3k GitHub starsUsed in 1 repo~4.9k tokens
    Auto-check passed

Questions about Blog Cannibalization

What does Blog Cannibalization do?

Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search…. Blog Cannibalization is an agent skill from AgriciDaniel/claude-blog. Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search intent.

When should I use Blog Cannibalization?

Blog Cannibalization fits situations like: user says cannibalization; keyword overlap; competing pages; duplicate keywords.

How do I install Blog Cannibalization in Claude Code?

Run `npx skills add AgriciDaniel/claude-blog --skill blog-cannibalization -a claude-code`. Or copy the skill folder (skills/blog-cannibalization in AgriciDaniel/claude-blog) into .claude/skills/blog-cannibalization in your project. Claude Code loads it when a task matches its description.

How do I install Blog Cannibalization in Codex?

Run `npx skills add AgriciDaniel/claude-blog --skill blog-cannibalization -a codex`. Or copy the skill folder (skills/blog-cannibalization in AgriciDaniel/claude-blog) into .agents/skills/blog-cannibalization in your project. Codex loads it when a task matches its description.

Can I use Blog Cannibalization in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add AgriciDaniel/claude-blog --skill blog-cannibalization -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/blog-cannibalization, .gemini/skills/blog-cannibalization, .github/skills/blog-cannibalization and .opencode/skills/blog-cannibalization in your project.

What does Blog Cannibalization need to run?

Going by SKILL.md and its folder, Blog Cannibalization needs credentials named DATAFORSEO_PASSWORD.

Does Blog Cannibalization access the network?

SKILL.md names 1 domain. In commands or code: api.dataforseo.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Blog Cannibalization safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Blog Cannibalization use?

Blog Cannibalization is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Blog Cannibalization use?

About 2.2k tokens (SKILL.md is roughly 8.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Blog Cannibalization?

Skills that share tags, products or a category with Blog Cannibalization: Article Writing (ericrisco/rsc-harness, 174 stars), Ink Brief (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), SEO Keyword Research (Varnan-Tech/opendirectory, 674 stars) and Content Engine (ericrisco/rsc-harness, 174 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Blog Cannibalization?

AgriciDaniel (a GitHub user) maintains it in AgriciDaniel/claude-blog, which has 2,347 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 9, 2026.

Source: AgriciDaniel/claude-blog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.