
watermarks-remover v0.5.0
Um aplicativo com foco em privacidade que remove marcas d'água de IA de conteúdo que você possui.
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
watermarks-remover
Skill de agente + serviço Python stdlib para remover marcas de proveniência de IA de múltiplos fornecedores de textos e arquivos — para privacidade e higiene em conteúdo que você possui. A skill é um cliente leve: ela controla a maquinaria via HTTP, então o host do agente não precisa de Python.
| Camada | Alvo | Como |
|---|---|---|
| A | Unicode invisível, espaços exóticos, bidi, caracteres de tag | Scripts Python determinísticos |
| B | Marcas d'água estatísticas (amostragem de tokens) em texto | Reescrita pelo agente + hook opcional rewrite_text.py |
| Arquivos | C2PA / EXIF / XMP / propriedades de documentos | PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF, SVG, PDF, DOCX, XLSX, PPTX, EPUB, ODT, HTML, Markdown, MP4/MOV/M4A/M4V, WAV, MP3, FLAC |
Fornecedores / ecossistemas (nível de classe): Claude, Gemini / SynthID-Text, superfícies de proveniência da OpenAI, marcas open-LLM estilo Kirchenbauer (green-list) e keyed-Gumbel / EXP (Aaronson).
Última versão: v0.7.0
Caminho da skill: skills/remove-ai-marks/
Caminho do serviço: service/
(migração: anteriormente remove-claude-marks; o alias de barra /remove-claude-marks ainda está documentado)
Instalação (skill de agente)
A skill não inclui código — ela chama o serviço via HTTP. Instale a skill (apenas markdown) e inicie o serviço, depois defina WATERMARKS_SERVICE_URL se ele não for http://127.0.0.1:8765.
No Claude Code, o caminho mais rápido é o marketplace de plugins incluído — sem clonar, e ele se atualiza no local. Em todos os outros lugares, um único instalador cobre todos os hosts suportados (Python 3.10+ stdlib, sem dependências):
python3 install_skill.py --skill remove-ai-marks --target claude-code
| Host | Target | Lands in |
|---|---|---|
| Claude Code (pessoal) | --target claude-code | ~/.claude/skills/<skill> (honors CLAUDE_CONFIG_DIR) |
| Claude Code (projeto) | --target claude-project --project-dir PATH | PATH/.claude/skills/<skill> |
| Codex (pessoal) | --target codex | ~/.agents/skills/<skill> |
| Codex (projeto) | --target codex-project --project-dir PATH | PATH/.agents/skills/<skill> |
| Cowork, claude.ai, cloud sessions, routines | --target cowork | dist/<skill>.zip to upload under Customize → Skills |
| Cursor | --target cursor (default) | ~/.cursor/skills/<skill> |
Shipped skills: remove-ai-marks (full, service-backed) and
clean-user-facing-text (text only, self-contained). --list prints them.
Existing installations are preserved unless you pass --force; replacement is
staged first and the previous install is kept as a uniquely named backup.
--link symlinks this checkout instead of copying, so edits are picked up
live. On Windows, use py install_skill.py ...; the install-skill.sh wrapper
is provided for macOS/Linux shells.
Before writing anything, the installer validates the skill against the
Agent Skills packaging rules that claude.ai uploads
and the Skills API enforce: spec-only frontmatter (name, description,
license, compatibility, metadata, allowed-tools), a lowercase hyphenated
name of at most 64 characters matching the directory, a non-empty
description of at most 1024 characters. The Cowork bundle additionally has
to fit the 30 MB upload limit, which the packager enforces.
Codex terminal and desktop
Install either shipped skill for your user, or install one into a particular project:
python3 install_skill.py --skill remove-ai-marks --target codex
python3 install_skill.py --skill clean-user-facing-text --target codex
python3 install_skill.py --skill remove-ai-marks --target codex-project --project-dir /path/to/project
No Windows, use py em vez de python3. Abra o projeto no Codex. No
terminal, use /skills ou digite $ para selecionar uma skill; no aplicativo
desktop, selecione ou mencione a skill no seu prompt. Reinicie o Codex se a nova
skill não aparecer. A instalação do projeto fica disponível quando o Codex é
executado nesse projeto.
Para remove-ai-marks, inicie o serviço HTTP existente deste repositório
com make serve antes de usar a skill (ou no Windows sem make, execute
py service/scripts/server.py --host 127.0.0.1 --port 8765). Ele usa
WATERMARKS_SERVICE_URL (padrão http://127.0.0.1:8765), verifica /health
e chama os endpoints existentes /inspect e /clean. Se o serviço
exigir uma chave de API, defina WATERMARKS_SERVER_API_KEY para o cliente.
clean-user-facing-text é
autocontido e não precisa do serviço.
Limpeza automática via hook (determinística)
Uma skill é uma instrução: o modelo decide se deve invocá-la, e o modelo é quem produz as marcas. Um hook é executado pelo harness em cada chamada de ferramenta correspondente, sem necessidade de cooperação. Isso torna o hook a metade determinística deste fluxo de trabalho.
O plugin registra um hook PostToolUse em Write|Edit|MultiEdit|NotebookEdit
que executa service/scripts/hook_written_file.py
no arquivo que o agente acabou de escrever. Dois modos, seguindo a convenção
de pré-commit de verificação por padrão:
| Modo | Comportamento |
|---|---|
check (padrão) | Relata marcas de proveniência, deixa o arquivo intacto. Os achados vão para o modelo (exit 2), para que ele possa oferecer limpá-los. |
clean | Remove as marcas no local e informa ao modelo que o arquivo em disco mudou. |
Defina o modo nas configurações do plugin (Hook mode em /plugin manage,
lido pelo hook como CLAUDE_PLUGIN_OPTION_HOOK_MODE), ou com
WATERMARKS_HOOK_MODE=clean no ambiente. O comando do hook deliberadamente
não interpola ${user_config.hook_mode}: o Claude Code se recusa a executar
um hook que referencia uma opção que o usuário nunca abriu /plugin manage para
definir — um default declarado não satisfaz isso — então interpolá-lo faria
com que o hook silenciosamente nunca fosse executado em uma instalação nova. A detecção reutiliza scan_file / is_actionable do audit_lib, então o hook, o portão de pré-commit e a exportação SARIF do CI concordam sobre o que conta como acionável; a limpeza chama clean_file.py, então nenhuma lógica de limpeza é duplicada. O modo clean grava em um arquivo temporário irmão e troca apenas em caso de diferença real, então arquivos que já estavam limpos mantêm seu mtime e não disparam novamente os observadores de arquivo.
Sem o plugin, configure-o em ~/.claude/settings.json (ou em um
.claude/settings.json do projeto) você mesmo: