
Treasury Desk
A browser-local crypto treasury demo with payment proposals, two-of-three approvals, revision history, simulated execution and a ledger that records the result.
A command-line tool for catching crawl and indexing problems when a website changes. It checks built files or pages fetched from a live or preview site, and compares scans so you can spot problems before a release.

A site can look perfectly fine while telling search engines several different things. The sitemap includes a page, but that page says not to index it. A canonical points somewhere unexpected. Internal links still take the scenic route through old redirects. The build passed, though, so everything must be fine. Probably.
CrawlContract checks how those pieces fit together: sitemaps, robots rules, canonical URLs, redirects, internal links and language references. When it finds a contradiction, it shows the affected URLs and the evidence behind the finding, so you have somewhere useful to start fixing it.
You can also save a scan and compare it with the next one. That helps catch changes that are easy to miss during a redesign or template update: fewer pages marked as indexable, missing headings, less content or disappearing internal links. Some of those changes might be intentional. The point is to make them visible before they become a surprise.
It’s written in Rust and can run locally or as part of your automated build checks. You choose which findings should fail a check, set thresholds for changes, and add exceptions where they make sense.
It’s still early in development. Right now, it works with built files and the HTML a server returns, without running JavaScript. Particularly useful when you’re changing how a site is generated and want to check that the less visible parts still make sense.
This release adds baseline comparisons to scans, detailed JSON diff reports, and new canonical, sitemap coverage, and hreflang indexability checks.
scan --baseline SNAPSHOT runs the CC-DIFF-LOSS-*
rules alongside the normal rule set and reports lost, gained, and changed
URLs in terminal, JSON, and Markdown reports.scan --fail-on-new, which exits 1 only for findings the baseline scan does
not already contain. Findings are computed by running the same rule set
against the baseline, so "new" means new since that baseline rather than new
since the installed tool version.json output now includes a diff object with
lost_urls, gained_urls, changed_urls, per-URL change details,
counts, indexable_urls (baseline, candidate, delta), and baseline
provenance. Previously diff --format json emitted only findings, so the URL
lists never reached a machine-readable consumer."new": true or "new": false in JSON output from
scan --baseline.CC-SITEMAP-COVERAGE-001: an indexable, verified HTML page is missing from
every sitemap. This is the inverse of the sitemap indexability family, which
only checked declared URLs. Scans with no sitemap data are out of scope.CC-CANONICAL-PRESENCE-001: an indexable page declares no canonical in HTML
or in the HTTP Link header. The existing canonical rules only compared
canonicals that existed. Both this rule and CC-SITEMAP-COVERAGE-001 only
consider responses that were parsed as HTML, so a 200 response for an
image, stylesheet, or font is never reported as a page without a canonical.CC-HREFLANG-INDEXABILITY-001: an hreflang target returns a non-200 status,
is blocked by robots.txt, or carries noindex. Robots-blocked targets are
reported even when they cannot be fetched. Canonical mismatches stay with
CC-HREFLANG-CANONICAL-001.--user-agent, --header NAME: VALUE (repeatable),
--timeout, and --crawl-delay. Custom headers are restricted to the crawl
origin; use --user-agent to set the crawler identity consistently.rules::registry as the single source of truth for policy
validation and SARIF rule metadata.diff --fail-on for parity with scan.crates-io release job that publishes on version
tags when CARGO_REGISTRY_TOKEN is configured.cargo audit on pushes and on a weekly schedule, verifies that
VERSION matches Cargo.toml, runs cargo package --locked, and tests on
macOS in addition to Linux and Windows.robots.txt groups are selected by the configured user-agent: the longest
User-agent token contained in the crawler's user-agent string wins, with
* as the fallback. Crawl-delay is read from the matched group.robots.txt for the configured user agent instead of
the wildcard group only.helpUri, a detail property,
and partialFingerprints so consumers can track one finding across runs.RobotsTxt::parse and static_dir::build_snapshot take a
user-agent argument; findings_to_markdown takes an optional diff summary;
LiveScanConfig includes a headers field.User-agent groups were parsed and then discarded, so a site that
restricted a specific crawler by name or listed crawlcontract explicitly
was evaluated against the wrong rules.Crawl-delay was ignored unless it appeared in the User-agent: * group.External download
External download
Added
Fixed
robots.txt rules with allow-wins ties.Changed
CC-CANONICAL-CONSISTENCY-002; sitemap/canonical mismatch is
reported once as CC-SITEMAP-INDEXABILITY-003.External download
cargo fmt formatting to source files that were inconsistent with
the project's default rustfmt style.External download
scan, diff, output formats, snapshot file
writing, policy application, and error handling.External download
crawlcontract scan https://example.com.
Supports bounded concurrency, configurable --max-pages, redirect chain
tracking, robots.txt crawl-delay respect, and sitemap discovery from
robots.txt sitemap directives.--max-pages and --concurrency CLI flags for the scan subcommand.External download
./dist and extracts HTML signals.<link rel="canonical">, <meta name="robots">,
<link rel="hreflang">, internal links, and redirect targets.robots.txt parser with allow/disallow evaluation.scan and diff subcommands and CI-friendly exit codes.example.test fixtures covering all rule scenarios.External download