CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Will cleaning a URL remove percent-encoded hidden characters?
An actual U+200B in a URL path is deleted; its ASCII percent encoding %E2%80%8B survives. Compare the decoded path before deciding which route is intended.
Open the Claude text cleaner · Full measured data
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. Invisible removal is enabled; the dash mode appears in each row. The observations below test this page's specific question. We make no detector-score or statistical-watermark removal claim.
| Fixture and mode | Input string and code points | Output and cleaner status | Observed before / after |
|---|---|---|---|
| Literal path direct string / keep | "https://example.test/review"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+0074 U+0065 U+00 … | "https://example.test/review"Removed 1 invisible character | {"serialized":"https://example.test/re%E2%80%8Bview","path":"/re%E2%80%8Bview","decodedPath":"/review","isReview":false}{"serialized":"https://example.test/review","path":"/review","decodedPath":"/review","isReview":true} |
| Encoded path direct string / keep | "https://example.test/re%E2%80%8Bview"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+0074 U+0065 U+00 … | "https://example.test/re%E2%80%8Bview"No selected invisible characters found | {"serialized":"https://example.test/re%E2%80%8Bview","path":"/re%E2%80%8Bview","decodedPath":"/review","isReview":false}{"serialized":"https://example.test/re%E2%80%8Bview","path":"/re%E2%80%8Bview","decodedPath":"/review","isReview":false} |
| Ordinary route direct string / keep | "https://example.test/review"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+0074 U+0065 U+00 … | "https://example.test/review"No selected invisible characters found | {"serialized":"https://example.test/review","path":"/review","decodedPath":"/review","isReview":true}{"serialized":"https://example.test/review","path":"/review","decodedPath":"/review","isReview":true} |
The route distinction in our fixtures
The literal path and percent-encoded path serialize to the same encoded pathname before cleanup. Our homepage deletes the actual character from the first input, so that output parses with /review as its path. The encoded input contains ordinary ASCII percent signs, hex digits and letters; none belongs to the deletion map. Its decoded path still contains U+200B after cleaning. The clean reference stays unchanged. These measurements separate a text transformation from the subsequent URL parser and percent decoder.
A URL parser is not a route validator
The test uses the WHATWG URL implementation in the recorded Node runtime and a reserved example.test host. It makes no HTTP request to that host. A parseable URL can point at a nonexistent route, and a server can treat an encoded path differently from its decoded representation. We have not tested your router, redirects, reverse proxy or signed URL verification. The evidence establishes the exact strings at each stage; it does not establish that either spelling reaches the intended resource.
Repair a link with its destination in view
Keep the original link, inspect its parsed pathname and compare it with a known destination. If an accidental code point is present, change only the intended path component and rebuild the URL with a URL API. Do not decode the entire URL and then delete characters: escaped delimiters may become structural delimiters. Check query values and fragments separately, and verify the final link in its actual application. The homepage cleaner neither percent-decodes URLs nor chooses routes.
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.cjsReference 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.