# Audit Report: https://squirrelscan.com

**220 pages**
Generated: 2026-10-23T23:46:08.664Z
_This published report is a summary: each issue lists up to 10 example pages and 5 items beside its true counts. The complete list is not stored with this report: audit the site with the squirrel CLI and run `squirrel report --format json` for every page._
**Not checked: Broken External Links. 912 of 1412 external link\(s\) were not checked: over this audit's limit of 500, which checks the most-linked first. Raise the page limit, which raises the external link limit with it, to check them.**

## Editor's Summary

_Auto-generated editor's summary — informational, not scored._

Bottom line: the crawl covered all 220 pages, but the site has real reliability and performance problems. Reliability is the weak point, with broken scripts, stylesheets or fonts; slow Time to First Byte is the biggest repeated issue, flagged on 117 pages. Performance is also a weak area, while the overall score is solid but leaves clear improvements to make.

The wins are broad: crawlability, site integrity, analytics and several other categories are healthy. The main risks beyond speed are accessibility failures, placeholder copy, and an entity identity error in structured data. There are also substantial warnings across agent experience, accessibility and performance. This is the first audit, so there is no previous run to compare.

The site runs on Cloudflare and Vite, and Cloudflare already provides the WAF. Use Cloudflare to centralize security headers; the audit flags a missing Content Security Policy.

**Verdict:** The site is broadly healthy, but broken resources and widespread slow responses need attention before the warning backlog.

## Priorities

1. **Fix broken site resources** (Moderate)
   Broken scripts, stylesheets or fonts create a reliability failure and can prevent pages from rendering or working correctly.  
   Identify the broken resource URLs reported by the crawl and restore the files or update references to their valid locations in the site build and deployment.

2. **Reduce response time and improve caching** (Significant)
   Slow Time to First Byte affects 117 pages, and weak caching plus critical request chains add to the site's repeated performance problems.  
   Review origin response times and caching for the affected routes; configure appropriate cache behavior for static build assets and reduce unnecessary critical request chains in the Vite build.

3. **Set security headers at Cloudflare** (Quick win)
   The crawl flags a missing Content Security Policy, and the existing Cloudflare WAF makes the edge the right place to manage headers consistently.  
   At Cloudflare, add a response header Transform Rule on the proxied zone, or use a \_headers file for Cloudflare Pages; set Content-Security-Policy in report-only mode first, alongside Strict-Transport-Security and X-Frame-Options.

4. **Correct accessibility failures and improve link labels** (Moderate)
   Two label/content-name mismatches are failures, and repeated warnings for link text and identical-purpose links affect many pages.  
   Update the affected controls so accessible names match their visible labels, and revise repeated link text so each link's purpose is clear in context.

5. **Remove placeholder copy and repair entity identity** (Quick win)
   Placeholder text and an entity identity error undermine the credibility and accuracy of the site's content and structured data.  
   Replace the three placeholder-text instances with final copy, then correct the entity identity fields in the structured data so they consistently identify the site or organization.

6. **Fix titles and descriptions on affected pages** (Moderate)
   Missing or problematic meta titles on 11 pages and meta descriptions on three weaken how those pages are represented in search results.  
   Write a distinct, accurate meta title and description for each affected page, and review robots meta directives flagged across the crawl to ensure they match the intended indexing behavior.

## Health Score: 79/100 (C)

| Category | Score |
| --- | --- |
| Performance | 63% |
| Content | 88% |
| Accessibility | 84% |
| Structured Data | 82% |
| Reliability | 0% |
| Agent Experience | 42% |
| Core SEO | 76% |
| Images | 93% |
| Links | 78% |
| Security | 94% |
| Video | 44% |
| Blocking | 83% |
| Mobile | 94% |
| URL Structure | 94% |
| Analytics | 100% |
| Crawlability | 100% |
| E-E-A-T | 100% |
| Internationalization | 100% |
| Site Integrity | 100% |
| Legal Compliance | 100% |
| Social Media | 100% |

## Summary

| Metric | Value |
| --- | --- |
| Pages | 220 |
| Passed | 23274 |
| Warnings | 1074 |
| Failed | 15 |

## Issues

### Structured Data

#### Entity Identity
> Finds an Organization, LocalBusiness, Person or WebSite declared on many pages with no @id to tie the declarations together
- [X] **entity-identity**: 2 entities are declared on several pages with no @id
  (9 pages)
  - /
  - /blog/ax-defining-agent-experience
  - ... +7 more pages

