v0.0.181
Released Nov 13, 2026
Release Notes
Reports now tell you where a site actually lives: a new host section lists its IPv4 and IPv6 addresses, a connect time and the country (offline, from a bundled DB-IP Lite snapshot), and names the CDN or WAF in front of it separately from the origin. Every report also says whether robots.txt was honoured and how many pages it kept out. A site that blocks every AI crawler with one wildcard rule gets one row instead of one per crawler, installs and updates verify the release's GitHub build attestation when gh is available, and discovery probes you never approved show up as coverage gaps instead of false verdicts.
Added
- Every report says whether the audit honoured robots.txt and how many pages it kept out of the audit (#1782): the console, text, markdown, HTML and LLM reports carry one plain sentence, and the JSON report (schema 1.19) carries
meta.respectRobotsandmeta.robotsBlockedPages. A run withrespect_robots = falsesays robots.txt was not honoured and pages it disallows were audited too. Reports the audit engine assembles (buildV1Report,buildV2Report) stamp the same two fields onscanScopewhen the caller passes ascanScopeoption, so a hosted run reports them too. - Reports show a host section with the resolved IPv4 and IPv6 addresses, a TCP connect time and the GeoIP country of the first address, from a bundled offline DB-IP Lite snapshot (CC BY 4.0). When the site runs on Cloudflare, CloudFront, Vercel, Netlify, Fastly or Akamai, the country is labelled an edge location, not the origin's, in every output format (#10)
- The report's
hostsection now names the edge (CDN, proxy or WAF) apart from the origin:host.edgecarries the edge provider, the sources that matched it (response headers, published IP ranges, ASN) and the origin when it is known, andhost.cloudRangemarks an address inside a whole-cloud range as provider information, never an edge. Edge detection uses bundled published IP ranges and an offline ASN snapshot. The JSON report schema is now 1.18 (#1807). - Installs and updates verify the release's GitHub build attestation (#169). When
ghis installed and logged in,install.sh,install.ps1andsquirrel self updaterungh attestation verify <file> --repo squirrelscan/squirrelscanon the downloaded binary after the SHA-256 check and fail, installing nothing, on a mismatch. Whenghis missing, too old or logged out, they print a warning and rely on the checksum alone. The trust root is GitHub's attestation service, not the download origin. The install docs gain a "Verifying a release" section with the manual command.
Fixed
- Discovery probes that were not approved, not sent or refused now appear as coded coverage gaps in notChecked, keeping previous findings open; an approved AGENTS.md probe answered with 404 is reported as absent (#1794).
ax/ai-crawlersreports one grouped row when onlyUser-agent: *blocks the AI crawlers (#1780), instead of one row per crawler. The row (ai-crawlers-wildcard-blocked) names the wildcard rule and lists the affected crawlers, and stays info whencrawl/robots-txtalready fails on the same whole-site block. Crawlers the file blocks by name keep their own rows. WhenUser-agent: *withDisallow: /is the only decision (no AI crawler or search engine named, noAllowexception), that row is the only check the rule emits, at info, pointing atcrawl/robots-txt; a named group that decides differently (for example aGooglebotgroup allowing the site) keeps thesearch-engine-accesscheck. Those crawlers no longer count toward ai-answer-access or archive-crawler-access, so some scores move.- Pricing version 13 adds the
llm_rules_pagecredit feature: 2 credits per page when an audit opts into LLM rules. Audits that do not opt in cost the same as before.
Changed
- The TLS certificate handshake is shared by the CLI and the cloud worker (#3922). It moves from
apps/clito the@squirrelscan/fetchers/tls-probesubpath, which only the CLI and the worker import: the rules, the crawler and the audit engine still receive it as an injectedTlsProbeFnand open no socket. A newrequireProxyoption makes a handshake that would go out directlyunavailableinstead, so a cloud worker without its egress proxy fails closed. CLI behaviour is unchanged.
Update to this version
squirrelscan will auto-update, or run this command to update now: