What we tested
We installed the skill from commit 5a62be6 into a project folder with two files we made ourselves. The first was a 1200×800 JPEG with a C2PA manifest, signed with the C2PA test certificate, that declares the image AI-generated, plus AI labels in its EXIF, XMP and IPTC metadata. The second was a 46-word English note carrying 15 hidden or unusual characters: zero-width spaces and joiners, a word joiner, a byte-order mark, three Unicode tag characters that spell "AI", and five look-alike spaces. We asked Claude Code on Claude Opus 5.5 to inspect both, clean them into a separate folder and leave the wording alone, and to start the service itself. Then we checked the outputs with exiftool, c2patool and a code-point count, not just the agent's word.
What we found
- The metadata really went. All 20 XMP, EXIF and IPTC tags and the C2PA manifest were gone; c2patool found no claim at all. The pixels were byte-for-byte the same after decoding. The inspect step had listed every label first, including that the manifest appeared twice in the file.
- Every hidden character went, and no words changed. The note dropped from 291 to 249 bytes and became plain ASCII. It matched, exactly, the copy we built ourselves by removing the invisible characters and normalising the spaces.
- The text route expects a rewrite. Since v0.7.0 the service rewrites text after removing hidden characters, and with no rewrite model configured it refused the .txt file. The agent worked around it by sending the note as Markdown, which cleans characters only, and said so plainly in its report.
- The rewrite half is unverified. We didn't configure Layer B. Even if we had, there's no public detector for Claude's, OpenAI's or Gemini's text watermarks to test against, which the README itself says.
- It handled the setup on its own. It cloned the repository, found port 8765 taken by another process, ran the service on 8766 instead, and stopped it at the end. The whole run took 1.5 minutes.
Limitations
- It removes disclosure labels. C2PA, IPTC's AI source type and similar fields are how AI tools say content is machine-made, and laws such as the EU AI Act's Article 50 and many platforms' rules expect that to stay visible. Use it on content you own and may share unlabelled; the project's ethics note says the same.
- Layer B is unverified. We did not test the rewrite. The README calls it best-effort, warns that it degrades the writing, and says no tool can certify a vendor detector will fail.
- It needs a local service. The skill does nothing on its own. You run a Python service, locally or in Docker, and the agent talks to it over HTTP. Optional backends for pixel watermarks, SynthID scoring and Layer B add large models and dependencies.
- It ships a watermark-stealing module. The repository's stealer folder estimates which tokens a text watermark favours by querying a watermarked model at scale, for use by a paraphraser. The author frames it as robustness research; the skill doesn't call it, and we didn't run it.
- Pixel and soft-bound marks can survive. A metadata strip doesn't touch a watermark inside the pixels. C2PA soft binding can also link a stripped image back to its manifest online.

