Releases: froggeric/gemini-watermark-and-synthid-remover
Release list
v1.16.12: Gemini 3.8 support and cleaner removals
This release adds Gemini 3.8 Flash support and improves removal quality across the board.
Gemini 3.8 Flash images
Regular 3.8 outputs carry the same 48px diamond as 3.6 and are detected automatically, including images where the mark sits on white or bright parts of the picture. Detection used to fail there because a white overlay on a near-white background leaves almost nothing to match against.
Larger 3.8 outputs (around 1700px on the short side, for example 1696x2528) carry a bigger 96px diamond. Those are detected automatically too. If the mark lands almost entirely on a white or very light area, no single-image detector can see it; forcing the position with --geo-preset gemini38-2k-portrait removes it there.
Cleaner removals
The 96x96 removal masks (used for the larger 3.8 images and older Gemini generations) were recalibrated from real watermarked images instead of single captures. On dark backgrounds the old masks could leave a faint outline of the mark or a slight tone shift at its edges. Both are gone: what remains after removal now matches the surrounding image to within rounding.
Fewer false detections
Images that happen to contain a sparkle or star shape near the bottom-right corner are no longer mistaken for watermarked images. On some of those an earlier version could alter a small patch of the picture. A detected position is also double-checked at the spot where the watermark is expected before removal runs, so a look-alike shape can no longer trigger removal.
Other changes
- Large Gemini 3.6 exports such as 2400x1792 now remove their 48px mark at the correct position automatically.
- New
--geo-presetnames for hard cases:gemini36-large(2400x1792 class) andgemini38-2k-portrait(1696x2528 class), alongside the existinggemini36-portrait. wmr detectnow reports a mark found by the position search even when the confirmation step cannot confirm it, along with the match score.- Full changelog: https://github.com/froggeric/gemini-watermark-and-synthid-remover/blob/main/CHANGELOG.md
Binaries attach below when the builds finish. macOS builds are signed and notarized; every package is self-contained and runs on a clean system.
v1.16.11
v1.16.11: GPU regen by default on macOS, leftover-model reclaim, download progress fix
What was wrong
If your first wmr synthid run happened on a Mac with no models yet, it went badly. wmr downloaded 7.3 GB of CPU models, then ran on the slow CPU backend anyway. The fast CoreML path was never set up at all. The code chose the backend only after the download, and it chose CoreML only when the CoreML models were already on the disk. On a fresh machine they never are.
What happens now
The choice comes first. On a Mac that can use CoreML, auto downloads the CoreML models, about 4.7 GB, and runs on the GPU from the start. If the download fails, or you passed --regen-no-download, it falls back to the CPU backend as before.
Getting your disk back
If an older wmr already put the CPU models on your Mac, the next regen run will tell you they are no longer needed and offer to delete them. That gives you about 7.3 GB back. You can just answer the question, or run this yourself at any time:
wmr cache --clear-cpu-models
Nothing is lost either way. If you ever choose --regen-backend cpu, wmr downloads the models again.
The download screen makes sense now
It used to be hard to trust. The total was wrong, because it counted a redirect page instead of the file, so you saw things like 6.46 GiB / 1022 B 678855410%. The line spilled past the edge of the window and printed again on every tick. The ETA jumped from fifteen seconds to fifteen minutes and back. The numbers are right now. The rate is averaged over a few seconds, so it holds still, and a single line updates in place.
Nothing else changed. Watermark removal, video, and metadata work exactly as they did in 1.16.10.
v1.16.10: auto-detection on large Gemini images
v1.16.10: auto-detection on large Gemini images
Large Gemini images now detect automatically
If you made a large image with Gemini lately (for example a 2400x1792 export)
and wmr remove reported no watermark found, this release fixes that.
Recent Gemini image exports use the same small 48px diamond in the corner on
both small and large images. wmr used to choose the logo size from the
resolution, and above 1024px it assumed the older, larger 96px mark. On these
new large 48px images that guess missed the mark, so nothing was removed unless
you passed --force-small.
wmr now reads the mark's position and size from the image content instead of
the resolution. The same plain command works on every export:
wmr remove image.png -o clean.png
Older Gemini 3.5 images that carry the real 96px mark are unchanged. They
still remove exactly as before (byte-for-byte identical output), because the
small template does not match them.
Upgrading
Grab the build for your platform from the assets below. Nothing else changes:
your existing commands keep working and now also cover these large images.
v1.16.9: strip AI-provenance metadata
v1.16.9: strip AI-provenance metadata
New: remove the labels that mark an image as AI-generated (wmr metadata)
wmr can now strip the metadata that tags an image as AI-generated, without changing a single pixel. This is a separate job from removing the visible watermark or SynthID: it targets the labels and manifests attached to the file itself.
What it removes (losslessly):
- C2PA / Content Credentials manifests, the provenance standard used by DALL-E, ChatGPT, Adobe Firefly, Microsoft Designer, and Imagen
- The IPTC "Made with AI" markers that turn on the AI labels on Instagram, Facebook, and X
- The prompt and generation parameters that Stable Diffusion, ComfyUI, AUTOMATIC1111, InvokeAI, and Midjourney write into PNG files
- China's TC260 AIGC labels
The image data is copied through byte-for-byte (PNG and JPEG pixel data is untouched), so the picture is identical before and after.
How to use it:
wmr metadata image.png --dry-run # see what the file carries, change nothing
wmr metadata image.png -o clean.png # strip the AI-provenance metadata
wmr metadata folder/ -o clean/ -r # batch a whole directory
remove and synthid now do this by default. A cleaned image no longer carries its AI-provenance labels. Pass --keep-provenance to keep them.
Honest scope
- This release handles PNG and JPEG. WebP, AVIF, HEIF, JPEG-XL, and MP4/MOV are detected and passed through unchanged; they are planned for a later release.
- This is container-level: it removes labels and manifests, not pixel-level watermarks. The visible Gemini mark and the invisible SynthID watermark are handled by the existing
removeandsynthidcommands. - Removing these markers takes them out of the file. It does not erase any server-side record: the service that generated the image may still associate it with the account that created it.
Full install options and the visible-mark / SynthID / video paths are in the README.
v1.16.8
v1.16.8
Fixed: still-image diamond removal no longer leaves a faint outline
On busy images the visible Gemini diamond could be removed one pixel off, which left a faint light/shadow ridge along the diamond. The diamond is a near step edge (a flat ~0.30 overlay with a ~1px boundary), so a single pixel was visible. The position search now suppresses the background and locks onto the exact pixel, so removal is back to the exact reverse alpha-blend with no residue.
Video was not affected: it already blends about 12 frames and runs the edge cleanup.
Fixed: --rect and --geo-preset on wmr remove now work
An explicit --rect x,y,w,h or --geo-preset was being silently overridden by the position refinement, so it had no effect. They now remove exactly where you specify. Use this as the manual override when a mark is too faint for auto-detection to confirm:
wmr remove image.png --rect x,y,w,h -o clean.png
wmr remove image.png --geo-preset gemini36-portrait -o clean.png
Upgrade
No breaking changes; same command line. Binaries for macOS (Apple Silicon and Intel), Linux, and Windows are attached once the CI builds finish (about two hours; Windows is the long pole).
v1.16.7
v1.16.7
A big release. wmr now produces higher-fidelity SynthID removal, checks for new versions, gives much better progress feedback, and stops its macOS CoreML cache from ballooning. Plus a faster macOS regen, a leaner command set, and bug fixes. (This release covers v1.16.3 through v1.16.7; the previous release was v1.16.2.)
Highlights
Less lossy SynthID removal (detail-restoration)
SynthID scrubbing works by regenerating the image with SDXL, which is inherently lossy. wmr now restores much of the lost detail on the images where it is safe: after regen it patches back the highest-detail parts of the original (faces, foliage, fine lighting) through a watermark-aware filter, so output looks far closer to the original (faces come out of the uncanny valley) while still clearing Google's "Verify with SynthID." It is automatic and luminance-gated: bright/daytime images get the restoration; dark images (where the watermark stays detectable) fall back to full regen. Override with --regen-restore-detail (force on) or --no-regen-restore-detail (force off, guaranteed removal). Best-effort, not a guarantee; see the docs.
Update checker
wmr now notifies you when a new release is available (a small notice printed after your command finishes; default on). It is notify-only: it never downloads a binary or runs fetched code, and it sends zero payload (no version, OS, or id). Opt out with --no-update-check, WMR_NO_UPDATE_CHECK=1, CI, or DO_NOT_TRACK=1.
Better progress feedback
Long operations (regen, video, batch) now show clear stage-by-stage progress with per-tile / per-frame counts, rate, the backend in use (GPU or CPU), and a rolling ETA. A refreshing bar on a terminal; clean milestone lines when piped (CI logs stay readable). No more silence during a 4K regen. --no-progress suppresses it.
macOS CoreML cache no longer balloons
CoreML's compiled-model cache could grow without bound (observed at 138 GB on one machine). wmr now manages it automatically on macOS: clears it on wmr upgrades, model changes, or macOS updates, and whenever it exceeds about 6 GB. A new wmr cache --clear-coreml command clears it on demand.
Faster macOS regen
The macOS CoreML path now uses an ORIGINAL-attention UNet (about 1.2x faster, GPU-bound), and a cache fast-path fix means a re-pinned model actually reaches you instead of silently using the old one.
Breaking change
- Removed the
visiblesubcommand. Usewmr removeinstead; it is identical without--synthid-attack. The visible-watermark removal itself is unchanged.
Bug fixes
- Fixed an indefinite hang when re-downloading a regen model on a stalled network connection (now fails fast with a 30 s connect / 60 s stall ceiling).
- Fixed a multi-tile bug that silently disabled detail-restoration on images larger than 1024px (a buffer-aliasing issue; restoration is now bit-exact to the validated reference).
Full changelog
See CHANGELOG.md for the complete list since v1.16.2.
Downloads: grab the package for your platform from the assets below. macOS packages are Developer ID signed and notarized. The SynthID regen path downloads its SDXL model (~6.5 GB) on first use.
v1.16.2
v1.16.2
SynthID removal on every platform
SynthID removal is now cross-platform. --synthid-attack regen no longer needs
Apple Silicon: it now runs on Linux, Windows, and macOS Intel too. On Apple
Silicon it uses the native CoreML pipeline (fast); everywhere else it runs on the
CPU (correct, but slower). Every Gemini image can now have its invisible SynthID
watermark scrubbed.
Removal that's actually verified. We didn't ship this on theory. The default
strength (0.10) was tuned and confirmed against Google's official SynthID
verifier ("Verify with SynthID"): across a varied 9-image set, including an
image-to-image generation that carries SynthID twice, every output cleared the
watermark over two rounds of checks. We tested weaker settings and rejected them
(they miss the double-watermark case; a pure VAE round-trip clears only ~40%).
Google's verifier is manual and rate-limited (~10/day, no public API), which is
why this was careful, small-scale validation rather than an automated sweep.
We deleted what didn't work. This release also removes the old spectral
SynthID path (the FFT codebook + frequency subtractors). Measured honestly, it
scored ROC AUC 0.20 on Google-verifier-labeled images (worse than a coin
flip), and a clean codebook is inert on real content. Shipping a
"detection"/"removal" that provably doesn't work isn't honest, so it's gone. wmr
no longer ships SynthID detection at all; the only SynthID operation is the
regeneration that's actually validated.
The visible watermark is still exact. Unchanged: the Gemini / Veo /
NotebookLM visible watermark removal is the pixel-exact reverse-alpha-blend (plus
Apple-Silicon MI-GAN inpainting for NotebookLM). The SynthID regen is the only
lossy step, and only when you ask for it.
Help wanted: faster regen on Linux & Windows
CPU regen works everywhere but is slow off Apple Silicon. The Linux/Windows
binaries ship CPU-only because the sdcpp GPU backends (Vulkan/CUDA) have build
gaps we couldn't CI-validate yet. If you work with Vulkan or CUDA on ggml /
stable-diffusion.cpp, wiring and validating a GPU regen backend for
Linux/Windows is the single biggest speedup left. See Contributing in the README
and open an issue.
Getting it
Download the asset for your platform from the releases page. On first SynthID
regen, wmr downloads the SDXL model (~6.5 GB) + VAE (~335 MB) once, from the
project's own HuggingFace repo. Visible-mark removal needs no download.
v1.15.0
v1.15.0: SynthID diffusion-regen (validated scrub) + native CoreML SDXL on Apple Silicon
The headline: --synthid-attack regen runs a low-strength SDXL img2img regeneration of the whole image, the only SynthID-Image attack the published literature reports as validated. On macOS Apple Silicon it now runs natively via CoreML (no more broken Metal/Vulkan), about 3.4x faster than the CPU path.
SynthID diffusion-regen mode (--synthid-attack regen)
- New
--synthid-attack {off|spectral|regen}flag. Default staysspectral(the frequency-domain heuristic suppressor).regenruns SDXL img2img through a vendored leejet/stable-diffusion.cpp. - Default strength 0.10, the minimum validated against Google's official SynthID detector to remove the invisible watermark. (Strength 0.05 was enough with the old base VAE; the fp16-fix VAE needs 0.10 for the same scrub.)
- Tiled img2img preserves up to 4K (cosine-feathered overlap;
--regen-no-tiledisables it). - Honest tradeoffs, stated plainly: it is lossy (38 to 45 dB PSNR), and at the strength that actually scrubs SynthID you will see visible smoothing and minor simplification (SDXL regen is less powerful than the original model that made the image). No public SynthID verifier exists, so success cannot be confirmed locally. It leaves a detectable attacked-image footprint. It does not remove the visible Gemini diamond; run
wmr remove --synthid --synthid-attack regenfor both.
Native CoreML SDXL regen backend (mac, the default)
--regen-backend coreml: a from-scratch CoreML port of the SDXL img2img pipeline (an Euler scheduler over Accelerate + VAE encode/decode + the baked empty-prompt embeddings), replacing the broken Metal/Vulkan mac path from 1.14.x.- macOS
autonow prefers CoreML when the models are present, with a CPU fallback when they are absent. - Models auto-download from huggingface.co/froggeric/wmr on first use (~4.5 GB, SHA256-pinned, cached in
~/.cache/wmr/coreml-sdxl/;--regen-no-downloadrefuses). The VAE is the fp16-stablemadebyollin/sdxl-vae-fp16-fix(the base VAE overflows and darkens in fp16). - On an M4 (16 GB): ~10s per 1024 tile plus ~50 s one-time model load; a 4K-class image regenerates in about 2 minutes versus about 15 minutes on the CPU backend. The UNet currently runs on CoreML's CPU path; GPU/ANE placement is future work that would cut this further.
Platform scope in v1.15.0
The regen backend ships in the macOS Apple Silicon binary only this release (CoreML SD plus the sdcpp CPU backend there). The Linux, Windows, and macOS Intel binaries do not include sdcpp: it needs Vulkan/glslc on the Linux CI runner and MSVC validation on Windows (release-engineering that was never CI-tested when regen landed). On those platforms --synthid-attack regen falls back to the spectral suppressor. Cross-platform CPU regen returns in a later release.
Also in this release
- Codebook builder correctness. The "dots" artifact in codebook output was a builder bug (a saturated consistency gate captured the visible diamond's broadband FFT as the carrier); fixed with a discriminative
normalize(log1p(mean_magnitude) * phase_coherence)carrier selection plus a degenerate-codebook OOM guard. The default codebook-free path is unaffected. - Default visible-removal cleanup stays off (the pure reverse-alpha-blend, the exact mathematical inversion).
Downloads
Prebuilt, self-contained, Developer ID-signed and notarized packages for macOS (Apple Silicon and Intel), Linux, and Windows are in the assets below. The regen models are not bundled; they download on first use from huggingface.co/froggeric/wmr.
Third-party licenses: see LICENSE-THIRD-PARTY.md (SDXL = CreativeML Open RAIL++-M; madebyollin/sdxl-vae-fp16-fix = MIT; apple/ml-stable-diffusion converter = MIT).
v1.14.2
v1.14.2
Cleaner Gemini 3.6 watermark removal
Building on 1.14.1's auto-detection, 1.14.2 sharpens removal of the Gemini 3.6 diamond and unifies the still and video paths on one clean watermark mask.
What's new since 1.14.1
- No more faint border/halo on video. The exact reverse-blend recovers the pixels under the mark, but a faint ring could survive at the diamond's edge from video compression. A new edge cleanup repairs just that ring and leaves the recovered center untouched. It runs by default on Gemini/Veo video; pass
--no-edge-cleanupfor a pure reverse-blend. - One clean mask for stills and video. The 48px watermark mask is now the average of 10 distinct Gemini 3.6 captures (cleaner than a single capture), and the video path uses the same mask as stills instead of a separate, slightly-off capture. Cleaner removal on both.
- Watermark masks in the repo. The alpha masks are now under
assets/watermark-masks/as standalone PNGs with a README, for anyone who wants to inspect or reuse them.
Quick start (unchanged)
wmr remove image.png -o clean.png # still: auto-detect + exact removal
wmr video video.mp4 -o clean.mp4 # video: removal + edge cleanup (default)
wmr video video.mp4 --no-edge-cleanup -o clean.mp4 # pure reverse-blendSigned + notarized macOS builds and Linux/Windows packages are attached below.
Full Changelog: v1.14.1...v1.14.2
v1.14.1: still-image auto-geometry + exact removal (Gemini 3.6)
v1.14.1
Still-image watermark auto-detection + exact removal
The first tool to auto-detect and exactly remove Gemini 3.6 Flash's visible watermark — and the first still-image auto-geometry of its kind.
What's new since 1.12.0
- Auto-detect the position and size.
wmr removenow finds the watermark's corner and size on its own — 36px (Gemini 3.5), 48px (Gemini 3.6), or 96px (large outputs) — via a polarity-invariant NCC template match anchored on the predicted position then widened to the corner. No manual geometry; it just works. For a faint mark the auto-detect can't confirm, force the position with--rect x,y,w,hor--geo-preset <name>. - Exact reverse-blend, no blur. Removal is the mathematical inversion
original = (watermarked − α·logo)/(1−α). The previous default "cleanup" was a blur that left a translucent patch; it's now opt-in (--denoise) and residual-only — it only touches pixels where the reversal left a real residual. - Dedicated Gemini 3.6 alpha. The 3.6 small diamond is 48px and rendered weaker than the 48px video diamond; a capture from a real 3.6 image gives an exact reversal. Templates are native per size and never resized.
Quick start (unchanged)
wmr remove image.png -o clean.png # auto-detects + exactly removes
wmr detect image.png -v # show the detected geometry
wmr remove image.png --geo-preset gemini36-portrait -o clean.png # force a faint markThe signed + notarized macOS builds and the Linux/Windows packages are attached below once CI finishes.
Full Changelog: v1.12.0...v1.14.1