Zerowidth CleanerMeasured guides

CLAUDE WATERMARK REMOVER · DESTINATION TEST

Is a replacement callback offset a visible-character count?

No. The match after this emoji starts at UTF-16 offset two.

Tested 2 November 2026 · Synthetic fixtures · Minimal DOM

What the test establishes

The first symbol is represented by two UTF-16 code units. After cleanup joins the two Latin letters, replacement reports the position of their match using that string indexing unit. A highlight layer that counts displayed symbols instead would place the marker at a different location. Keep offsets with their declared unit and original searched string; converting to grapheme positions requires an explicit mapping rather than subtracting one for every emoji.

Reproduce the observation

Save tested-app.js and reproduce.cjs together, then run node reproduce.cjs. Compare its output with the recorded observation. The harness executes the actual homepage callback in a minimal DOM and records its resulting field values and method calls. Destination operations run in Node.js; the homepage DOM is a controlled substitute. Runtime: v24.22.1. No submitted text or genuine Claude output is used.

{
  "cleaned": "😀AB",
  "offsets": [
    2
  ],
  "output": "😀X"
}

Capability boundary

The fixture has one simple emoji and one match. It does not cover joined emoji, combining sequences or DOM selection offsets.

This Claude watermark remover edits a small selected character set. These callback observations do not establish authorship, detector scores, statistical-watermark removal or end-to-end browser behavior. For real work, keep the original and compare the exact result at its destination.

Primary material and next step

The tested first-party source snapshot and complete harness are the primary material for this page. For broader scope, read invisible Unicode versus AI watermarks, or return to the cleaner.