#### Video Schema
> Validates VideoObject schema for video content
- [!] **video-schema**: Page has video but no VideoObject schema
  (1 pages)
  - /blog/publish-and-share-audit-reports

#### Structured Data Coverage Outlier
> Finds pages missing the structured data the rest of their page type carries
- [!] **coverage-outlier**: 1 of 61 page(s) are missing structured data their same-type siblings have (article SoftwareApplication, faq BreadcrumbList+FAQPage+SoftwareApplication)
  (1 pages)
  - /support

### Reliability

#### Broken Scripts, Stylesheets and Fonts
> Checks that the scripts, stylesheets and fonts pages reference load, and reports 4xx/5xx or failed requests
- [X] **broken-resources**: 2 first-party script or stylesheet(s) answer with an error status
  (2 pages)
  - /about
  - ... +1 more pages

### Accessibility

#### Label Content Name Mismatch
> Checks that visible label text is part of accessible name
- [X] **label-content-name-mismatch**: 1 element(s) where visible text doesn't match accessible name (+1 more pages)
  (2 pages)
  - /about
  - /pricing

#### Autocomplete Tokens
> Checks that name, email, phone, address and payment fields carry the correct autocomplete token
- [!] **autocomplete-tokens**: 1 identified field(s) missing an autocomplete token
  (1 pages)
  - /feedback

#### Video Captions
> Checks that videos have captions or transcripts
- [!] **video-captions**: 1 video(s) without caption tracks
  (1 pages)
  - /blog/publish-and-share-audit-reports

#### Heading Order
> Checks that heading levels don't skip
- [!] **heading-order**: 1 heading level skip(s) detected (+1 more pages)
  (2 pages)
  - /
  - /pricing

#### Identical Links Same Purpose
> Checks that links with identical text go to the same destination
- [!] **identical-links-same-purpose**: 1 link text(s) lead to different destinations (+138 more pages)
  (139 pages)
  - /
  - /about
  - /brand
  - /download
  - /learn/ai-visibility-trackers
  - ... +134 more pages

#### Redundant Image Alt
> Checks that image alt text is not redundant with surrounding text
- [!] **image-redundant-alt**: 2 image(s) with redundant alt text (+2 more pages)
  (3 pages)
  - /blog/ax-defining-agent-experience
  - /blog/entity-map
  - /blog/publish-and-share-audit-reports

#### Link Text
> Checks for descriptive link text
- [!] **link-text-generic**: 2 link(s) with generic text (+120 more pages)
  (121 pages)
  - /brand
  - /download
  - /releases/0.0.100
  - /releases/0.0.101
  - /releases/0.0.102
  - ... +116 more pages

#### TH Has Data Cells
> Checks that table headers have associated data cells
- [!] **th-has-data-cells**: 1 <th> element(s) without associated data cells (+2 more pages)
  (3 pages)
  - /for/agencies
  - /tools/llms-txt-validator
  - /tools/website-audit

#### Table Duplicate Name
> Checks that data tables have unique accessible names
- [!] **tables-without-names**: 2 table(s) without accessible names (+7 more pages)
  (8 pages)
  - /blog/ax-defining-agent-experience
  - /blog/entity-map
  - /learn/ai-visibility-trackers
  - /learn/geo-checker
  - /learn/geo-tools
  - ... +3 more pages

### Security

#### Third-Party Cookies
> Detects third-party resources that may set cookies
- [!] **tracking-domains**: 1 known tracking domain(s) detected (+1 more pages)
  (2 pages)
  - /blog
  - /pricing

#### Content Security Policy
> Checks for Content-Security-Policy header and validates directives
- [!] **csp-missing**: No Content-Security-Policy header

#### Subresource Integrity
> Checks that cross-origin scripts and stylesheets use Subresource Integrity (SRI)
- [!] **sri**: 1 cross-origin resource(s) without Subresource Integrity (+1 more pages)
  (2 pages)
  - /blog
  - /pricing

#### security.txt
> Checks for a valid RFC 9116 security.txt so security researchers know how to report a vulnerability
- [!] **security-txt**: No security.txt at /.well-known/security.txt (RFC 9116 vulnerability-disclosure contact)

### Performance

#### Source Maps
> Checks for source map availability and configuration
- [!] **source-maps-exposed**: 1 source map(s) exposed by bundles shared across pages: /ingest/static/exception-autocapture.js.map (+1 more pages)
  (2 pages)
  - /blog
  - /pricing

