Claude’s Watermark Is Made of Characters You Cannot See, and the Remover Ships as a Claude Skill

Evidence note: This article rests on three kinds of material, and they are not equal. Press reporting on Anthropic’s watermarking plans is cited to the outlets that published it, not to a vendor release — no official Anthropic statement is quoted here. Technical claims about how the watermark is built, and about what the tools circulating against it actually do, come from public repository descriptions and blog posts that have not been independently reproduced; each is marked where it appears. Figures about Claude’s behaviour in day-to-day engineering work are Vision’s own run records and PlayAgit’s own publishing pipeline, attributed with date and sample size — internal measurements, never independent verification of anyone’s claims. Definitions of Unicode code point ranges are from the standard itself and need no hedge; the assertion that any of those ranges carries a Claude watermark does.

What Anthropic Is Marking: Hidden Characters in Text, Content Credentials in Images and Files

The reporting that started this is narrow. The Verge described Anthropic as moving to watermark Claude’s output across text, images and files, with C2PA Content Credentials on the media side, and trade coverage framed the text side specifically as invisible marks on generated text and files. Both accounts describe plans and direction.

What neither establishes is mechanism. The widely repeated claim — that the text watermark is implemented as hidden invisible Unicode characters embedded in the generated output — is not corroborated by any primary technical document reviewed for this article (evidence level: secondary reporting plus community inference, no vendor specification). It is the kind of claim that sounds settled because it is repeated often, and it is treated here as open.

The split between the two halves matters more than the mechanism, because the halves behave differently. Content Credentials on an image are a signed manifest attached to a file: inspectable, verifiable, and removable by anyone who can rewrite the file. A mark inside prose has no container to sign. Whatever Anthropic is doing to text, it has to survive copy-paste into an editor that keeps no metadata at all.

The Code Points Involved: Zero-Width, Bidi, Tag, Private-Use and Reserved Ranges Including U+200B–U+200F, U+2060–U+2064 and U+FEFF

The ranges named in community discussion are real and well specified in Unicode, independent of anyone’s watermarking theory:

  • U+200B–U+200F — zero-width space, zero-width non-joiner, zero-width joiner, and the left-to-right and right-to-left marks. The joiners are load-bearing: U+200D is what fuses emoji sequences and what connects letters in Arabic and Indic scripts.
  • U+2060–U+2064 — word joiner and the invisible mathematical operators (times, separator, plus). Zero advance width by design.
  • U+FEFF — zero-width no-break space, the same code point used as a byte-order mark.
  • U+202A–U+202E and U+2066–U+2069 — bidirectional embedding and isolate controls, the family behind the "Trojan Source" class of source-code attacks.
  • U+E0000–U+E007F — tag characters, a plane-14 block that mirrors printable ASCII invisibly and can carry an arbitrary hidden string.
  • Private-use areas — U+E000–U+F8FF and the two supplementary planes, where any assignment is by private agreement and no renderer can object.

That inventory is a fact about Unicode. The step from it to "this is where Claude’s watermark lives" is the unconfirmed one (evidence level: inference from tool behaviour, not from a published specification). The honest reading is that the tooling strips these ranges because they are the ranges where a text watermark could hide — which is not the same as evidence that one does.

The consequence for anyone writing a stripper is immediate: U+200D and U+200C cannot be deleted blindly without breaking emoji and several writing systems. Tool authors say they handle this; that preservation claim is itself unverified here (evidence level: repository self-description).

Why This Lands on Vision’s Own Work: 1,644 Claude Runs Between 17 August and 7 October 2026

The provenance question stops being abstract the moment a model writes code that gets committed. Vision’s own operator run records cover 1,644 runs that touched Claude between 2026-08-17 and 2026-10-07, and in those runs 1,435 left changes behind — 50,599 changed paths and 743 commits in total, as recorded on 2026-10-07 (Vision’s own ledger, n=1,644; internal measurement, not an independent benchmark of anything).

