Zerowidth CleanerAll measured guides

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.

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

Open the Claude text cleaner · Full measured data

Code-point comparison for CRLF

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.

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
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.cjs

Reference 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.