#### JavaScript File Size Too Large
> Checks for JavaScript files that exceed recommended size limits
- [!] **js-file-size-warn**: 2 JS file(s) exceed 250.0 KB
  (201 pages)
  - /blog
  - /
  - ... +199 more pages

#### Time to First Byte
> Measures server response time (TTFB)
- [X] **ttfb**: Very slow server response (1120ms) (+7 more pages)
  (8 pages)
  - /releases/0.0.108
  - /releases/0.0.111
  - /releases
  - /releases
  - /releases
  - ... +3 more pages
- [!] **ttfb**: Slow server response (633ms) (+108 more pages)
  (109 pages)
  - /releases
  - /releases/0.0.100
  - /releases/0.0.101
  - /releases/0.0.102
  - /releases/0.0.103
  - ... +104 more pages

#### CLS Optimization Hints
> Checks for Cumulative Layout Shift prevention
- [!] **cls-images**: 2 image(s) without width/height (CLS risk) (+2 more pages)
  (3 pages)
  - /blog/ax-defining-agent-experience
  - /blog/entity-map
  - /blog/publish-and-share-audit-reports

#### DOM Size
> Detects excessive DOM complexity that impacts performance
- [!] **dom-max-children**: Element with 79 children found (+5 more pages)
  (6 pages)
  - /blog/ax-defining-agent-experience
  - /learn/cursor-website-audit
  - /learn/fix-website-seo-with-chatgpt
  - /learn/fix-website-seo-with-claude-code
  - /learn/fix-website-seo-with-hermes
  - ... +1 more pages
- [!] **dom-total-nodes**: Large DOM (1621 nodes) (+2 more pages)
  (3 pages)
  - /releases
  - /releases
  - /releases

#### Weak Caching (site-wide)
> Flags sites where most pages lack caching freshness, validators, or compression
- [!] **bad-caching-validators**: 202/202 pages lack an ETag or Last-Modified validator. 202 of them came through Cloudflare, which may drop the ETag from HTML it rewrites with Email Address Obfuscation, Automatic HTTPS Rewrites, Replace insecure JavaScript libraries or JavaScript Detections (Bot Fight Mode). Add no-transform to the HTML Cache-Control, turn those features off, or also send Last-Modified
  (5 pages)
  - /
  - /about
  - /blog
  - /blog/ax-defining-agent-experience
  - /blog/category/announcements

#### Critical Request Chains
> Identifies chains of dependent resources that delay rendering
- [!] **critical-request-chains**: 1 critical request chain(s) found (+201 more pages)
  (202 pages)
  - /
  - /about
  - /blog
  - /blog/ax-defining-agent-experience
  - /blog/category/announcements
  - ... +197 more pages

#### Lazy Loading Above Fold
> Detects lazy loading on likely above-fold images
- [!] **lazy-above-fold**: 3 above-fold image(s) with lazy loading (+22 more pages)
  (23 pages)
  - /
  - /about
  - /blog
  - /blog/ax-defining-agent-experience
  - /blog/category/announcements
  - ... +18 more pages

### Legal Compliance

#### Cookie Consent
> Checks for cookie consent mechanism
- [!] **cookie-consent**: No cookie consent mechanism detected — required for your EU/UK (GDPR) audience (+201 more pages)
  (202 pages)
  - /
  - /about
  - /blog
  - /blog/ax-defining-agent-experience
  - /blog/category/announcements
  - ... +197 more pages

#### Sub-processor Disclosure
> Checks for a sub-processor / data-processing (DPA) disclosure page or link
- [!] **subprocessor-disclosure**: No sub-processor / data-processing (DPA) disclosure found

### Video

#### Video Thumbnail
> Checks that videos have poster/thumbnail images
- [!] **video-thumbnail**: 1 video(s) missing poster attribute
  (1 pages)
  - /blog/publish-and-share-audit-reports

#### Video Schema
> Checks for VideoObject schema on pages with video
- [!] **video-schema**: Video content without VideoObject schema
  (1 pages)
  - /blog/publish-and-share-audit-reports

#### Video Accessibility
> Checks for video captions and transcripts
- [!] **video-accessible**: No videos have caption tracks
  (1 pages)
  - /blog/publish-and-share-audit-reports

### Agent Experience