Those commits are now ordinary repository history. If invisible code points were present in generated text, nothing in that pipeline would have flagged them: a diff viewer shows no glyph, a linter configured for style shows no violation, and a reviewer reading the rendered file sees clean prose. The exposure is not dramatic — it is that a provenance mark and a parser bug look identical when neither is visible.

For the same reason the risk is not theoretical for anyone shipping model-written code, documentation strings, or JSON fixtures. A zero-width character inside an identifier, a YAML key, or a translation catalogue is a defect long before it is a policy question.

A Remover That Installs as a Claude Skill — and Takes the Content Credentials, EXIF and Generator Tags With It

A cluster of public repositories now addresses this, and their titles say what they do: claude-watermark-remover, watermarks-remover, MarkClean, claude-watermark, claude-bleach, a second remover from the same author as one of the above alongside its sibling project, a guide repository, and detection-side tools including a text inspector and an AI text watermark audit. A hosted service and a technical blog post on Claude text watermarking sit in the same space.

Four things are claimed across these projects, and all four are unverified here:

  1. That the tools detect and strip an invisible-character watermark specific to Claude (evidence level: repository self-description; no reproduction attempted for this article).
  2. That they run fully locally, with no API key and no hosted dependency (same level — plausible for pure code point filtering, unverified as shipped).
  3. That the stripping extends past Unicode into C2PA Content Credentials, EXIF and XMP fields, and generator tags (same level).
  4. That at least one is distributed as an installable Claude skill that both strips hidden marks and rewrites statistically "AI-looking" phrasing (same level, and the most consequential of the four).

That last point is worth sitting with. A packaging format designed to extend the assistant becomes the delivery mechanism for undoing the assistant’s own provenance marking — if the claim holds. PlayAgit has written about this packaging path before in an earlier piece on the remover shipping as a Claude skill and taking C2PA credentials out with it.

The metadata half, if accurate, is the sharper edge. Content Credentials are the part of the stack that actually works — a signed, inspectable manifest. A tool whose convenience feature is "also clears the EXIF and generator tags" removes an attribution a photographer or an archive may depend on, with no signal that it happened.

What Stripping Cannot Reach: Token-Distribution Watermarks and Removal That Is Only Best-Effort

Deleting a code point is deterministic. Either U+200B is in the string or it is not. A statistical watermark — one that biases which tokens the model selects, so the mark lives in the distribution of ordinary words rather than in any single character — has no such target. There is nothing to delete; there is only text to perturb until a detector’s confidence falls.

Tool authors acknowledge this asymmetry, describing statistical removal as best-effort while treating invisible-character and metadata stripping as reliable (evidence level: project claims, not reproduced). The distinction is coherent on its face, and it is the reason the "rewrite statistical patterns" feature appears bundled with the stripper: paraphrasing is the only available lever.

The claim that any of this can be settled by reproducible local analysis of generated text is also open (evidence level: proposed method, not an executed study). It is, however, the right shape of test — and the shape PlayAgit has not run.

The Same Invisible Ranges Are Also an Injection Path Into Agents That Fetch the Web

The security framing arrived alongside the provenance framing, and it is the more durable of the two. An agent that fetches a page and feeds the text to a model will read invisible code points as instructions if instructions are what they spell. Tag characters are purpose-built for this: a plane-14 sequence mirroring ASCII is a complete hidden sentence that no screenshot and no human reviewer will catch. A sanitising fetch layer for MCP tool use exists for exactly this reason.

This inverts the tooling’s direction of travel. The same filter is a watermark remover when pointed at output and a prompt-injection defence when pointed at input. The code is close to identical; only the threat model differs. For anyone running agents against untrusted pages, the input-side case needs no watermarking debate to justify it — strip or escape the invisible ranges before text reaches a model, and log what was removed.

The Ranking Story Never Mentions Provenance: Experience Signals, Backlinks, and the Second Job of Being Quoted

