Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Validates heading hierarchy, keyword density and placement, and internal/external link structure. Use when auditing on-page SEO factors for an HTML page.
.claude/skills/thisisahsaniqbal-onpage-optimization/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -39% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -8% | 0% |
Analyse the HTML page for heading structure, keyword usage, and link health.
> Note: This skill owns internal link analysis. For external/outbound link strategy (dofollow/nofollow, anchor text quality, domain diversity), see the backlink-monitoring skill.
Check all <h1> through <h6> elements:
| Check | Status | Rule | |---|---|---| | No headings at all | ❌ FAIL | Every page must have at least one heading | | No <h1> tag | ❌ FAIL | Every page must have exactly one <h1> | | Multiple <h1> tags | ⚠️ WARN | Recommend a single <h1> per page | | Hierarchy skipped (e.g. H2 → H4) | ⚠️ WARN | Headings should follow sequential order: H1 → H2 → H3 | | Empty heading (no text content) | ❌ FAIL | All headings must have descriptive text | | Single H1, proper hierarchy | ✅ PASS | Heading structure is correct |
If a target keyword is provided, check its usage across the page:
(keyword_count / total_words) × 100| Location | How to check | Missing = | |---|---|---| | <title> tag | Does the title contain the keyword? | ⚠️ WARN | | <h1> tag | Does the H1 text contain the keyword? | ⚠️ WARN | | Meta description | Does <meta name="description"> contain the keyword? | ⚠️ WARN | | First <p> tag | Does the first paragraph contain the keyword? | ⚠️ WARN | | Image alt text | Does any <img alt="..."> contain the keyword? | ⚠️ WARN |
Examine all <a href="..."> elements:
href starts with /, ./, ../, or #href starts with http:// or https://| Check | Threshold | Status | |---|---|---| | Internal link count ≥ 3 | Minimum 3 per page | ⚠️ WARN if below | | Links with no anchor text (and no child <img>) | Any count > 0 | ⚠️ WARN | | Internal links with rel="nofollow" | Any count > 0 | ⚠️ WARN "Prevents PageRank flow within your site" |
Always report the count of internal and external links found.
javascript:, mailto:, and tel: hrefs#/page) — treat #-prefixed hrefs as internal links<Link> components render as standard <a> tags in HTML output — audit the rendered HTML, not the JSX| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 9,994 | 5,769 | -42% | 1 | 1 | 0% | 1,701 | 1,753 | +3% | 0 | 0 | — |
case-02 | pass→pass | 9,286 | 5,162 | -44% | 1 | 1 | 0% | 1,738 | 1,811 | +4% | 0 | 0 | — |
case-03 | pass→pass | 8,951 | 3,883 | -57% | 1 | 1 | 0% | 1,657 | 1,545 | -7% | 0 | 0 | — |
case-04 | fail→pass | 4,419 | 2,186 | -51% | 1 | 1 | 0% | 726 | 1,226 | +69% | 0 | 0 | — |
case-05 | pass→pass | 7,433 | 5,140 | -31% | 1 | 1 | 0% | 1,389 | 1,745 | +26% | 0 | 0 | — |
case-06 | pass→pass | 10,245 | 4,241 | -59% | 1 | 1 | 0% | 1,854 | 1,714 | -8% | 0 | 0 | — |
case-07 | fail→pass | 8,278 | 3,086 | -63% | 1 | 1 | 0% | 1,575 | 1,453 | -8% | 0 | 0 | — |
case-08 | pass→pass | 7,426 | 3,369 | -55% | 1 | 1 | 0% | 1,435 | 1,456 | +1% | 0 | 0 | — |
case-09 | pass→pass | 7,504 | 2,819 | -62% | 1 | 1 | 0% | 1,277 | 1,423 | +11% | 0 | 0 | — |
case-10 | fail→pass | 9,196 | 3,785 | -59% | 1 | 1 | 0% | 1,583 | 1,575 | -1% | 0 | 0 | — |
case-11 | pass→pass | 9,542 | 3,864 | -60% | 1 | 1 | 0% | 1,764 | 1,537 | -13% | 0 | 0 | — |
case-12 | fail→pass | 15,861 | 5,129 | -68% | 1 | 1 | 0% | 2,926 | 1,777 | -39% | 0 | 0 | — |
case-13 | fail→pass | 9,301 | 3,463 | -63% | 1 | 1 | 0% | 1,575 | 1,445 | -8% | 0 | 0 | — |
case-14 | pass→pass | 8,318 | 2,620 | -69% | 1 | 1 | 0% | 1,532 | 1,284 | -16% | 0 | 0 | — |
case-15 | fail→pass | 8,322 | 4,304 | -48% | 1 | 1 | 0% | 1,579 | 1,606 | +2% | 0 | 0 | — |
case-16 | pass→pass | 4,612 | 3,340 | -28% | 1 | 1 | 0% | 831 | 1,405 | +69% | 0 | 0 | — |
case-17 | pass→pass | 9,400 | 3,379 | -64% | 1 | 1 | 0% | 1,442 | 1,482 | +3% | 0 | 0 | — |
case-18 | fail→pass | 15,301 | 13,169 | -14% | 1 | 1 | 0% | 2,683 | 3,264 | +22% | 0 | 0 | — |
case-19 | fail→pass | 13,497 | 3,843 | -72% | 1 | 1 | 0% | 2,538 | 1,380 | -46% | 0 | 0 | — |
case-20 | fail→fail | 19,786 | 17,452 | -12% | 1 | 1 | 0% | 3,461 | 4,107 | +19% | 0 | 0 | — |
case-21 | fail→fail | 8,889 | 8,941 | +1% | 1 | 1 | 0% | 1,478 | 2,827 | +91% | 0 | 0 | — |
case-22 | pass→pass | 5,937 | 3,860 | -35% | 1 | 1 | 0% | 1,056 | 1,595 | +51% | 0 | 0 | — |
case-23 | pass→pass | 9,716 | 3,940 | -59% | 1 | 1 | 0% | 2,073 | 1,582 | -24% | 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. 23 cases were attempted. The headline lift of +35 percentage points is the difference between those two pass rates over the 23 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.