Skip to main content

v0.0.172

Released Nov 7, 2026


Release Notes

Three rule false positives are fixed (entity-conflicts, broken-anchors, mojibake), the entity map compares legal identifiers, and the REST API docs cover the rules catalogue, partial reports for rule-filtered runs and per-rule results.

Added

  • ax/content-without-js says why it did not run when a hosted run has rendering switched off. A run configured with render: false never asks the cloud render service, and the rule now skips with "render disabled by the run config" instead of "not applicable to this site type". No browser is paid for, as before; only the reason changed.
  • The REST API docs describe GET /v1/rules (the rule catalogue with requiresCloud and requiresRender), the partial report of a rule-filtered run (report.partial, null scores), the typed results[] list with its status and skip reason values, and a null run-level healthScore with partial: true for such runs.

Fixed

  • schema/entity-conflicts no longer reports a localized url alias of one entity (#1615). A Service with one @id, the same name and provider, and a page-specific url on reciprocal hreflang alternates was reported as a conflicting URL. That is now excused when url is the entity's only disagreement, each url is the address of a declaring page, every pair of pages with different values lists each other as hreflang alternates (reciprocal, neither page canonicalised elsewhere, x-default never counts), at most 40 pages declare the entity, and the entity says the same thing about provider, brand, publisher, creator, author, worksFor and member on every page, whether as a reference, a nested object or a bare string. Other properties, such as offers or areaServed, may differ per locale. Without reciprocal alternates it still warns, and a differing telephone, provider or legal identifier is never excused. The entity map still lists the url conflict for an aliased entity; the rule is the verdict.
  • links/broken-anchors no longer calls an id that an inline script names definitely missing on an unrendered page (#1616). A server-rendered page can add a target id from inline script at init (el.id = "size"). Fetched without a browser, the id is not in the HTML, so the link was reported as broken. When a quoted string of up to 64 characters in an inline script of the target page equals the missing fragment, the link is now listed under unconfirmed-anchors (info). This is a name match, not a creation test, so a generic fragment such as #contact can be unconfirmed by an unrelated mention. Reading is capped at 256 KB of script text and 1,024 distinct strings per page, and truncation demotes nothing: later strings are not read. A missing id no script names still warns, a static id still passes, and a rendered audit reads the initialized DOM as before. The unconfirmed-anchors message now reads "target a page that was not rendered and may add the id with JavaScript".
  • content/mojibake no longer flags valid uppercase Portuguese words (#1617). MANHÃ, IRMà and MAÇà before a space were reported as utf8-as-latin1 corruption because the sequence for à was written with a regular space. Decoding the UTF-8 bytes C3 A0 as latin1 gives à plus a no-break space (U+00A0), so the rule now matches that, and the same for Â. Genuine corruption such as cafà plus a no-break space still reports.
  • A hosted run with rendering switched off no longer lists ax/content-without-js as a locked rule. The "render disabled by the run config" skip is the run's own choice, so it stays off the "check didn't run, re-run without --http" banner and the locked-rules list, as not applicable already did.

Changed

  • The entity map compares six legal identifiers, which adds conflict rows (#1615). legalName, vatID, taxID, leiCode, duns and iso6523Code are now compared per entity across pages, so two pages that declare one @id with different values produce a conflict that schema/entity-conflicts and squirrel entities --problem conflict list. Existing sites can see new rows. Values are compared without case, spaces, dots or hyphens, a page that omits one is not a disagreement, the conflict shows each page's own spelling, and a legalName translated per locale is a conflict on purpose. They are compared, not stored in properties. A node that also has a url conflict can carry an @identity entry in conflicts, a guard for the alias check that the rule does not report.

Update to this version

squirrelscan will auto-update, or run this command to update now:

$

Downloads

macOS

Detected
Intel
squirrel-0.0.172-darwin-x64 · 110.7 MB
Download
SHA-256
Apple Silicon (M-series)
squirrel-0.0.172-darwin-arm64 · 102.1 MB
Download
SHA-256

Linux

ARM64 (musl/Alpine)
squirrel-0.0.172-linux-arm64-musl · 113.9 MB
Download
SHA-256
x64 (musl/Alpine)
squirrel-0.0.172-linux-x64-musl · 114.9 MB
Download
SHA-256
x64
squirrel-0.0.172-linux-x64 · 121.0 MB
Download
SHA-256
ARM64
squirrel-0.0.172-linux-arm64 · 121.1 MB
Download
SHA-256

Windows

x64 (Intel/AMD)
squirrel-0.0.172-windows-x64.exe · 126.9 MB
Download
SHA-256

Audit your site in one command

SEO, performance, security, accessibility and agent experience issues, with exact fixes for your coding agent.

Install
$

No account needed for the CLI. Cloud audits include free monthly credits.