Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Can a broken scheme be interpreted as a relative path?

Yes with our explicit base URL. A U+200B inside https prevents scheme recognition and resolves as a path on example.org; deleting it makes the result an absolute URL on example.com.

Tested October 9, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked scheme

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marked scheme
direct string / keep / invisible true
"ht​tps://example.com/x"
U+0068 U+0074 U+200B U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0063 U+00 …
"https://example.com/x"
Removed 1 invisible character
{"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/ht%E2%80%8Btps://example.com/x","href":"https://example.org/base/ht%E2%80%8Btps://example.com/x"}
{"accepted":true,"protocol":"https:","hostname":"example.com","pathname":"/x","href":"https://example.com/x"}
Absolute reference
direct string / keep / invisible true
"https://example.com/x"
U+0068 U+0074 U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0063 U+006F U+00 …
"https://example.com/x"
No selected invisible characters found
{"accepted":true,"protocol":"https:","hostname":"example.com","pathname":"/x","href":"https://example.com/x"}
{"accepted":true,"protocol":"https:","hostname":"example.com","pathname":"/x","href":"https://example.com/x"}
Retained joiner
direct string / keep / invisible true
"ht‍tps://example.com/x"
U+0068 U+0074 U+200D U+0074 U+0070 U+0073 U+003A U+002F U+002F U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E U+0063 U+00 …
"ht‍tps://example.com/x"
No selected invisible characters found
{"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/ht%E2%80%8Dtps://example.com/x","href":"https://example.org/base/ht%E2%80%8Dtps://example.com/x"}
{"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/ht%E2%80%8Dtps://example.com/x","href":"https://example.org/base/ht%E2%80%8Dtps://example.com/x"}
Relative reference
direct string / keep / invisible true
"docs/x"
U+0064 U+006F U+0063 U+0073 U+002F U+0078
"docs/x"
No selected invisible characters found
{"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/docs/x","href":"https://example.org/base/docs/x"}
{"accepted":true,"protocol":"https:","hostname":"example.org","pathname":"/base/docs/x","href":"https://example.org/base/docs/x"}

The base supplies a different destination

We deliberately supply https://example.org/base/ as the constructor base. The marked-scheme input is not recognized as the spelling https followed by a colon. It therefore becomes a relative path under that base, with example.org as its host. Cleanup joins the scheme letters and the next construction recognizes an absolute example.com URL. The ordinary absolute row already uses example.com; the retained-joiner row keeps the relative interpretation. The docs/x reference shows an ordinary relative resolution. We record protocol, hostname and pathname separately so a successful construction cannot conceal the different host.

Acceptance depends on the explicit constructor contract

A URL constructor without a base can reject inputs that a constructor with a base resolves. This experiment fixes the base and does not measure the browser omnibox, automatic search, clickable HTML anchors or a framework router. Our prior hostname guide starts with a recognized URL structure and tests host processing; this one concerns recognition before host parsing. No requests leave the local observer, and both example domains are fixture labels. The selected-character cleaner is unaware of the base. It cannot decide whether an absolute or relative interpretation represents the user intention.

Check host changes before following links

Retain the original input and document whether the application allows relative URLs. Construct both versions with the exact intended base and compare their hosts as well as paths. If cleanup changes the destination, have the originating content confirm the expected link instead of assuming the cleaner found the correct one. A parser returning a URL is not a trust judgment or evidence of a working resource. The downloadable rows make this particular fallback reproducible and identify the local runtime; they do not test every scheme, destination allowlist or browser navigation policy.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

WHATWG URL Standard provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.