#### AGENTS.md
> Detects /AGENTS.md (and variants) — plain-Markdown instructions for coding agents working against the site's repository
- [!] **agents-md-present**: No AGENTS.md found — this site publishes llms.txt, so consider an AGENTS.md for coding agents too

#### Page Type Match
> Checks that the page's AI-classified type agrees with its declared structured data
- [!] **page-type-match**: Page reads as "other" but declares ItemList structured data _(Not re-checked this run — last verified 21 hours ago.)_
  (5 pages)
  - /tools/core-web-vitals-checker (carried)
  - /tools/llms-txt-validator (carried)
  - /tools/robots-txt-generator (carried)
  - /tools/security-headers-checker (carried)
  - /tools/website-audit (carried)
- [!] **page-type-match**: Page reads as "product" but declares FAQPage structured data _(Not re-checked this run — last verified 21 hours ago.)_
  (15 pages)
  - /for/chatgpt (carried)
  - /for/claude-code (carried)
  - /for/copilot (carried)
  - /for/cursor (carried)
  - /for/gemini-cli (carried)
  - ... +10 more pages

#### Token Weight
> Estimates the LLM token cost of a page's raw HTML and reports the text-to-HTML ratio — how much of that cost is actual content versus markup, scripts, and styles
- [!] **token-weight-budget**: Raw HTML exceeds a generous 100,000-token budget for a single page fetch — too heavy for an agent's context window
  (1 pages)
  - /releases
- [!] **token-weight-ratio**: Visible text is under 15% of the page HTML — agents pay token cost mostly for markup, scripts, and styles (+190 more pages)
  (191 pages)
  - /
  - /about
  - /blog
  - /blog/ax-defining-agent-experience
  - /blog/category/announcements
  - ... +186 more pages

### Core SEO

#### Meta Title
> Validates page title presence and length
- [!] **meta-title**: Title too short (+10 more pages)
  (11 pages)
  - /blog/category/guides
  - /blog/squirrel-perch
  - /blog/tag/ax
  - /blog/tag/cli
  - /blog/tag/cloud
  - ... +6 more pages

#### Meta Description
> Validates meta description presence and length
- [!] **meta-description**: Description too long (+2 more pages)
  (3 pages)
  - /blog/faster-and-larger-audits
  - /blog/squirrel-perch
  - /pricing

#### Robots Meta
> Checks the robots meta tag and X-Robots-Tag header for indexing directives
- [!] **robots-meta**: Page is set to noindex via robots meta tag (+113 more pages)
  (114 pages)
  - /releases/0.0.100
  - /releases/0.0.101
  - /releases/0.0.102
  - /releases/0.0.103
  - /releases/0.0.104
  - ... +109 more pages

### Links

#### Broken External Links
> Detects external links returning 4xx/5xx errors or timeouts
- [!] **broken-external-links**: 2 broken external link(s): 2 with 404
  (3 pages)
  - /learn/seo-mcp-server
  - /releases/0.0.64
  - ... +1 more pages

#### Orphan Pages
> Detects pages with no internal links pointing to them
- [!] **orphan-pages**: 5 orphan page(s) with <2 incoming links
  (5 pages)
  - /blog/category/case-studies
  - /blog/category/guides
  - /blog/tag/agent-experience
  - /blog/tag/ax
  - /blog/tag/seo

#### Broken Anchor Links
> Detects links to #fragments whose target id does not exist on the page they point at
- [!] **broken-anchors**: 119 in-page anchor link(s) point at an id that does not exist on the target page
  (119 pages)
  - /releases/0.0.100
  - /releases/0.0.101
  - /releases/0.0.102
  - /releases/0.0.103
  - /releases/0.0.104
  - ... +114 more pages

#### No Contextual Inbound Links
> Detects pages whose only internal inbound links come from sitewide chrome (nav, header, footer, sidebar)
- [!] **no-contextual-inbound**: 1 page(s) are linked only from sitewide chrome
  (1 pages)
  - /support

#### Weak Internal Links
> Detects pages with only 1 dofollow internal link pointing to them
- [!] **weak-internal-links**: 3 page(s) have only 1 internal link
  (3 pages)
  - /blog/tag/agent-experience
  - /blog/tag/ax
  - /blog/tag/seo

### Content

