url-canonicalizer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited url-canonicalizer (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use this skill when the same page arrives as several different URL strings - one with ?utm_source=..., one with a trailing slash, one with a #section fragment, one with the query params in a different order - and you need them all to dedupe to a single key. It lowercases the scheme/host, drops default ports and a trailing-slash-only path, removes the fragment, strips common tracking params, and sorts the rest of the query, so seen.add(canonicalize(url)) actually catches duplicates.
User input:
These two links are the same article; make my seen-set treat them as one.Output:
# Copy assets/canon.py into your project, then:
from canon import canonicalize, same_page
a = "https://Example.com/Post/?utm_source=tw&ref=home#top"
b = "https://example.com/Post"
canonicalize(a) # "https://example.com/Post"
same_page(a, b) # True
seen = set()
if (key := canonicalize(url)) not in seen:
seen.add(key)
process(url)Tracking params (utm_*, fbclid, gclid, ref, ...) and the fragment are dropped, the query is sorted, and the host is lowercased, so cosmetic differences collapse to one key.
urllib.parse.urlsplit; lowercase scheme and host (but not the path - paths can be case-sensitive).Reference: assets/canon.py.
Distilled from the author's multi-source dedup pipelines. v1.0.0. See also: [[jsonl-store]], [[rss-feed-reader]], [[sqlite-state]].
→ Build the full runnable bot with Trawlkit.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.