Reading the repo
Opening the box…
Reading the repo
Opening the box…
How to install on macOS
A privacy-first app that strips AI watermarks from content you own.
GitHub didn't answer, so this is the saved copy from 17 h ago
Will it work on macOS?
Heads-upBuilding it yourself? It also needs 2 settings in .env.
The maintainers included install-skill.sh. Run it from the cloned folder after reading it.
bash install-skill.sh
CONTRIBUTING.mdThanks for helping keep the skill accurate and the cleaners reliable. The
project is a small Python skill (skills/remove-ai-marks/) plus tests —
focused PRs land fastest.
| Action | Who |
| --- | --- |
| Open issues | Anyone |
| Suggest a release | Anyone (use the Release suggestion issue template) |
| Open pull requests | Anyone (fork the repo) |
| Approve and merge pull requests | Maintainer only (@guillaumemeyer) |
main is protected. A change needs a pull request, a passing CI check
(test), and an approving review from the code owner before merge. Only the
maintainer can give that approval. Direct pushes to main are blocked for
non-admins.
To suggest a release without a code change: open a Release suggestion issue.
python3 -m pytest -q should pass before you open a PRc2patool, exiftool (PDF)| Path | Role |
| --- | --- |
| skills/remove-ai-marks/SKILL.md | Agent skill entry (workflow, ethics) — remote client over HTTP |
| .claude-plugin/ | Claude Code plugin manifest + single-plugin marketplace (make plugin-validate) |
| install_skill.py | Multi-host skill installer (Claude Code, Cowork bundle, Cursor) |
| skills/remove-ai-marks/references/ | Vendors, mark classes, matrix, ethics |
| service/scripts/ | Layer A/B hooks + image/container cleaners + server.py HTTP service |
| service/Dockerfile* | Container images (core + optional backends) |
| compose.yaml | Local full-stack bring-up |
| tests/ | Pytest suite and fixtures |
| .github/workflows/ci.yml | CI job test |
| .github/workflows/release-images.yml | GHCR image publishing on v* tags |
service/scripts/ (text_unicode.py, clean_text.py, inspect_text.py). Prefer
tests with fixtures in tests/fixtures/.SKILL.md plus optional
rewrite_text.py (print-prompt default; ollama / openai-compatible). No
bundled model. Keep ethics-aware.image_meta.py (PNG/JPEG/AVIF/HEIC/...),
container_meta.py (SVG/PDF/DOCX/ODT/HTML/MD), av_meta.py (MP4/MOV/WAV/MP3),
unified inspect_file.py / clean_file.py. Preserve document body / pixels /
waveform; strip provenance metadata only.SKILL.md / references/removal-matrix.md when relevanttests/python3 -m pytest -q passesreferences/ethics.md: this tool is for content the user ownsQuestions? Open an issue describing the input type (text / image / document) and which layer failed or is missing.
The skill ships no code — it calls the service over HTTP. Install the skill (markdown only) and start the service, then set WATERMARKS_SERVICE_URL if it is not http://127.0.0.1:8765.
In Claude Code, the fastest route is the bundled plugin marketplace — no clone, and it updates in place. Everywhere else, one installer covers every supported host (Python 3.10+ stdlib, no dependencies):
python3 install_skill.py --skill remove-ai-marks --target claude-code
| Host | Target | Lands in |
| --- | --- | --- |
| Claude Code (personal) | --target claude-code | ~/.claude/skills/<skill> (honors CLAUDE_CONFIG_DIR) |
| Claude Code (project) | --target claude-project --project-dir PATH | PATH/.claude/skills/<skill> |
| Codex (personal) | --target codex | ~/.agents/skills/<skill> |
| Codex (project) | --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.
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
On Windows, use py in place of python3. Open the project in Codex. In the
terminal, use /skills or type $ to select a skill; in the desktop app,
select or mention the skill in your prompt. Restart Codex if the new skill does
not appear. The project install is available when Codex runs in that project.
For remove-ai-marks, start the existing HTTP service from this repository
with make serve before using the skill (or on Windows without make, run
py service/scripts/server.py --host 127.0.0.1 --port 8765). It uses
WATERMARKS_SERVICE_URL (default http://127.0.0.1:8765), checks /health,
and calls the existing /inspect and /clean endpoints. If the service
requires an API key, set WATERMARKS_SERVER_API_KEY for the client.
clean-user-facing-text is
self-contained and does not need the service.
A skill is an instruction: the model decides whether to invoke it, and the model is the thing producing the marks. A hook is executed by the harness on every matching tool call, cooperation not required. That makes the hook the deterministic half of this workflow.
The plugin registers a PostToolUse hook on Write|Edit|MultiEdit|NotebookEdit
that runs service/scripts/hook_written_file.py
against the file the agent just wrote. Two modes, matching the pre-commit
convention of check-by-default:
| Mode | Behaviour |
| --- | --- |
| check (default) | Reports provenance marks, leaves the file alone. Findings go to the model (exit 2), so it can offer to clean them. |
| clean | Strips the marks in place, then tells the model the file on disk changed. |
Set the mode from the plugin's settings (Hook mode in /plugin manage,
read by the hook as CLAUDE_PLUGIN_OPTION_HOOK_MODE), or with
WATERMARKS_HOOK_MODE=clean in the environment. The hook command deliberately
does not interpolate ${user_config.hook_mode}: Claude Code refuses to run
a hook that references an option the user has never opened /plugin manage to
set — a declared default does not satisfy it — so interpolating it would mean
the hook silently never runs on a fresh install. Detection reuses audit_lib's
scan_file / is_actionable, so the hook, the pre-commit gate, and the CI
SARIF export agree on what counts as actionable; cleaning shells out to
clean_file.py, so no cleaning logic is duplicated. clean mode writes to a
sibling temp file and swaps only on a real
…
Then run bash setup.sh. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
Needs Git: xcode-select --install
git clone https://github.com/guillaumemeyer/watermarks-remover.git cd watermarks-remover
make, Python 3
xcode-select --install brew install python
Optional, add them when you need them: WATERMARKS_SERVER_API_KEY, HF_TOKEN
cp .env.example .env
In the maintainers' order. Do the README instructions above first — they cover steps outside the terminal.
python3 install_skill.py --skill remove-ai-marks --target claude-code 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 /plugin marketplace add guillaumemeyer/watermarks-remover /plugin install watermarks-remover@watermarks-remover python3 install_skill.py --skill remove-ai-marks --target claude-code python3 install_skill.py --skill remove-ai-marks --target claude-project \ --project-dir /path/to/project python3 install_skill.py --skill remove-ai-marks --target cowork python3 install_skill.py --skill clean-user-facing-text --target cowork mkdir -p .grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks mkdir -p ~/.grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks python3 install_skill.py --skill clean-user-facing-text --target claude-code python3 install_skill.py --skill clean-user-facing-text --target cursor mkdir -p /path/to/project/.cursor/rules cp integrations/cursor/clean-user-facing-text.mdc \ /path/to/project/.cursor/rules/clean-user-facing-text.mdc make serve # http://127.0.0.1:8765 python3 service/scripts/server.py --host 127.0.0.1 --port 8765
No reports for macOS yet.
GitManual AI Agent reads the 9 key files and writes a step-by-step guide for macOS. Once written, it's saved for everyone.