#### Placeholder Text
> Detects template leftovers and filler copy that shipped to production
- [X] **placeholder-content**: 2 placeholder occurrence(s) in visible text: unrendered template syntax (${SQUIRRELSCAN_API_KEY}) (+2 more pages)
  (3 pages)
  - /for/openclaw
  - /learn/fix-website-seo-with-claude-code
  - /learn/fix-website-seo-with-hermes

#### Keyword Stuffing
> Detects excessive keyword repetition in content
- [!] **keyword-stuffing**: 1 word(s) may be overused (+52 more pages)
  (53 pages)
  - /about
  - /blog/category/case-studies
  - /blog/category/engineering
  - /blog/category/guides
  - /blog/squirrel-perch
  - ... +48 more pages

#### Date Agreement
> Checks the visible date, schema dates and URL/title year agree
_2 of 11 pages carried from previous crawls._
- [!] **visible-date-missing**: This Article states datePublished 2026-07-07 in its schema but shows the reader no date at all _(Not re-checked this run — last verified 21 hours ago.)_
  (13 pages)
  - /learn/generative-engine-optimization (carried)
  - /learn/geo-checker (carried)
  - ... +11 more pages
- [!] **visible-date-missing**: This Article states datePublished 2026-07-07 in its schema but shows the reader no date at all (+8 more pages)
  (9 pages)
  - /learn/ai-crawlers
  - /learn/audit-website-security-with-ai
  - /learn/chatgpt-seo
  - /learn/cursor-website-audit
  - /learn/fix-seo-issues-with-ai
  - ... +4 more pages

#### Word Count
> Checks content length for thin content issues
- [!] **word-count**: Thin content: 236 words (min 300) (+17 more pages)
  (18 pages)
  - /about
  - /blog/category/announcements
  - /blog/category/case-studies
  - /blog/category/engineering
  - /blog/category/guides
  - ... +13 more pages

### Images

#### Offscreen Image Lazy Loading
> Checks if offscreen images use lazy loading
- [!] **offscreen-images-not-lazy**: 1 below-fold image(s) without lazy loading (+1 more pages)
  (2 pages)
  - /
  - /brand

#### Responsive Image Size
> Checks whether small images serve files heavier than their displayed size needs
- [!] **images-possibly-oversized**: 9 small image(s) serve files larger than their displayed size needs (+9 more pages)
  (10 pages)
  - /
  - /about
  - /blog/ax-defining-agent-experience
  - /blog/entity-map
  - /blog/faster-and-larger-audits
  - ... +5 more pages

#### Image Dimensions
> Checks for width/height attributes (prevents CLS)
- [!] **image-dimensions**: 2 image(s) missing width/height (causes CLS) (+2 more pages)
  (3 pages)
  - /blog/ax-defining-agent-experience
  - /blog/entity-map
  - /blog/publish-and-share-audit-reports

### Mobile

#### Web App Manifest
> Checks the web app manifest the pages link: that it loads and parses, its name, start_url and display, its 192px and 512px PNG icons, and that its theme_color matches the pages' theme-color
- [!] **web-app-manifest**: Web app manifest https://squirrelscan.com/site.webmanifest has 2 issue(s) (linked from https://squirrelscan.com/, https://squirrelscan.com/about, https://squirrelscan.com/blog, https://squirrelscan.com/blog/ax-defining-agent-experience, https://squirrelscan.com/blog/category/announcements and 197 more)
  (202 pages)
  - /
  - /about
  - /blog
  - /blog/ax-defining-agent-experience
  - /blog/category/announcements
  - ... +197 more pages

### URL Structure

#### URL Convention Consistency
> Finds URLs that break the site's own URL conventions
- [!] **slug-convention**: 13 of 202 page(s) deviate from the site's own URL conventions (slug word separator kebab-case 100%, URL letter case all-lowercase 100%, trailing slash no trailing slash 100%, date in slug [article] no date in the slug 100%, date in slug [faq] no date in the slug 100%, path depth [article] 2 path segment(s) 71%, path depth [faq] 2 path segment(s) 95%)
  (11 pages)
  - /blog/category/announcements
  - /support
  - ... +9 more pages

### Blocking

#### Privacy Filter Matches
> Checks for trackers and analytics that privacy filter lists (EasyPrivacy) would block
- [!] **privacy-blocked**: 1 resource(s) would be blocked by privacy filters (EasyPrivacy)
  (2 pages)
  - /blog
  - ... +1 more pages


**23274** passed, **1074** warnings, **15** failed

*Generated by [squirrelscan](https://squirrelscan.com)*