NEW: Watch the demo video on YouTube — Veo Watermark Remover in Action
Warning
This is a DEMO/PREVIEW build — CLI only, unsigned executable, early testing phase. See Demo Build Notice for details and known limitations. Windows/macOS may block the executable on first run — see First Run — OS Security Prompts below.
This is a demo/preview build of the upcoming Veo watermark removal feature for GeminiWatermarkTool. Once stabilized, this functionality will be merged into the main GWT release with full GUI support.
Remove the "Veo" text watermark from Google Veo-generated videos using mathematically precise reverse alpha blending — the same proven technique behind GeminiWatermarkTool.
No cloud services. No generative fill, no hallucinated pixels, no quality loss — the removal is pure, reversible math. An optional on-device ML assist (--ml) can fine-tune the intensity on tricky clips.
- More stable by default — the ML assist is now opt-in (
--ml). v0.6.3 turned the "Alpha Judge" ML intensity predictor on by default. Across the huge variety of real-world clips, though, it occasionally over-corrected and made a clip worse than the plain analytical estimate. So the default is back to the proven, predictable analytical intensity — reliable for the common case — and Alpha Judge is now a one-flag opt-in (--ml) for the minority of clips whose intensity genuinely varies a lot. By default the tool no longer spins up the GPU for ML either, so it starts clean on more systems. - New "Veo" text — more reliable detection + 1080p support. Fixed a case where a clip with the small "Veo" text over a busy foreground (e.g. shot through grass) was misread as the Gemini diamond and left the text in place (#18) — it's now identified correctly. Also added the 1080p small "Veo" wordmark (v0.6.3 handled 720p only).
- Alpha Judge ML intensity assist (now opt-in via
--ml). A small neural network (DNN) that runs entirely on your own machine and predicts the removal intensity from the video, combined with the analytical estimator. Helps clips whose intensity varies a lot; 100% offline, nothing uploaded. (Off by default since v0.6.4 — see above.) - Small "Veo" text watermark removal. Google's Flow generator stamps a small "Veo" wordmark in the bottom-right corner of its newest outputs. The tool auto-detects which watermark a clip carries (the Gemini diamond or the small Veo text) and removes the right one — no flags, landscape or portrait.
- Auto-detects the relocated watermark. Newer Veo portrait outputs (1080×1920, 720×1280) moved the diamond further in from the corner, and v0.6.1 didn't recognise the new spot — it SKIPped those files (#14, #16). v0.6.2 adds the new positions AND a smart bottom-right search that finds the diamond wherever it sits (matching its shape across several frames and requiring them to agree on the position). If the position shifts again, the tool locates it without needing an update — the fixed positions are just a fast path, the search is the safety net.
- Fixes the "dark hole" over-removal on bright backgrounds. When the watermark drifted across a lit hand, skin, or a bright sky, the per-frame estimator could over-shoot and over-subtract, leaving a dark crater for a run of frames. v0.6.2 anchors each frame's intensity to the stable per-shot value and rejects physically-implausible estimates, so removal stays clean across the whole clip even as the background changes.
- Keeps partially-occluded frames (#5). When a foreground object partly covers the diamond, the watermark is still there underneath — but v0.6.1 could read the low match score as "no watermark" and skip those frames, leaving it visible. v0.6.2 adds a three-tier confidence gate: high-confidence frames are tuned per frame, low-confidence frames get the shot's consensus intensity applied instead of being skipped, and only genuinely watermark-free frames pass through untouched.
- Smarter 1080p intensity (#2). 1080p previously used a fixed intensity, but some clips need a noticeably stronger one. v0.6.2 measures the correct intensity per shot with a more accurate least-squares estimator (~20% closer to the ideal value), while staying flicker-free on 1080p by locking one value for the whole shot.
- Survives intro fade-ins. Many community-supplied 720p clips start with a brief fade-in or splash where the watermark isn't yet composited, and v0.6.0 saw NCC = 0 on frame 0 and SKIPped the whole file. v0.6.1 probes 12 frames spread across the video's first 90% and picks the best (sample, tuple) pair, so fade-ins no longer cause a false SKIP. Five previously-skipped community samples now auto-detect cleanly.
- Adaptive per-frame alpha refinement. The new bisection feedback loop doesn't just estimate the alpha intensity — it APPLIES the candidate value, evaluates whether the result looks like the surrounding background, and adjusts up (residue remained) or down (dark hole) for up to five rounds per frame. Visual-consistency goal rather than pure prediction, so clips with foreground motion or heterogeneous backgrounds get a per-frame scale that actually fits.
- Per-shot seed + per-frame change cap. A stable per-video baseline (median of 12 sample-frame estimates) anchors the bisection, and a small per-frame change cap (±0.05) prevents any single bad assessment from causing a visible flash. Output stays smooth even on content where the bisection metric is locally noisy.
--variant 720p-1/--variant 720p-2escape hatch in the SKIP hint. When auto-detect can't lock on, the SKIP message now suggests the manual override flags directly. Useful for clips that auto fails on (rare with v0.6.1's multi-frame probe, but the escape hatch is documented).- Honest limit acknowledged. Some clips with very strong per-frame content motion (medical illustrations with hair strands, rapid-cut animation, etc.) still produce a small residue on a few frames. See Manual touch-up workflow below for the recommended workflow when the automatic result isn't good enough.
- 720p Gemini 3.5 diamond removal — now auto-detected. Both geometries observed in real Veo 720p outputs are calibrated: 720p-1 standard (48×48 at margin 72,72, ~1.5 Mbps tier) and 720p-2 compact (44×44 at margin 29,40, ~7 Mbps tier). Auto-detect picks the right one via NCC scoring.
- Dynamic per-frame alpha estimation. First release with per-frame alpha intensity recovery instead of a static multiplier. v0.6.1 evolved this into the adaptive bisection above.
- Position refinement at video startup. A ±4 px local NCC search around the tuple anchor snaps to the actual diamond position, absorbing encoding-tier drift without recalibration.
- Transcoder timing fidelity. Output frame count, duration, and FPS metadata match input exactly — no more silently dropping tail frames or shifting duration. Three classic libavcodec API misuses (decoder flush, packet duration stamping, frame-rate metadata propagation) fixed in one go.
- Quieter default output — FFmpeg container parser warnings
(e.g. the
Unknown cover type: 0x1line emitted on C2PA-tagged Veo videos) suppressed at default verbosity.
If you have a Gemini 3.5 video at 4K, square 1:1, 9:16 short-form, or any resolution not in 1080p / 720p, please open an issue with a sample so we can calibrate that size too. The diamond shape is consistent across resolutions; we mainly need the position and size for each new encoding profile.
- Gemini 3.5 diamond watermark removal (1080p) — the first release to handle Gemini 3.5's new diamond watermark by default (no flag needed). 1920×1080 landscape and 1080×1920 portrait validated end-to-end against community samples (issue #2, #3).
--legacyflag for older Veo videos — videos generated before Gemini 3.5 (with the "Veo" text watermark) need--legacy; the diamond and the text are different shapes at different positions, so applying the wrong removal would damage the frame.- No fallback between profiles — if a diamond-mode result still
shows the old "Veo" text, the video is pre-Gemini-3.5 — re-run
with
--legacy. - Tighter encode — CRF 14 / preset slow (was 18 / medium). PSNR improved by ~2-3 dB on encoding-only regions; visually identical to source on most content.
- macOS stability fix — addresses the SIGBUS crash on Apple Silicon reported in upstream GeminiWatermarkTool #30 / #31. The Vulkan loader is probed before NCNN's GPU init; if it's absent (the default on macOS without MoltenVK), AI denoise transparently falls back to CPU instead of crashing
--snap-min-size— finer snap-search control on the image-watermark side (default 16, range 8-64), mirroring the existing--snap-max-sizeflag- End-to-end CI smoke test — every CI build now runs
--denoise aithrough a real inference pipeline (Windows / Linux / macOS) before publishing. The previous--version-only check never touched the AI denoise init path, which is how the macOS crash slipped past CI in v0.3.0
- Improved watermark masks — remastered 720p and 1080p alpha maps using golden frame-differencing from multiple video sources (10+ transition pairs)
- Better output quality — upgraded video encoder (High profile, B-frames, multi-reference)
- Enhanced AI cleanup — tuned per-resolution denoise parameters with expanded inference context
- Progress bar — real-time ASCII progress indicator during video processing
- Quieter output — reduced log verbosity in normal mode; use
--verbosefor detailed diagnostics
Just drag and drop. Drop your Veo video onto the executable — it automatically removes the watermark and outputs video_processed.mp4 with audio preserved.
- Download
GeminiWatermarkTool-Video.exe(see Download below) - Drag your
.mp4file onto the exe - Done — output appears as
yourfile_processed.mp4in the same folder
# Simplest — auto-detects the watermark (Gemini diamond OR the new "Veo" text)
./GeminiWatermarkTool-Video video.mp4
# Older, larger "Veo" text from pre-Gemini-3.5 videos
./GeminiWatermarkTool-Video --legacy old_veo_video.mp4
# Specify output path
./GeminiWatermarkTool-Video -i video.mp4 -o cleaned.mp4
# Enable the ML intensity assist (opt-in) for a clip whose intensity varies a lot
./GeminiWatermarkTool-Video --ml video.mp4
# Pre-3.5 with explicit input / output
./GeminiWatermarkTool-Video --legacy -i old_video.mp4 -o cleaned.mp4
# Force a specific 720p variant if auto-detect picks wrong (rare):
./GeminiWatermarkTool-Video --variant 720p-1 video.mp4 # 48x48 standard
./GeminiWatermarkTool-Video --variant 720p-2 video.mp4 # 44x44 compactWhich mode do I need?
- Just run it — no flags. The tool auto-detects what a clip carries — the Gemini diamond (Gemini 3.5 and later) or the new small "Veo" text (Google Flow's latest outputs) — and removes the right one, in landscape or portrait.
--legacyis only for the older, larger "Veo" text from pre-Gemini-3.5 videos. New outputs don't need it.
The v0.6.1 adaptive loop runs once per frame and behaves like a small auto-tuner. For each frame:
- Compute the per-frame NCC against the calibrated diamond template. If NCC is below the gate (heavy foreground occlusion), the frame is left untouched — leaving the diamond visible on those few frames is more honest than scribbling synthetic content over them.
- Sample the local background ring around the watermark region.
- Pick a candidate alpha intensity (starting from the per-shot seed value learned from the first 12 sample frames).
- APPLY the candidate, measure whether the resulting region matches
the surrounding background:
- Brighter than surroundings → residue still present → increase intensity.
- Darker than surroundings → over-subtracted (dark hole) → decrease intensity.
- Up to 5 bisection rounds. The change between adjacent frames is capped at ±0.05 so any single bad assessment can't cause a visible flash.
The goal is visual consistency with the local context, not a prediction of some "true" alpha value. Same content + same diamond → same removal. Different scenes within a clip get different per-frame intensities, but each is correct for its own surroundings.
The automatic pipeline handles most Gemini 3.5 video samples cleanly, but some content classes still resist a fully automatic solution — heavy per-frame motion, foreground objects overlapping the watermark region, medical-illustration backgrounds with high-frequency detail next to the diamond, etc. If you run a video through v0.6.1 and a small number of frames still show residue or a faint outline, the practical workflow is:
# 1. Run the automatic pipeline first
GeminiWatermarkTool-Video video.mp4
# 2. Decompose the auto-processed output into individual frames
ffmpeg -i video_processed.mp4 frames/frame_%04d.png
# 3. Open GUI mode (image-side GeminiWatermarkTool) on the problem
# frames only. Use Custom region mode and tune the Alpha intensity
# slider until that frame looks clean. Save the touched-up PNG
# back to the same path.
# (See https://github.com/allenk/GeminiWatermarkTool for the GUI
# build that ships the Alpha intensity slider in Custom mode.)
# 4. Re-encode the frames back into a video, copying audio from the
# original
ffmpeg -framerate 24 -i frames/frame_%04d.png \
-i video.mp4 -map 0:v -map 1:a \
-c:v libx264 -crf 14 -preset slow -pix_fmt yuv420p \
-c:a copy \
video_touched_up.mp4For most clips you'll only need to manually fix a handful of frames.
The GUI's Custom-mode Alpha intensity slider lets you dial in the
exact value visually; values around 0.55-0.70 (V1-relative) cover
most current Gemini 3.5 720p content.
The default AI denoise sigma is tuned for photographic / video content (sigma = 50 for 1080p, sigma = 20 for 720p Veo). If your output looks too blurry or has slight unnatural artifacts on illustration / animation content, try a smaller sigma:
# Anime / illustration content often looks best with sigma ~15
GeminiWatermarkTool-Video --sigma 15 video.mp4
# Photographic content where AI denoise is too aggressive
GeminiWatermarkTool-Video --sigma 25 video.mp4Lower sigma = less smoothing = sharper output but residual H.264 ringing artifacts may stay visible near the WM edges. Higher sigma = more smoothing = cleaner edges but slight loss of detail. The defaults are a compromise; for content classes with distinct aesthetics, manual tuning helps.
- Single executable — standalone, zero dependencies, zero installation
- Cross-platform — Windows, Linux, and macOS (Universal Binary)
- Direct mp4-to-mp4 — no intermediate files, no external tools needed
- Audio preserved — original audio track is kept without re-encoding
- AI denoise — GPU-accelerated FDnCNN cleanup for residual artifacts (Vulkan)
- Gemini 3.5 diamond removal (default, v0.5.0+) — handles the new watermark layout out of the box; v0.6.0 adds 720p (both standard and compact variants) alongside 1080p
- Relocated-watermark auto-detection (v0.6.2+) — known positions plus a smart bottom-right search that finds the diamond wherever it moves, with cross-frame agreement to avoid false matches
- Over-removal protection (v0.6.2+) — per-frame intensity is anchored to the stable per-shot value, preventing the dark-hole artifact when the watermark crosses bright/low-contrast areas
- Partial-occlusion handling (v0.6.2+) — a three-tier confidence gate cleans frames where a foreground object partly covers the diamond instead of skipping them
- Dynamic 1080p intensity (v0.6.2+) — least-squares per-shot estimate replaces the old fixed multiplier, flicker-free
- Adaptive per-frame alpha refinement (v0.6.1+, 720p) — bisection feedback loop applies a candidate intensity, measures the result against the local background, and adjusts up/down per frame; the change between adjacent frames is capped to prevent visible flashes
- Multi-frame detection probe (v0.6.1+) — probes 12 frames across the video instead of just frame 0, so intro fade-ins no longer cause a false SKIP
- Tick-exact transcoder timing (v0.6.0+) — frame count, duration, and FPS metadata match input exactly; no drift in NLE / editor alignment
--variantescape hatch — force a known 720p geometry if auto-detect can't lock on (very rare with v0.6.1)--sigmafor content-aware denoise — lower for animation / illustration, higher for photographic content- Legacy "Veo" text removal (
--legacy) — for pre-Gemini-3.5 videos; the previous default behaviour still available behind a single flag - Progress bar — real-time processing progress in the terminal
This tool uses the same reverse alpha blending algorithm as GeminiWatermarkTool:
original = (watermarked - alpha * logo_value) / (1 - alpha)
The Veo watermark alpha maps were extracted using frame differencing from Veo-generated videos with watermark on/off transitions. Multiple golden pairs (Lightning flash, Light bulb, Sunrise scenes) were averaged for maximum accuracy. AI denoise (FDnCNN, NCNN + Vulkan GPU) handles residual edge artifacts from video compression.
For the full technical background on reverse alpha blending, see: Removing Gemini AI Watermarks: A Deep Dive into Reverse Alpha Blending
| Component | Requirement |
|---|---|
| OS | Windows 10/11 x64, Linux x64, macOS (Intel + Apple Silicon) |
| GPU | Vulkan-capable GPU for AI Denoise acceleration (or fallback to CPU) |
| RAM | 4 GB minimum |
Note: AI denoise prefers a Vulkan GPU but transparently falls back to CPU when no Vulkan loader is available.
macOS users: macOS does not ship Vulkan natively — install the LunarG Vulkan SDK (which bundles MoltenVK) for GPU acceleration. Otherwise the tool runs in CPU mode by default; this is fully supported but slower than Vulkan inference.
Single file download — no installer, no setup.
| Platform | File | Notes |
|---|---|---|
| Windows x64 | GeminiWatermarkTool-Video.exe |
Drag & drop supported |
| Linux x64 | GeminiWatermarkTool-Video |
chmod +x before running |
| macOS Universal | GeminiWatermarkTool-Video |
Intel + Apple Silicon |
Download the latest release from the Releases page.
Every release is built by GitHub Actions from this repository's public, MIT-licensed source — in a clean, throwaway CI runner, with public build logs. No human ever touches the binary between source and release, so there is no step where anything could be tampered with. You can read the source, inspect the build workflow, and rebuild the exact binary yourself.
Independent VirusTotal scans for the v0.6.3 binaries — the SHA256 is in each link, so you can match it against the file you downloaded:
| Platform | VirusTotal scan |
|---|---|
| Windows x64 | virustotal.com/…de4ab955 |
| Linux x64 | virustotal.com/…b43d74f9b |
| macOS Universal | virustotal.com/…1def4d5e |
About antivirus false positives. The binaries are unsigned, and every new release is a brand-new file your antivirus has never seen. Heuristic / ML-based scanners are twitchy about unsigned executables with zero reputation, so a fresh release can occasionally trip a generic detection (a Wacatac / AIDetect-style label) even though nothing is wrong — it's about the file being new and unsigned, not about what the program does. If your antivirus flags it, match the SHA256 against the scans above, restore it from quarantine (or add an exclusion), or build it yourself from source. Proper code signing is on the roadmap to stop this recurring.
Verify your download (SHA256):
# Windows (PowerShell)
Get-FileHash .\GeminiWatermarkTool-Video.exe -Algorithm SHA256
# Linux / macOS
sha256sum GeminiWatermarkTool-VideoIf you're not comfortable running an unsigned executable, that's completely fine. This is a demo build for early testing. The Veo removal feature will be integrated into the main GeminiWatermarkTool release when ready, with full source code, CI/CD builds, and cross-platform support.
Downloaded binaries are not code-signed, so your OS may show a security warning on first launch. This is normal for open-source software distributed outside app stores.
Windows — SmartScreen "Windows protected your PC"
Option A: Click More info → Run anyway.
Option B (PowerShell):
Unblock-File .\GeminiWatermarkTool-Video.exemacOS — "Apple cannot check it for malicious software"
Option A (recommended): Right-click the binary → Open → click Open in the dialog. You only need to do this once.
Option B (terminal):
xattr -dr com.apple.quarantine GeminiWatermarkTool-Video
chmod +x GeminiWatermarkTool-VideoLinux — No security prompt
Linux does not quarantine downloaded binaries. Just ensure the file is executable:
chmod +x GeminiWatermarkTool-Video
./GeminiWatermarkTool-Video video.mp4This is a preview/demo build with the following limitations:
- CLI only — GUI support is planned for the main GWT release
- Video only — this build processes video files (.mp4/.mkv/.mov); for Gemini image watermarks, use the main GeminiWatermarkTool
When the Veo feature is stable, it will be merged into GeminiWatermarkTool as a unified release supporting both Gemini image and Veo video watermark removal.
GeminiWatermarkTool is an open-source tool for removing Gemini AI visible watermarks from images. It supports GUI + CLI dual-mode operation, cross-platform deployment (Windows / Linux / macOS / Android), and optional AI denoise with NCNN + Vulkan GPU acceleration.
Author: Allen Kuo (@allenk)
If this tool saved you time and you'd like to help keep it going, you can support via Ko-fi or PayPal — both go to the same place; pick whichever works for you (a few users have reported Ko-fi checkout issues from their region, so PayPal is the dependable fallback). Every public release goes through GitHub Actions CI on Windows / Linux / macOS, and the binary archives live in the Releases section — small contributions help cover runner minutes and storage so the project can keep building cross-platform binaries for free. Not required, just appreciated.
Bug reports, sample videos, and pull requests remain the most valuable contributions and always will be — if you don't have anything to send via Ko-fi, opening an issue with a clip the tool can't handle is just as helpful (often more so).
This demo build is based on GeminiWatermarkTool (MIT License).
It includes third-party open-source components (NCNN, OpenCV, etc.) under their respective permissive licenses. Full license texts are available in the respective project repositories.

