Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when auditing content pages for over-optimisation, reviewing AI-generated content that may repeat target phrases excessively, or checking meta tags and alt text for unnatural keyword accumulation.
.claude/skills/thedaviddias-keyword-stuffing/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-02 | ✓→✓ | = Same ✓ | -1% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 3% | 0% |
Google's spam detection algorithms penalise pages that unnaturally repeat keywords to manipulate rankings. Keyword-stuffed pages are demoted in search results or removed from the index entirely. Natural, reader-focused writing with topical variation outperforms keyword-dense content.
Analyse the page's main content body, <title>, <meta name='description'>, heading elements (H1–H6), and <img alt> attributes. Flag: (1) Any single keyword or phrase appearing more than 3× in the title tag. (2) Any keyword with a density above 3% of total word count. (3) Lists of keywords with no context (e.g., 'cheap flights, affordable flights, discount flights, best flight deals'). (4) Alt text that is a comma-separated list of keywords instead of a description. (5) Hidden text (white text on white background, or display:none containing keywords).
Google's Panda algorithm (now core to its main ranking system) and SpamBrain spam detection specifically target content with unnatural keyword density. Pages that appear to manipulate keyword frequency are demoted or removed from results. Google's documentation explicitly cites 'stuffing keywords into your content' as a violation of its quality guidelines. Natural writing that covers a topic comprehensively, using synonyms and related terms, outperforms keyword-dense content.
Extract text content from the page body (strip HTML tags). Tokenise into words. Compute frequency of each unique word and common phrases (bigrams, trigrams). Flag any word/phrase appearing more than 3% of total word count. Also check <title>, <meta name='description'>, and alt attributes for repeated keywords. Report top 5 most frequent terms and their density percentages.
For full implementation details, code examples, and framework-specific guidance, see references/rule.md.
Rule page: https://frontendchecklist.io/en/rules/seo/keyword-stuffing
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 7,001 | 7,858 | +12% | 1 | 1 | 0% | 1,331 | 2,329 | +75% | 0 | 0 | — |
case-02 | pass→pass | 13,289 | 6,670 | -50% | 1 | 1 | 0% | 1,876 | 1,857 | -1% | 0 | 0 | — |
case-03 | fail→pass | 18,576 | 5,893 | -68% | 1 | 1 | 0% | 1,435 | 1,645 | +15% | 0 | 0 | — |
case-04 | pass→pass | 16,235 | 18,696 | +15% | 1 | 1 | 0% | 1,766 | 1,819 | +3% | 0 | 0 | — |
case-05 | pass→pass | 17,877 | 17,451 | -2% | 1 | 1 | 0% | 1,732 | 2,171 | +25% | 0 | 0 | — |
case-06 | pass→pass | 11,460 | 14,067 | +23% | 1 | 1 | 0% | 1,788 | 2,767 | +55% | 0 | 0 | — |
case-07 | pass→pass | 5,200 | 4,748 | -9% | 1 | 1 | 0% | 889 | 1,396 | +57% | 0 | 0 | — |
case-08 | pass→pass | 5,721 | 6,726 | +18% | 1 | 1 | 0% | 942 | 1,787 | +90% | 0 | 0 | — |
case-09 | pass→pass | 9,919 | 6,996 | -29% | 1 | 1 | 0% | 1,657 | 2,064 | +25% | 0 | 0 | — |
case-10 | pass→pass | 8,457 | 4,184 | -51% | 1 | 1 | 0% | 1,295 | 1,205 | -7% | 0 | 0 | — |
case-11 | pass→pass | 15,843 | 6,239 | -61% | 1 | 1 | 0% | 2,395 | 1,524 | -36% | 0 | 0 | — |
case-12 | fail→pass | 6,604 | 2,351 | -64% | 1 | 1 | 0% | 1,200 | 1,068 | -11% | 0 | 0 | — |
case-13 | pass→pass | 15,919 | 7,428 | -53% | 1 | 1 | 0% | 2,332 | 1,720 | -26% | 0 | 0 | — |
case-14 | fail→pass | 12,077 | 7,527 | -38% | 1 | 1 | 0% | 1,660 | 1,731 | +4% | 0 | 0 | — |
case-15 | pass→pass | 4,516 | 1,999 | -56% | 1 | 1 | 0% | 555 | 935 | +68% | 0 | 0 | — |
case-16 | pass→pass | 5,767 | 6,806 | +18% | 1 | 1 | 0% | 820 | 1,523 | +86% | 0 | 0 | — |
case-17 | pass→pass | 9,135 | 5,549 | -39% | 1 | 1 | 0% | 1,286 | 1,495 | +16% | 0 | 0 | — |
case-18 | pass→pass | 7,471 | 2,829 | -62% | 1 | 1 | 0% | 1,049 | 1,100 | +5% | 0 | 0 | — |
case-19 | pass→pass | 17,058 | 7,971 | -53% | 1 | 1 | 0% | 2,325 | 1,773 | -24% | 0 | 0 | — |
case-20 | pass→pass | 10,046 | 5,925 | -41% | 1 | 1 | 0% | 1,470 | 1,569 | +7% | 0 | 0 | — |
case-21 | pass→pass | 7,802 | 5,686 | -27% | 1 | 1 | 0% | 1,450 | 1,619 | +12% | 0 | 0 | — |
case-22 | pass→pass | 3,149 | 4,515 | +43% | 1 | 1 | 0% | 413 | 1,300 | +215% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +14 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.