Remove AI Watermarks
AI watermark remover. CLI and Python library to strip visible and invisible AI watermarks (Gemini / Nano Banana sparkle, SynthID) and provenance metadata (C2PA, EXIF, IPTC) from images.
Install / Use
npx skills add wiltodelta/remove-ai-watermarksInstalls into whichever agent you are using.
README
Remove AI Watermarks
Remove AI provenance marks from images and video you generated yourself:
- known visible labels such as the Gemini sparkle and vendor text marks;
- invisible pixel watermarks through diffusion regeneration;
- C2PA, EXIF, XMP, IPTC, and related AI metadata.
Video support covers provenance identification, complete visible-plus-metadata cleaning, directory batches, visible Sora, Veo, Seedance, Dola, Hailuo, and Kling mark removal, and oracle-certified VAE regeneration for video SynthID removal.
Try it online at raiw.cc if you do not want to install Python or run diffusion models locally.
This project is for lawful use on content you own. It does not target stock agency previews or other watermarks that protect third party paid content. See scope, safety, and legal notes.
Choose what you want to do
| Goal | Command | GPU |
| --- | --- | --- |
| Find provenance signals and watermarks | identify | No |
| Remove known visible AI marks | visible | No |
| Erase a region you select | erase | No |
| Strip AI metadata | metadata | No |
| Identify supported video provenance | video identify | No |
| Remove visible marks and AI metadata from video | video all | No |
| Strip AI metadata from video | video metadata | No |
| Remove a registered visible AI mark from video | video visible | No |
| Process a directory of videos | video batch | Depends on mode |
| Remove video SynthID with the certified VAE profile | video invisible | Recommended |
| Regenerate an image to disrupt invisible watermarks | invisible | Required (CUDA) |
| Run visible, invisible, and metadata removal | all | Recommended |
| Process a directory | batch | Depends on mode |
Installation modes
| Need | Install |
| --- | --- |
| Metadata inspection and stripping | remove-ai-watermarks |
| Visible detection and removal | remove-ai-watermarks[visible] |
| Visible video processing | remove-ai-watermarks[video] |
| Video SynthID removal | remove-ai-watermarks[video,diffusion] |
| Torch-free DWT-DCT detection | remove-ai-watermarks[detect] |
| Invisible image removal (needs CUDA) | remove-ai-watermarks[qwen-zimage] |
| Every production feature | remove-ai-watermarks[all] |
Lower-level and specialized extras include pixels, heif, trustmark,
migan, lama, and diffusion. The
installation guide documents their exact
dependency composition and model requirements.
Quick start
Install the metadata-focused default CLI:
uv tool install remove-ai-watermarks
Inspect an image:
remove-ai-watermarks identify image.png
For visible watermark removal, install the pixel dependencies:
uv tool install --force "remove-ai-watermarks[visible]"
Then remove a known visible mark and AI metadata:
remove-ai-watermarks visible image.png -o clean.png
Strip metadata without running visible inpainting or diffusion:
remove-ai-watermarks metadata image.png --remove -o clean.png
Without -o this command overwrites the source in place.
Inspect or remove AI metadata from an MP4, MOV, M4V, WebM, MKV, AVI, or FLV file:
remove-ai-watermarks video metadata input.mp4 --check
remove-ai-watermarks video metadata input.mp4 --remove -o clean.mp4
The video metadata command does not transcode video or audio streams. Unlike
the image command above, when -o is omitted it writes <source>_clean and
preserves the original. MP4 and MOV
inspection includes the native TC260 AIGC tag in
moov.udta.meta.keys/ilst, including a moov placed after the media payload.
MKV and WebM inspection reads the normative
Segment.Tags.Tag.SimpleTag placement. AVI uses LIST/INFO/AIGC, while FLV
uses script.onMetaData.AIGC. The non-ISOBMFF formats are remuxed with stream
copy for removal.
Use the product-oriented video path to identify or clean a file:
uv tool install --force "remove-ai-watermarks[video]"
remove-ai-watermarks video identify input.mp4
remove-ai-watermarks video all input.mp4 -o clean.mp4
video all removes a stable registered visible mark when present and always
strips verified AI metadata. If neither signal is found, it still writes a
same-container passthrough, so application callers get one predictable output
contract. Proprietary invisible-video removal is excluded by default.
--invisible opts into the lossy, oracle-certified video SynthID profile.
Process a directory with the same contract:
remove-ai-watermarks video batch ./videos --mode all
Remove a supported visible video mark:
remove-ai-watermarks video visible input.mp4 -o clean.mp4
remove-ai-watermarks video visible veo.mp4 --mark veo -o veo_clean.mp4
remove-ai-watermarks video visible seedance.mp4 --mark seedance -o seedance_clean.mp4
remove-ai-watermarks video visible dola.mp4 --mark dola -o dola_clean.mp4
remove-ai-watermarks video visible hailuo.mp4 --mark hailuo -o hailuo_clean.mp4
remove-ai-watermarks video visible kling.mp4 --mark kling -o kling_clean.mp4
This path scans the complete sequence before changing pixels. It accepts only a
mark that repeats at a stable position across adjacent frames, then reuses the
same OpenCV, MI-GAN, or LaMa fill backends as image removal. Audio is copied
without re-encoding and is allowed to reach its natural end; the video stream
is transcoded because its pixels change. By default, a guarded optical-flow
pass motion-aligns the preceding accepted fill and blends it only when the
nearby source context agrees; use --no-temporal-consistency to disable it.
The encoder preserves supported
8-bit source chroma sampling, color tags, and MP4/MOV track timescale instead
of relying on ffmpeg's implicit raw-BGR defaults. Variable frame intervals are
preserved through a timestamped in-memory NUT bridge instead of being flattened
to the average frame rate. Non-zero source start timestamps are retained
together with the copied audio offset. The default --mark auto
scans all providers in one decode pass and selects the first stable match in
the specificity order shown below. Pass an explicit mark to restrict detection
to one provider.
Sora covers the moving Sora 2 mascot and wordmark. Veo covers both the current
four-point diamond and the legacy Veo text. Seedance covers the fixed boxed
AI label, Dola covers the fixed Dola AI text, Hailuo covers the composite
MINIMAX | hailuo AI label, and Kling covers the bottom-right KLING AI
label with its version suffix. A completed encode is published atomically. No
output is written when no stable mark is found.
HDR, PQ/HLG, and greater-than-8-bit inputs are rejected before encoding rather
than silently reduced through OpenCV's 8-bit BGR boundary.
Remove video SynthID:
uv tool install --force "remove-ai-watermarks[video,diffusion]"
remove-ai-watermarks video invisible input.mp4 -o clean.mp4
This path regenerates the complete sequence with one latent-noise field shared
across time, copies complete audio, strips source metadata, and publishes the
completed encode atomically. The default noise_std=0.15 profile passed both
the two-carrier calibration and a complete public eight-second Veo oracle
check. Google does not publish a local decoder, so a fresh provider check
remains useful for unusually important files or after provider changes, but it
is not a product result state.
For invisible watermark removal, install the qwen-zimage extra. An NVIDIA GPU
is required: both profiles are CUDA-only, and there is no CPU or MPS fallback.
uv tool install --force "remove-ai-watermarks[qwen-zimage]"
remove-ai-watermarks invisible image.png -o clean.png
If the local detectors cannot confirm an invisible watermark but you know the
image came from an AI generator, add --force:
remove-ai-watermarks invisible image.png -o clean.png --force
See the installation guide for Homebrew, uv, optional features, and development setup.
Examples
Visible Gemini mark
| Before | After |
| --- | --- |
|
|
|
High quality invisible removal
qwen-zimage is the default profile: a Qwen-Image-2512 Lightning pass under Canny
ControlNet, followed by SAM-masked Z-Image repair of any detected face. The
alternative, sdxl-zimage, swaps the global stage for SDXL and keeps the same face
stage. Both are CUDA only.
uv tool install --force "remove-ai-watermarks[qwen-zimage]"
remove-ai-watermarks invisible image.png -o clean.png --force
| OpenAI example before | OpenAI example after |
| --- | --- |
|
| [
](docs/images/qwen-zimage/C
Related Skills
python-debugpy
385.5kDebug Python with pdb, breakpoint(), post-mortem inspection, and debugpy remote attach.
skill-creator
385.5kCreate, edit, audit, tidy, validate, or restructure AgentSkills and SKILL.md files.
qqbot-channel
385.5kQQ channel management skill. Use qqbot_channel_api for explicit QQ channel-management requests; confirm write, delete, and bulk actions before calling authenticated QQ Open Platform endpoints.
claude-opus-4-5-migration
140.7kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
