`skills/remove-ai-watermarks/` teaches a coding agent to drive the CLI on content the user generated, and refuses stock-agency and other third-party paid-asset marks. It ships with this repository rather than as a fifth release surface, and installs through `npx skills add` in any harness or as a Claude plugin from `.claude-plugin/marketplace.json`. `scripts/probe.py` measures capability rather than presence: a found binary said nothing about whether the build can run a visible-mark command, so it writes a blank PNG with zlib and struct and runs the installed `visible` and `invisible` on it. Exit 2 is a state only a working stack reaches, and `invisible` checks its extra before detection, so a signal-free image answers in 0.23s with no model download. That distinction matters: without CUDA, `all` writes nothing with the invisible extra installed and writes a useful visible+metadata result without it, and both exit 1. The skill also carries what a weak model gets wrong. It must report only what a command in the session actually did, because a run on a machine with no pixel stack produced a finished-looking removal report, complete with a size table for a file nobody wrote. It must not read exit 2 as a verdict, because Click's usage errors share that code. And it must get explicit consent before `verify-openai-synthid`, which uploads the user's image to a third party. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.6 KiB
Remove AI Watermarks
You are a principal Python engineer maintaining a CLI tool and library for removing visible and invisible AI provenance watermarks.
Scope and non-goals
The project gives users control over provenance marks on content they generated or edited themselves. It does not automatically remove stock-agency, marketplace, classifieds, tiled-preview, or other marks that protect a third party's paid or copyrighted asset.
- Add visible templates only for AI-generation labels.
- Do not add stock, agency, or classifieds marks to
watermark_registry.py. - Keep
erase --regiongeneric and user-directed; do not build an automatic stock-watermark remover on it.
Full boundary and legal context: docs/legal-and-safety.md.
How to run
uv run remove-ai-watermarks --help
bash maintain.sh
Run uv from the repository root. Command selection, options, defaults, and examples live in docs/cli.md. Before changing command routing, no-signal behavior, or exit codes, read the command-line section of docs/module-internals.md.
Configuration
GPU and ML modules are optional. Guard their imports with is_available().
Optional features and installation groups are documented in docs/installation.md. Model-running paths may use availability tests, while pure helpers in ML-adjacent modules must remain unit-tested without downloads.
Test and lint
maintain.sh runs dependency freshness and security checks, Ruff, Pyright scoped to src/, and the parallel test suite. Full-project Pyright is not the project gate because the ML dependency graph can exhaust Node memory.
This gate does NOT pass --ignore-unfixed to uv-secure, so a transitive CVE with no released fix stops it before Ruff, Pyright and the tests ever run. That is deliberate and it is not a blocker: run those three separately and report them, per the triage in docs/development.md. A red gate here is not the same signal as a red gate in a sibling repository that does ignore unfixed findings.
Command, gate, typing, and model-test invariants auto-load from .claude/rules/development.md. Environment recovery, CI behavior, and fixture policy live in docs/development.md.
Before a release, read docs/release-and-distribution.md. Treat the release as complete only after PyPI, Homebrew, the Hugging Face Space, and the ComfyUI Registry are verified; conda is not published. Keep the source-distribution public allowlist.
The published Agent Skill is skills/remove-ai-watermarks/. Update it in the same change as any CLI edit that alters commands, extras, exit codes, mark keys, or the intended-use boundary. Install and publish steps: docs/agent-skill.md.
Module architecture
docs/module-internals.md is the canonical per-module map, including design decisions, thresholds, calibration history, incident records, and regression guards. Read the relevant section before changing a subsystem.
Research and current constraints are routed through docs/index.md, especially docs/known-limitations.md, docs/supported-signals.md, docs/synthid.md, and docs/watermarking-landscape.md. Pixel photo classification is docs/photo-classify.md; it is not identify. Classifier research is split between general AI-generated image classifiers and SynthID source classifiers. Other SynthID campaign logs are docs/synthid-detector-research.md and docs/synthid-removal-research.md. The pre-split chronological archive is docs/synthid-detector-removal-plan.md.
Data safety
Follow data/README.md for public fixture, calibration, oracle, and evaluation layout. Store each tracked binary once and keep generated evaluation outputs outside the repository.
Rules and conventions
Topic-specific rules live in .claude/rules/*.md and are auto-loaded when matching files are touched.
| File | Covers |
|---|---|
development.md |
Command contracts, project gate, typing boundaries, model-adjacent tests, the docs-coverage and agent-skill parity seams, and the detection-path measurement rule |