On-Page SEO Audit — Tool Reference

What the tool checks, what data it collects to check it, how each result is judged, and the formats a report comes in.

Built from the 112-point On-Page & Technical SEO Specification · 103 of 112 checks currently automated

1. The checks

112 checks across 12 categories. Live checks run today and produce a real pass/fail/warn verdict. Pending checks are on the roadmap — each has a specific, named reason it isn't automated yet, not just "not done."

103 live
9 pending
12 categories

1. HTML Metadata 11/11 live

IDCheckPriorityStatusNote
1.1Title TagHighLive
1.2Meta DescriptionHighLive
1.3Meta RobotsHighLive
1.4Canonical URLHighLive
1.5Character Encoding (Charset)MediumLive
1.6Viewport Meta TagHighLive
1.7HTML Language AttributeHighLive
1.8Open Graph Meta TagsMediumLive
1.9Twitter Card Meta TagsLowLive
1.10Favicon DeclarationHighLive
1.11hreflang AttributesHighLive

2. URL Structure 7/7 live

IDCheckPriorityStatusNote
2.1Descriptive & Human-Readable URLsHighLive
2.2URL LengthMediumLive
2.3Lowercase URLsMediumLive
2.4Use Hyphens Instead of UnderscoresMediumLive
2.5HTTPSHighLive
2.6URL ParametersMediumLive
2.7Static vs Dynamic URLsMediumLive

3. Heading Structure 8/8 live

IDCheckPriorityStatusNote
3.1Heading Elements OverallHighLive
3.2H1 TagHighLive
3.3Number of H1 TagsMediumLive
3.4Heading HierarchyHighLive
3.5Descriptive HeadingsMediumLive
3.6Empty Heading TagsMediumLive
3.7Skipped Heading LevelsMediumLive
3.8In-Page Anchor Links & Table of ContentsMediumLive

4. Content Quality & Readability 11/15 live

IDCheckPriorityStatusNote
4.1Unique & Original ContentHighLive
4.2Content Relevance (Search Intent)HighPendingNeeds AI judgment — checklist itself says intent evaluation requires human review
4.3Primary Topic & Keyword UsageMediumLive
4.4Keyword StuffingHighLive
4.5Content FreshnessMediumLive
4.6Content Depth & CompletenessHighLive
4.7ReadabilityMediumLive
4.8Grammar & SpellingMediumLive
4.9Duplicate ContentHighLive
4.10Thin ContentHighLive
4.11Helpful ContentHighPendingHuman review required — non-deterministic
4.12E-E-A-T SignalsHighLive
4.13Direct Answer Formatting (AEO)HighLive
4.14Intrusive Interstitials & Pop-upsHighPendingRequired R&D
4.15Above-the-Fold Content VisibilityHighPendingRequired R&D

5. Images 13/13 live

IDCheckPriorityStatusNote
5.1Image Alt TextHighLive
5.2Descriptive Image File NamesMediumLive
5.3Image Dimensions (Width & Height)HighLive
5.4Image File FormatsMediumLive
5.5Image Compression & File SizeHighLive
5.6Responsive Images (srcset/sizes)HighLive
5.7Lazy LoadingHighLive
5.8Decorative ImagesMediumLive
5.9Image CaptionsLowLive
5.10Structured Data for ImagesMediumLive
5.11Image SitemapMediumLive
5.12Broken ImagesHighLive
5.13LCP Hero Image Optimization & PreloadingHighLive

6. Internal Linking 11/12 live

IDCheckPriorityStatusNote
6.1Internal Links PresenceHighLive
6.2Descriptive Anchor TextHighLive
6.3Broken Internal LinksHighLive
6.4Orphan PagesHighLive
6.5Crawl DepthMediumLive
6.6Link RelevanceMediumPendingHuman review required — non-deterministic
6.7Excessive Internal LinksMediumLive
6.8Navigation LinksHighLive
6.9Breadcrumb NavigationMediumLive
6.10Footer LinksLowLive
6.11Redirecting Internal LinksMediumLive
6.12Canonical Target LinksMediumLive

7. External Linking 12/13 live

