CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Will cleaning Base64 text remove a hidden character inside it?
No in our valid Base64 fixtures. Encoded ASCII stays unchanged; decoding still exposes U+200B. A literal U+200B outside the payload is removed, which is a different layer.
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. The invisible-checkbox state and dash mode appear 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 |
|---|---|---|---|
| Encoded hidden payload direct string / keep / invisible true | "QeKAi0I="U+0051 U+0065 U+004B U+0041 U+0069 U+0030 U+0049 U+003D | "QeKAi0I="No selected invisible characters found | {"decoded":"AB","decodedCodepoints":["41","200b","42"],"encodedCharacters":8}{"decoded":"AB","decodedCodepoints":["41","200b","42"],"encodedCharacters":8} |
| Encoded plain payload direct string / keep / invisible true | "QUI="U+0051 U+0055 U+0049 U+003D | "QUI="No selected invisible characters found | {"decoded":"AB","decodedCodepoints":["41","42"],"encodedCharacters":4}{"decoded":"AB","decodedCodepoints":["41","42"],"encodedCharacters":4} |
| Marker outside payload direct string / keep / invisible true | "QUI="U+0051 U+0055 U+0049 U+003D U+200B | "QUI="Removed 1 invisible character | {"decoded":"AB","decodedCodepoints":["41","42"],"encodedCharacters":5}{"decoded":"AB","decodedCodepoints":["41","42"],"encodedCharacters":4} |
Inspect the payload and wrapper independently
Our first fixture is produced by encoding the UTF-8 bytes for A, U+200B and B. It contains no literal selected character at the input layer, so cleaning preserves its Base64 spelling. Decoding the result still returns the hidden character. The plain AB reference also remains unchanged and decodes to AB. The third fixture appends a literal U+200B to the plain encoded string: the cleaner deletes that appended marker. These outcomes distinguish a marker in decoded content from one in the wrapper string.
Decoder behavior belongs to the recorded runtime
The observer uses Node Buffer, whose Base64 decoder is permissive for some non-alphabet input. The third fixture records that runtime result; it does not demonstrate acceptance by a strict API. Neither the cleaner nor the harness authenticates the payload, recognizes an attachment type or checks a signature. Decoding arbitrary Base64 as UTF-8 may lose information when the payload is binary. We encoded known text ourselves and tested these three inputs only, without transferring or opening a remote payload.
Decode only when the format permits it
Keep the encoded original and identify the declared content type. For known UTF-8 text, decode to a working copy and inspect that copy before a selective edit. If editing is required, re-encode through the same format and verify the destination. Do not edit encrypted, compressed or signed content based on visual similarity. This page provides a representation test, not a generic Base64 validator or a watermark decoder. The homepage processes the string presented to it and performs no Base64 decoding.
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
Node.js Buffer Base64 encoding 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.