SkillAgentSearch skills...

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-watermarks

Installs 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.

PyPI Python Downloads License Tests Sponsor

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 | | --- | --- | | Image with a visible Gemini watermark | Image after visible watermark removal |

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 | | --- | --- | | OpenAI portrait grid before qwen-zimage | [OpenAI portrait grid after qwen-zimage](docs/images/qwen-zimage/C

Related Skills

View on GitHub
GitHub Stars4.5k
CategoryContent
Updated1h ago
Forks418

Languages

Python

Security Score

100/100

Audited on Aug 8, 2026

No findings