A commercial argument has attached itself to the watermark story: that marked or AI-sounding text will be penalised in search. The content marketing material making that case attributes ranking outcomes to experience and authority signals rather than to any embedded marker (one such vendor account; evidence level: vendor claim, commercially interested, uncorroborated). Published accounts of ranking factors reviewed here likewise centre on links and technical checklists — the literature on competitor backlinking is representative — with no watermark or provenance signal appearing among them (evidence level: absence in the material reviewed, which is weaker than a search engine’s denial).

Separately, practitioner tooling now treats visibility as two jobs rather than one: ranking in search, and being quoted by assistants (a skills repository organised along exactly that split; evidence level: practitioner framing, not a measured result).

Read together, the useful conclusion is deflationary. No reviewed source connects an embedded provenance mark to a ranking penalty. The incentive to strip watermarks is better explained by not wanting the label than by any demonstrated traffic cost — and a stripper sold on an unproven SEO premise is still a stripper.

Regulatory pressure is the other half of the context. A page on OpenAI’s site is cited for the position that text provenance is driven by European rules, with detection access opened to researchers first (evidence level: single source, not independently cross-checked here). If that is the shape of the mandate, watermarking is a compliance artefact before it is a product feature, which is a poor fit for a market that treats it as a blemish.

Developer Takeaway, and the Scan of Those 50,599 Paths That Has Not Run Yet

Four things are actionable without resolving a single open question:

  • Sanitise model input, not just output. Filtering the invisible ranges before untrusted text reaches a model is justified by the injection case alone.
  • Make invisible code points a CI failure in source trees. A zero-width joiner in an identifier or a config key is a bug regardless of where it came from.
  • Do not let a watermark tool clear your media metadata as a side effect. If the metadata-stripping claims hold, that is destruction of attribution with no audit trail.
  • Keep provenance questions out of SEO decisions until something stronger than vendor copy connects them.

The test this article does not contain is the obvious one: scan those 50,599 changed paths for code points in the ranges above, by range and by date, and see whether anything is there. That is a proposed follow-up, not a finding. Nothing in it has been run.

Implementation Note

What Vision’s records can show is the shape of Claude’s working footprint — not whether a watermark exists in it.

Across Vision’s own operator runs that touched Claude (n=1,644 runs, 2026-08-17 to 2026-10-07, counted on 2026-10-07), wall-clock time per run ranged from 0.0 to 60.5 minutes with a median of 6.7 minutes across all 1,644 timed runs, over a median of 19 tool turns; all 1,644 ran through the claude CLI. That is the surface a provenance mark would have to travel through: a terminal session, not a chat window with a file download.

The same run records show 104 of those 1,644 runs ending in an error — ‘ResourceBudgetExceeded’ 42 times, a session-limit message 11 times, ‘RuntimeError’ 10 times — and 57 runs in which the permission gate refused 316 commands outright (Vision’s own ledger, n=1,644, as of 2026-10-07). PlayAgit has examined that failure distribution before in an earlier count of Claude errors across Vision’s own runs, and in a piece on where an in-editor Claude agent would hit the same limits.

Of those runs, 1,435 left changes behind: 50,599 changed paths and 743 commits (same ledger, same window, as of 2026-10-07). Alongside them, Vision’s own engineering log holds 58 measured-and-fixed entries that name Claude, spanning 2026-08-11 to 2026-10-06, the three most recent dated 2026-10-05, 2026-10-05 and 2026-10-06 (as of 2026-10-07).

On the publishing side, PlayAgit’s own research pipeline (n=81 runs, 2026-08-28 to 2026-10-06, as of 2026-10-07) covered 45 distinct subjects naming Claude, researched into 208 dossiers holding 2,433 claims — of which 196 were cross-checked. The quality gate reviewed 40 drafts from that work: 27 published, 10 sent back to revise, 3 rejected.

That last ratio is the honest summary of this subject’s evidentiary state. Out of 2,433 claims gathered about Claude, 196 cleared cross-checking — roughly 8 percent (derived from the two figures above). The watermark claims in this article sit in the other 92 percent, which is why every one of them is marked as open rather than written as settled.