IDCheckPriorityStatusNote
7.1External Links PresenceMediumLive
7.2Link to Authoritative SourcesMediumLive
7.3Broken External LinksHighLive
7.4Descriptive External Anchor TextMediumLive
7.5rel=nofollow for Untrusted LinksHighLive
7.6rel=sponsored for Paid LinksHighLive
7.7rel=ugc for User-Generated LinksMediumLive
7.8Excessive External LinksMediumLive
7.9External Links Opening in New TabLowLive
7.10HTTPS External LinksMediumLive
7.11Unsafe or Spammy External LinksHighPendingRequires the Google Safe Browsing API — not yet integrated
7.12Redirecting External LinksLowLive
7.13Security Attributes (rel=noopener noreferrer)HighLive

8. Video & Audio Content 1/1 live

IDCheckPriorityStatusNote
8.1Video/Audio Transcripts & CaptionsMediumLive

9. Structured Data & Schema Infrastructure 9/11 live

IDCheckPriorityStatusNote
9.1JSON-LD Format UsageHighLive
9.2Content Parity (Visible Content Alignment)HighLive
9.3Required and Recommended PropertiesHighLive
9.4Use Specific Schema TypesMediumLive
9.5Avoid Irrelevant or Misleading MarkupHighLive
9.6Keep Structured Data Up-to-DateHighPendingNot required — part of analytics
9.7Don't Block Structured-Data PagesHighLive
9.8Entity Linking (@id) ConsistencyMediumLive
9.9Validate Before and After Deployment (local syntax gate)HighLive
9.10Prioritize High-Impact Schema TypesHighLive
9.11Monitor Rich Results & AI Overview AppearancesMediumPendingNot required — part of analytics

10. Mobile Infrastructure & Mobile-First Indexing 5/6 live

IDCheckPriorityStatusNote
10.1Mobile-First Indexing ParityHighLive
10.2Responsive Design & Layout (No Horizontal Scroll)HighLive
10.3Touch Target Sizing & Spacing (Min 48×48px)HighPendingRequired R&D
10.4Mobile Core Web VitalsHighLive
10.5Mobile Content AccessibilityHighLive
10.6Mobile CrawlabilityHighLive

11. Core Web Vitals & Performance Engineering 10/10 live

IDCheckPriorityStatusNote
11.1Largest Contentful Paint (LCP)HighLive
11.2Interaction to Next Paint (INP)HighLive
11.3Cumulative Layout Shift (CLS)HighLive
11.4Core Web Vitals Image DeliveryHighLive
11.5JavaScript Optimization & DeferralHighLive
11.6CSS Optimization & Critical CSSHighLive
11.7Server Response Time (TTFB)HighLive
11.8Caching Infrastructure (Browser & Server)HighLive
11.9Minification (HTML, CSS, JavaScript)MediumLive
11.10Resource Hints (Preload, Preconnect, Prefetch)MediumLive

12. Crawlability, Indexability & Architecture 5/5 live

IDCheckPriorityStatusNote
12.1robots.txt Configuration & Size LimitsHighLive
12.2XML Sitemap Architecture & ValidationHighLive
12.3Crawl Budget OptimizationHighLive
12.4Pagination HandlingMediumLive
12.5Faceted Navigation & Parameter ControlHighLive

2. Data we collect

Everything below comes from the page itself, its directly-linked resources, and — only when explicitly enabled — a site-wide crawl or an external performance API. Nothing is collected beyond what a specific check needs.

Every audit, single page

Site-wide audits only (--site-wide)

Performance checks only (when PAGESPEED_API_KEY is set)

Not collected, ever: cookies, session state, form input, personal or user-identifiable data, or anything from behind a login. Nothing is retained after a run except the report file you asked for.

3. How results are judged (KPIs / thresholds)

Every number below is a config value, not something buried in code — thresholds can be tuned per client or industry without touching the check logic. This is the actual configuration the tool ships with.

