CLI tool
wiltodelta/remove-ai-watermarks avatar
wiltodelta/remove-ai-watermarks

remove-ai-watermarks: A CLI and Python Library for Stripping AI Provenance from Your Own Images and Video

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.

5,557 stars516 forksPythonApache-2.0

At a glance

What is it?
This Apache-2.0 Python tool removes visible AI labels, invisible pixel watermarks, and C2PA/EXIF/IPTC metadata from images and video. It is aimed at creators cleaning their own generated content, with a clear boundary against third-party paid content.
Who is it for?
Adopt remove-ai-watermarks if you generate images or video with AI tools and need a scriptable, offline way to remove your own visible marks, invisible SynthID, and provenance metadata across many formats. Do not use it for stock agency previews or any content you do not own, as the project explicitly excludes third-party paid watermarks.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What It Removes and Who It Serves

The project targets three distinct layers of AI provenance. First, visible labels such as the Google Gemini sparkle and vendor text marks. Second, invisible pixel watermarks like SynthID, which are disrupted through diffusion regeneration rather than simple cropping. Third, metadata blocks: C2PA, EXIF, XMP, IPTC, and related AI tags. The intended user is someone who generated the content themselves and wants to clean it before distribution. The README is explicit that it does not target stock agency previews or other watermarks protecting third-party paid content. That boundary is not a legal disclaimer; it is a functional scope statement. The tool is built around a command set that separates inspection from modification, so you can see what is present before changing anything.

Command Structure and the Identify First Workflow

The CLI exposes a set of subcommands, each with a narrow job. identify scans an image for provenance signals and watermarks without requiring a GPU. visible removes known visible AI marks using inpainting. erase removes a region you select. metadata strips AI metadata. invisible regenerates the image to disrupt hidden pixel watermarks, and this is the only image path that requires CUDA. The all command runs visible, invisible, and metadata removal together. The README's table makes the GPU requirement explicit: identify, visible, erase, and metadata run without a GPU; invisible requires CUDA. This design encourages a workflow where you first inspect, then decide which removal layer is actually needed. Running all on every file would be wasteful if the only issue is a C2PA manifest.

Installation Extras Control the Dependency Weight

The package uses Python extras to keep the default install light. The base install, remove-ai-watermarks, covers metadata inspection and stripping. The visible extra adds pixel dependencies for visible mark removal. The video extra brings visible video processing. The video,diffusion combination enables video SynthID removal. The detect extra provides Torch-free DWT-DCT detection. The qwen-zimage extra enables invisible image removal and requires CUDA. The all extra installs every production feature available on the active Python. Lower-level extras include pixels, heif, trustmark, migan, lama, and diffusion. The installation guide documents the exact dependency composition and model requirements for each extra. This granularity matters because a metadata-only user should not be forced to pull in a diffusion model and CUDA toolchain.

How Video Provenance Removal Works Across Containers

Video support is more involved than image handling because each container stores AI metadata differently. The README lists specific locations: MP4 and MOV use the native TC260 AIGC tag in moov.udta.meta.keys/ilst, including a moov placed after the media payload, plus QuickTime-form meta variants that Doubao's iOS export writes. MKV and WebM use the normative Segment.Tags.Tag.SimpleTag placement. AVI uses LIST/INFO/AIGC, and FLV uses script.onMetaData.AIGC. The video metadata command does not transcode video or audio streams. For non-ISOBMFF formats, removal is done by remuxing with stream copy. When -o is omitted, the video command writes a <source>_clean file and preserves the original, which differs from the image metadata command that overwrites in place. That asymmetry is a sensible safety choice for larger media files.

Visible Video Mark Removal and Temporal Consistency

The video visible command handles registered marks from Sora, Veo, Seedance, Dola, Hailuo AI, and Kling AI. You can specify the mark explicitly with --mark. The path scans the complete sequence before changing pixels, and it accepts only a mark that repeats at a stable position across adjacent frames. The fill backends are the same OpenCV, MI-GAN, or LaMa used for images. A guarded optical-flow pass motion-aligns the preceding accepted fill and blends it only when the nearby source context agrees. You can disable this with --no-temporal-consistency. Audio is copied without re-encoding and is allowed to reach its natural end, while the video stream is transcoded because pixels change. 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. This level of detail suggests the authors have encountered real-world container quirks, but it also means the video path is complex and likely to have edge cases.

Limitations and Cases Where It Is the Wrong Tool

The most obvious limitation is that invisible image removal requires CUDA. If you do not have an NVIDIA GPU, that entire feature is unavailable. The README also notes that the all command removes both the hidden pixel watermark and its linked C2PA manifest, but metadata stripping alone removes only the manifest. That means you cannot fully clean an image with a hidden watermark by running metadata alone; you must run the diffusion-based regeneration. Another limitation is the registered mark list. The video visible command only removes marks from a fixed set of vendors. If your AI tool uses a visible mark that is not in that list, the command will not help. The project explicitly excludes stock agency previews and third-party paid content, so it is the wrong tool for any image you do not own. The erase command can remove a region you select, which gives manual control but requires user intervention for each image.

Alternative Approach: Metadata-Only Stripping vs Full Regeneration

A simpler alternative is to strip only the metadata without touching pixels. Tools like exiftool can remove EXIF, IPTC, and XMP tags from images, and ffmpeg can remove metadata streams from video. The difference in approach is significant: exiftool and ffmpeg operate on the container and metadata structures directly, with no understanding of AI-specific markers like SynthID or the TC260 AIGC tag. They will remove generic metadata blocks but will not detect or disrupt an invisible pixel watermark. They also will not remove a visible sparkle or vendor text mark. remove-ai-watermarks is more targeted because it knows the specific locations and formats for AI provenance, including the QuickTime-form meta variants that Doubao writes and the NUT bridge for variable frame intervals. The trade-off is that the targeted tool is heavier and more complex to install, while a generic metadata tool is lightweight and works on any file.

Maintenance, Licensing, and Hosted Service

The repository is under Apache-2.0, which permits commercial use, modification, and distribution with attribution. The README points to a hosted service at raiw.cc that runs this library, with GPU included and nothing to install. Visible mark and metadata removal at Standard output up to 12 MP are free there; original resolution above 12 MP and invisible watermark removal are paid. The project has a recent release history: v0.34.1 on 2026-08-28, v0.34.0 on the same day, and v0.32.0 a day earlier. That cadence suggests active maintenance, but it also means the CLI surface may change between releases. The README references docs/legal-and-safety.md and docs/installation.md, which are the places to check for current scope and dependency details. The video path is particularly intricate, so upgrading versions could alter behavior in subtle ways, especially around the temporal consistency pass and the NUT bridge.

Editorial conclusion

Adopt remove-ai-watermarks if you generate images or video with AI tools and need a scriptable, offline way to remove your own visible marks, invisible SynthID, and provenance metadata across many formats. Do not use it for stock agency previews or any content you do not own, as the project explicitly excludes third-party paid watermarks. Before relying on it, verify that your specific model's mark is in the registered list, check whether your GPU meets the CUDA requirement for invisible image removal, and confirm that the video remuxing behavior (stream copy for non-ISOBMFF formats) preserves the containers you care about. Start with the identify command on a sample file to see what signals are found, then test visible, metadata, and invisible removal on a copy before touching originals.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Community notes

Community notes