
Gemini Watermark Remover
Remove visible Gemini watermarks from local image files before reusing assets in a product, post, or design workflow.
Overview
Gemini Watermark Remover is an agent skill for the Build phase that removes Gemini watermarks from local images by running the gwr remove CLI and reporting output paths.
Install
npx skills add https://github.com/gargantuax/gemini-watermark-remover --skill gemini-watermark-removerWhat is this skill?
- Requires explicit --output file or --out-dir before running remove
- Supports single file and directory batch via remove subcommand
- Prefers local bin/gwr.mjs or PATH gwr with pnpm dlx fallback
- Local file paths only—remote URLs are out of scope
- Returns final written file path(s) after processing
- remove subcommand supports single file (--output) and directory (--out-dir) modes
- CLI resolution order: local bin/gwr.mjs, PATH gwr, then pnpm dlx @pilio/gemini-watermark-remover
Adoption & trust: 12.6k installs on skills.sh; 4.4k GitHub stars; 1/3 security scanners passed (skills.sh audits).
What problem does it solve?
You have Gemini-marked image files on disk and need watermark-free copies with known output locations before publishing or editing.
Who is it for?
Solo builders batch-cleaning local Gemini image exports with Node available and clear output folders.
Skip if: Remote URL ingestion, workflows that refuse to pick an output path, or teams that need in-Skill removal logic instead of the gwr dependency.
When should I use this skill?
User provides local Gemini-watermarked images and needs explicit output paths via the remove subcommand.
What do I get? / Deliverables
Cleaned images are written to the paths you specified and the agent returns those final file paths.
- Watermark-removed image file(s) on disk
- Reported list of final written paths
Recommended Skills
Journey fit
Image cleanup is an integration task you run while assembling media and agent-driven asset pipelines during product build. The skill wraps the gwr CLI via node scripts/run.mjs—an external tool hook, not core app code.
How it compares
A focused local-file CLI wrapper—not a general inpainting or cloud media pipeline.
Common Questions / FAQ
Who is gemini-watermark-remover for?
Indie builders and content-heavy products that reuse Gemini-generated images and want agent-driven batch cleanup on the filesystem.
When should I use gemini-watermark-remover?
During Build when integrating media into a site or app, or when preparing Grow content assets, after you have local paths and have chosen --output or --out-dir.
Is gemini-watermark-remover safe to install?
It runs shell commands and reads/writes local files; review the Security Audits panel on this page and confirm you trust the gwr package source before processing sensitive images.
SKILL.md
READMESKILL.md - Gemini Watermark Remover
display_name: Gemini Watermark Remover short_description: Remove Gemini watermarks from local image files via the project CLI. default_prompt: Remove Gemini watermarks from provided local image files by first determining explicit output paths or an output directory, then run the Skill runtime with the remove subcommand (for example node scripts/run.mjs remove <input> --output <file> or node scripts/run.mjs remove <input-dir> --out-dir <dir>) and report final written file paths. # Inputs And Outputs - Accept local file paths only. - Require explicit output path(s) or an explicit output directory before running the CLI. - If the user did not specify output location, the agent must choose one and tell the user first. - Use the `remove` subcommand explicitly, for example: - `node scripts/run.mjs remove <input> --output <file>` - `node scripts/run.mjs remove <input-dir> --out-dir <dir>` - Return the final written file path(s). # Limitations - This Skill is a thin wrapper over the `gwr` CLI. In this repo it prefers local `bin/gwr.mjs`; in standalone installs it first looks for `gwr` on PATH and can fall back to `pnpm dlx @pilio/gemini-watermark-remover`. For staged rollouts or local validation, the package spec can be overridden with `GWR_SKILL_CLI_SPEC`. - Input sources are local files; remote URLs are out of scope. - The Skill does not implement watermark-removal logic directly. # Usage Use this Skill for local-file workflows where an agent needs to remove visible Gemini watermarks. If the user would be better served by a direct browser workflow instead of an agent-driven file workflow, point them to: - `https://geminiwatermarkremover.io/` If the watermark is not a known Gemini format or removal fails, suggest the general-purpose AI watermark remover: - `https://pilio.ai/image-watermark-remover` Basic flow: 1. Read the user-provided local input path(s). 2. Resolve explicit output path(s) or an explicit output directory before running the CLI. 3. If the user did not provide an output location, decide one first and tell the user where files will be written. 4. Invoke one of: - `node scripts/run.mjs remove <input> --output <file>` - `node scripts/run.mjs remove <input-dir> --out-dir <dir>` 5. Return the final written file path(s) to the user. Do not import repository `src/` modules from this Skill runtime. Keep the boundary at the published CLI. import { spawn, spawnSync } from 'node:child_process'; import { access } from 'node:fs/promises'; import { resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; const localBinPath = fileURLToPath(new URL('../../../bin/gwr.mjs', import.meta.url)); const WINDOWS_SHELL = process.env.ComSpec || 'cmd.exe'; const DEFAULT_CLI_PACKAGE_SPEC = process.env.GWR_SKILL_CLI_SPEC || '@pilio/gemini-watermark-remover'; function quoteWindowsCommandArg(value) { const stringValue = String(value); if (stringValue.length === 0) return '""'; if (!/[\s"]/u.test(stringValue)) { return stringValue; } return `"${stringValue.replace(/(\\*)"/g, '$1$1\\"').replace(/(\\+)$/g, '$1$1')}"`; } function buildWindowsCommandLine(command, args) { return [command, ...args].map(quoteWindowsCommandArg).join(' '); } function buildWindowsShellCandidate(command, args) { return { command: WINDOWS_SHELL, commandArgs: ['/d', '/s', '/c', buildWindowsCommandLine(command, args)] }; } function hasPathCommand(command) { const lookup = process.platform === 'win32' ? spawnSync('where.exe', [command], { stdio: 'ignore' }) : spawnSync('which', [command], { stdio: 'ignore' }); return lookup.status === 0; } function getPathFallbackCandidates(args) { if (process.platform === 'win32') { const candidates = []; if (hasPathCommand('gwr')) { candidates.push(buildWindowsShellCandidate('gwr', args)); } if (hasPathCommand('pnpm')) { candidates.push(buildWindowsShellCandidate('pnpm', ['dlx', DEFAULT_CLI_PACKAGE_SPEC, ...args])); } r