AreaThresholdVerdict
Title tag length50–60 charsBest-practice band; 10–60 is acceptable, outside that fails
Meta description length150–160 charsBest-practice band; 70–160 is acceptable, outside that fails
URL length≤ 100 charsFlagged past this length
URL path depth≤ 6 segmentsFlagged past this depth
Thin content< 300 wordsFailed as thin content
Shallow content depth< 600 wordsWarned as shallow coverage
Keyword stuffingone term > 6% of words (min. 5 uses)Failed as stuffing
Content freshness> 730 days since updateFlagged for review, not auto-failed
Duplicate content≥ 85% shingle similarityFailed; 60–85% warned (site-wide only)
Crawl depth≤ 3 clicks from homepageGoogle's own site-structure guidance
Internal links per page≤ 150Flagged for manual review past this
Footer links≤ 30Flagged past this count
External links per page≤ 100Flagged as excessive past this
Image file size≤ 300 KBFlagged as oversized past this
Alt text length≤ 125 charsFlagged past this length
JS payload per page≤ 500 KBFlagged past this
CSS payload per page≤ 100 KBFlagged past this
Server response time (TTFB)≤ 500ms good · ≤ 800ms targetFailed above 800ms
Static asset cache lifetime≥ 1 monthFlagged if shorter
Resource hints per page≤ 5Flagged as excessive past this
Largest Contentful Paint (LCP)≤ 2.5s good · > 4s poorGoogle's published Core Web Vitals bands
Cumulative Layout Shift (CLS)≤ 0.1 good · > 0.25 poorGoogle's published Core Web Vitals bands
Interaction to Next Paint (INP)≤ 200ms goodGoogle's published Core Web Vitals bands
robots.txt file size≤ 500 KBGoogle's own documented parsing limit
XML sitemap size≤ 50,000 URLs · ≤ 50 MBGoogle's own documented sitemap limits

Each individual result also carries a priority (High / Medium / Low, from the specification) which combines with its pass/fail/warn status into a final severity — Critical, High, Medium, or Low — used to sort recommendations by what to fix first.

4. Output formats

Every audit produces the same underlying result set — an overall score, per-category pass/fail/warn counts, and every individual check's evidence — rendered into one of three formats.

Console

Default — for a quick read in the terminal

Score, category breakdown, and the top issues ranked by severity, with the fix and reasoning for each.

JSON

For dashboards, pipelines, and re-audits

The full structured report — every check's status, evidence, and message. Nothing summarized away.

Markdown

For a shareable written report

The same content as console, formatted as a document — the format this page's data itself is drawn from.

Console output (excerpt)

======================================================================
ON-PAGE SEO AUDIT REPORT (Phase 1 — rule-based checks only)
======================================================================
URL:   https://example.com/
Score: 75.5/100  (47 scored / 103 total checks)

-- 1. HTML Metadata (3/11 passed) --
  [✗] 1.1    Title Tag                                    FAIL
  [✓] 1.2    Meta Description                              PASS
  [!] 1.8    Open Graph Meta Tags                           WARN
  ...

======================================================================
RECOMMENDATIONS (16)
======================================================================

1. [Critical] 1.1 — Title Tag
   Fix: Write one unique, accurate <title> per page, ideally 50-60 characters.
   Why: The title is one of the strongest on-page SEO signals and directly
        affects click-through rate from search results.

JSON report shape

{
  "url": "...", "final_url": "...", "audit_run_id": "...",
  "overall_score": { "score": 75.5, "scored_checks": 47, "total_checks": 103 },
  "category_scores": {
    "1. HTML Metadata": { "pass": 3, "fail": 5, "warn": 2, "other": 1, "total": 11 },
    ...
  },
  "results": [
    {
      "check_id": "metadata.title_tag", "doc_ref": "1.1", "name": "Title Tag",
      "category": "1. HTML Metadata", "priority": "High", "status": "FAIL",
      "message": "Title is 14 characters, shorter than the 50-60 best-practice band.",
      "evidence": { "title": "...", "length": 14 }
    },
    ...
  ]
}

Markdown report (excerpt)

# On-Page SEO Audit — https://example.com/

**Score:** 75.5/100 (47 scored checks, 103 total)
**Run ID:** 44eb1b7d-fd50-4f4a-8c1f-a6bd7d4ed5d9

## Recommendations

### [Critical] 1.1 — Title Tag
- **Recommendation:** Write one unique, accurate <title> per page, ideally 50-60 characters.
- **Why it matters:** The title is one of the strongest on-page SEO signals and
  directly affects click-through rate from search results.

## All Checks

### 1. HTML Metadata
- ❌ **1.1 Title Tag** — Title is 14 characters, shorter than the 50-60 best-practice band.
- ✅ **1.2 Meta Description** — Meta description is 152 characters, within the best-practice band.
Command line: audit.py <url> --format console|json|markdown [--out FILE]. Add --site-wide to crawl and audit an entire site instead of one page.