Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why can a filename look like a .txt file but fail an extension check?

A hidden character can occur within or after the suffix. Cleaning U+200B repairs our exact .txt checks; a trailing non-breaking space remains. This tests names as strings, without renaming files.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for Hidden suffix fragment

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.

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
Hidden suffix fragment
direct string / keep
"report.t​xt"
U+0072 U+0065 U+0070 U+006F U+0072 U+0074 U+002E U+0074 U+200B U+0078 U+0074
"report.txt"
Removed 1 invisible character
{"extension":".t​xt","endsWithTxt":false,"equalsBaseline":false}
{"extension":".txt","endsWithTxt":true,"equalsBaseline":true}
Hidden trailing marker
direct string / keep
"report.txt​"
U+0072 U+0065 U+0070 U+006F U+0072 U+0074 U+002E U+0074 U+0078 U+0074 U+200B
"report.txt"
Removed 1 invisible character
{"extension":".txt​","endsWithTxt":false,"equalsBaseline":false}
{"extension":".txt","endsWithTxt":true,"equalsBaseline":true}
Trailing NBSP
direct string / keep
"report.txt "
U+0072 U+0065 U+0070 U+006F U+0072 U+0074 U+002E U+0074 U+0078 U+0074 U+00A0
"report.txt "
No selected invisible characters found
{"extension":".txt ","endsWithTxt":false,"equalsBaseline":false}
{"extension":".txt ","endsWithTxt":false,"equalsBaseline":false}
Baseline name
direct string / keep
"report.txt"
U+0072 U+0065 U+0070 U+006F U+0072 U+0074 U+002E U+0074 U+0078 U+0074
"report.txt"
No selected invisible characters found
{"extension":".txt","endsWithTxt":true,"equalsBaseline":true}
{"extension":".txt","endsWithTxt":true,"equalsBaseline":true}

Placement changes the original suffix

For the first fixture, path.posix.extname returns a suffix containing U+200B between t and xt. In the second, that character follows txt. Both fail an exact endsWith check before cleaning and pass afterward. The trailing non-breaking space fixture fails before and after because U+00A0 is outside our deletion map. The visible reference stays unchanged. The data records each complete extension rather than relying on how the filename looks in a file browser.

String tests are not filesystem operations

We apply the Node path parser to locally constructed names. No file is created, opened, renamed or assigned a MIME type in these tests. Windows, macOS, a cloud drive and an upload service can each apply additional filename rules. A repaired suffix does not certify the underlying file format. Our source reference documents the path API; the exact before and after values are original observations. The homepage has no batch-rename or file-content verification feature.

Validate both the name and the content

Before changing a real filename, keep the original and check that the proposed name does not collide with an existing file. Identify its format from the appropriate application or file signature rather than the suffix alone. For an upload restriction, compare the actual name accepted by the service and test a working copy. If a trailing space is intentional, decide on a name mapping explicitly. Cleaning text in this homepage only returns a new string; it does not apply that string to a filesystem object.

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

Node.js path.extname 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.