v0.0.96
Released Sep 17, 2026
Release Notes
Every audit now builds a map of the entities your site declares, a new command and five MCP tools read it, thirteen rules check it, and the leaked-secrets scanner went from a thousand false alarms on real sites to a few hundred correct public keys.
Added
- Entity map on every audit. Structured data across the whole crawl is resolved into one graph (organisations, people, products, articles, and the pages that declare them), stored with the audit and embedded in every report format. Report-only: no score changes.
squirrel entitiesqueries that map: a summary of what your site declares, a lookup by@id, key or name, and--listover stored audits.--type,--pageand--problemnarrow the result in every output format, not just on screen.- Export the graph as
csv,dot,graphmlormermaid, alongside the existingjson,jsonld,htmlandmarkdown. squirrel entities --diffcompares two audits of a site and reports entities added and removed,@idchanges, and new and resolved conflicts and dangling references. An entity is only called removed when every page that declared it was crawled again; anything else is reported as not crawled, so a smaller crawl never reads as a site that deleted its structured data.- Five entity tools on
squirrel mcp:list_entities,get_entity,get_entity_graph,compare_entities(withoccurrence_threshold) andget_entity_findings. They read the local project store: no auth, no credits, no round trip. - Thirteen
schema/entity-*rules over the map: missing organisation and website entities, split identities, conflicting declarations, dangling references, orphans, publisher mismatches, type drift,@idformat, missingsameAs, authors, and one local business per page. Each has a rule doc page. - After a local audit, a signed-in user whose reports have never reached the cloud gets a one-line nudge to publish (with an explicit unlisted visibility). It shows once; the first publish switches it off for good.
- When an audit is refused for lack of credits, the CLI shows the cost, your balance, the reset date and an upgrade link scoped to the organisation that hit the wall, on the preflight warning and on
squirrel credits. The wall also prints the balance again (it never did: the number was read from the wrong place in the response). - After a published audit of a site on a recurring schedule, the CLI prints one line naming the cadence and the link that turns it off. When the site wanted a schedule but the plan's scheduled-site slots are spent, the line says so instead, with the plan's limit and an upgrade link.
squirrel report --publishkeeps a bare URL on stdout and prints the line on stderr. The line renders what the cloud sends, never a guess of its own. - Leaked-secrets decodes what it scans: HTML character references,
\uand\xescapes in scripts, and base64 runs that decode to text (data URIs and SRI hashes are never decoded). AWS access key ids, GitHub tokens, JWTs (Supabaseservice_roleis high,anonis public, an expired token is a newleaked-secrets-expiredinfo check), Algolia secured keys, Stripe, Slack and Sentry tokens are decoded offline so the finding carries what the token is, and a GitHub token with a bad checksum is dropped.
Changed
- Leaked-secrets precision. Prefix patterns respect a left boundary, brand keywords must sit within 40 characters before the value, minified member keys no longer count as assignments, and public-by-design keys (PostHog, Shopify Storefront, Mixpanel, Raygun, and generic API keys under twelve public brands) report as public instead of leaks. On a private corpus of 383 real pages: 1,235 findings before, 352 after, none high. Scans are also faster.
- Leaked-secrets checked against a 197-site launch corpus. Twelve false-positive classes fixed, each paired with the real shape it must still catch: a run of
Ain a base64 payload is not a Twitter bearer token, a decoder table is not a Telegram token, a font CDN path is not a DigitalOcean key, a credential word in a ternary branch is not a key, a connection string with no password has nothing to leak, and Amplitude and Supabase publishable keys report as public whilesb_secret_keys are now caught. On the 56 sites that fired at the previous release: 172 findings before, 0 after, with no true positive lost. - The Discord bot token pattern no longer goes quadratic on long base64 runs (1.6 s to 2.5 ms on a 200 KB data URI page).
Fixed
- Reports print the page limit you asked for alongside the one the run used, so a run clamped from 10,000 to 4,320 pages no longer tells you to raise a limit that was already higher.
- Merged check messages carry their counts instead of a bare
N. When pages disagree on a count the message shows the range (3 to 6 image(s) missing alt); pages that disagree on any other number (a date, a size, a code) keep their own message instead of being merged. Digits inside words are left alone, soH1no longer readsHN. perf/bad-cachingno longer fails a page that revalidates correctly. A document served withmax-age=0orno-cacheplus an ETag or Last-Modified declares a caching policy and passes;no-store, and a validator with noCache-Controland noExpires, still do not. On the launch corpus this check failed 163 of 196 sites, most of them doing the right thing.integrity/template-discontinuityno longer calls a site's own signed-out or empty-state page "likely injected". A page that loads the site's own stylesheets or scripts is reported for review, never escalated; shared public hosts (font and script CDNs) do not count as the site's own. Escalation is now a warning rather than a failure, so one off-template page cannot zero Site Integrity, and the escalation is withheld when the crawl hit its page limit with fewer thanminBaselinePagesWhenCappedpages (default 20).
Docs
- New pages for the entity map (CLI, formats, cloud), cloud crawl scope, include/exclude patterns and authorised crawls; the rule catalogue counts refreshed.
- Scheduled audits: the docs now name every place a schedule is disclosed (report page, completion email, digest, CLI line), the resolved findings the digest lists, and what happens when a run is skipped for credits.
- Scheduled audits: a table of the five schedule states (off, active, capped, unschedulable, paused), what the dashboard shows for a site whose plan slots are spent, and how a freed slot is filled.
- Adding a website in the dashboard now asks for a scan depth (default surface) and a schedule (default weekly, on from creation); the docs page for adding a website describes both and what happens when the plan's scheduled-site slots are spent.
- The hosted MCP server's reference page lists its five entity tools, and the published API spec documents the entity export endpoint's eight formats and its new
exclude_typeparameter. - The cloud entity map docs describe the dashboard's history view: metric series across audits and the change list between two audits, with the eight change kinds it can show and the one gap it cannot yet.
Update to this version
squirrelscan will auto-update, or run this command to update now:
$