CLAUDE WATERMARK REMOVER · PRACTICAL TEST
Can a textarea change CRLF before the clean button runs?
Yes. Our browser textarea value reads back LF after assigning CRLF or a lone CR. The pure cleanup callback retains those original characters; the browser value layer normalizes them first.
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. Three destination checks use separately recorded browser observations; those pages explain the distinction. 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 |
|---|---|---|---|
| CRLF direct string / keep / invisible true | "A\r\nB"U+0041 U+000D U+000A U+0042 | "A\r\nB"No selected invisible characters found | {"codepoints":["U+0041","U+000A","U+0042"],"value":"A\nB"}{"codepoints":["U+0041","U+000A","U+0042"],"value":"A\nB"} |
| CR only direct string / keep / invisible true | "A\rB"U+0041 U+000D U+0042 | "A\rB"No selected invisible characters found | {"codepoints":["U+0041","U+000A","U+0042"],"value":"A\nB"}{"codepoints":["U+0041","U+000A","U+0042"],"value":"A\nB"} |
| LF only direct string / keep / invisible true | "A\nB"U+0041 U+000A U+0042 | "A\nB"No selected invisible characters found | {"codepoints":["U+0041","U+000A","U+0042"],"value":"A\nB"}{"codepoints":["U+0041","U+000A","U+0042"],"value":"A\nB"} |
| CRLF plus marker direct string / keep / invisible true | "A\r\nB"U+0041 U+200B U+000D U+000A U+0042 | "A\r\nB"Removed 1 invisible character | {"codepoints":["U+0041","U+200B","U+000A","U+0042"],"value":"A\nB"}{"codepoints":["U+0041","U+000A","U+0042"],"value":"A\nB"} |
The browser value is a separate stage
Each browser observation creates a detached textarea, assigns the exact string and reads its value back. CRLF becomes one LF, and a lone CR also becomes LF. The ordinary-LF reference remains LF. The mixed fixture retains U+200B in the textarea value before cleanup; after the pure cleaner removes that marker, assigning its CRLF output again yields LF. The table retains the original string and the callback output alongside the browser observation. This prevents crediting the cleaner with a newline conversion that actually happens in the textarea API layer before or after its callback.
Pure string preservation does not imply byte preservation
Our earlier line-ending guide correctly measured the clean callback against a minimal DOM with plain value properties. Real HTML textareas have value normalization behavior specified by the HTML Standard, so that earlier result does not by itself establish the live interface representation. The saved Chromium experiment measures this distinction using detached elements and does not change the production cleaner. It covers programmatic assignment, not clipboard formats, keyboard input, form submission or operating-system line endings. These authored strings contain known controls and are not evidence about a Claude file export. A displayed textarea is not an exact-byte file editor.
Save original bytes when line endings matter
Preserve the original file or response bytes before moving text through a textarea workflow. Compare the loaded value with those bytes at the correct decoding and normalization stages. If a destination requires CRLF or another convention, apply and verify that policy during export rather than assuming the UI preserves it automatically. The current homepage offers copied text, not a byte-for-byte transformed file. Its removal count concerns the string available to its callback. Run the downloadable browser harness to reproduce the value-layer conversion and the Node harness to reproduce raw callback retention, keeping those two claims separate in any downstream workflow.
Reproduce this test
Download the independent browser test and open it locally to rerun the destination observer. Original Chromium record identifies the browser version. The Node harness rechecks the cleanup callback and joins its outputs with those saved browser observations; it does not rerun the browser validator. Save browser-record.json beside the other downloads for that join. 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
HTML textarea value 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.