humans.txt generator
humans.txt generator: build a humans.txt file with TEAM, THANKS and SITE sections from the humanstxt.org template. Free, runs in your browser.
Canonical chain and loop checker: paste url -> canonical pairs, follow every hop and catch loops and multi-hop chains. Free, runs in your browser.
Runs entirely in your browser. Nothing you enter is uploaded, logged or stored.
This tool resolves the pairs you paste; it cannot fetch pages across origins to read their rel="canonical" tag itself, so collect each hop by hand first (view source, or your crawler's canonical export).
Google’s documentation recommends adding a self-referential rel="canonical" to the canonical
page itself, and it treats every declared canonical as a hint rather than a rule. A chain breaks
the first idea: page A points to B, B points to C, and only C references itself. A loop breaks it
completely: A points to B, B to C, and C back to A, so no page in the set ever says “index me”.
Neither shows up when you check canonical tags one page at a time.
It reads each pasted line as url -> canonical, parses both sides with the browser’s URL
parser, and builds a lookup from every left-hand URL to its target. Lines without exactly one
arrow, or with a URL that does not parse, are reported by line number. Then it walks from the
start URL you choose, one hop at a time, and stops at the first of:
The walk is capped at 25 hops so a malformed paste cannot freeze the tab. Google publishes no chain-length limit for canonicals, because chains are not a pattern its documentation recommends.
The hop list numbers each URL from 0, the start, in the order followed. Below it, a verdict with a Pass, Warning or Problem badge:
| Result | Badge |
|---|---|
| Self-referencing, no chain (0 hops) | Pass |
| 1 hop to a self-referencing canonical | Pass |
| 2 or more hops to a self-referencing canonical | Warning |
| 1 hop, ends outside the pasted set | Pass |
| 2 or more hops, ends outside the pasted set | Warning |
| Loop detected | Problem |
A one-hop result that ends outside the set only means the final URL was not pasted. Add a line for it, ideally showing it pointing to itself, and the chain can be confirmed.
The tool loads with four pairs built around the tracked dress URL Google uses as its example:
https://example.com/dresses/cocktail?gclid=1 -> https://example.com/dresses/cocktail
https://example.com/dresses/cocktail -> https://example.com/dresses/party
https://example.com/dresses/party -> https://example.com/dresses/formal
https://example.com/dresses/formal -> https://example.com/dresses/cocktail
Starting from the tracked URL, the hop list reads 0 the ?gclid=1 URL, 1 cocktail, 2 party, 3
formal, and 4 cocktail again, marked “(back to hop above, a loop)”. The verdict is Loop detected,
with a Problem badge. The tracked URL did its job, but the clean URL it pointed to never settles.
Change the last line to https://example.com/dresses/formal -> https://example.com/dresses/formal
and the verdict becomes “3 hops to a self-referencing canonical”, a Warning. The fix is to point
the tracked URL, cocktail and party straight at formal.
/page versus /page/ shows up as ending outside the set.A chain is when page A's rel=canonical points to page B, and page B's own canonical points on to page C instead of to itself. Each duplicate should point straight at the final URL, and that final URL should carry a self-referencing canonical.
A browser page cannot read another origin's HTML through a plain fetch call without that origin explicitly allowing it with CORS headers, which most sites do not set for arbitrary pages. Pasting the pairs sidesteps that limit entirely.
It is not against any explicit rule, since Google's documentation does not name a maximum chain length. It is still unnecessary indirection once the final URL is known, and it hides a loop until someone walks the whole chain.
The resolver stops and flags a loop the moment a hop points at a URL already visited earlier in the same walk, including two URLs that simply point at each other.
Each URL is normalized by the browser's URL parser, which adds a slash to a bare domain but otherwise keeps paths as typed. So /page and /page/ are two different URLs here, just as they can be two different URLs to a crawler.
humans.txt generator: build a humans.txt file with TEAM, THANKS and SITE sections from the humanstxt.org template. Free, runs in your browser.
Image lazy loading checker: paste HTML to test every img tag for width and height, lazy loading on the likely LCP image. Free, runs in your browser.
Noindex, canonical and sitemap conflict checker: see where one page's three signals contradict Google's own guidance. Free, runs in your browser.
Open Graph tag checker: tests pasted og meta tags for the four required properties, relative URLs, duplicates and og:type. Free, runs in your browser.