
소유한 콘텐츠에서 AI 워터마크를 제거하는 프라이버시 우선 앱입니다.
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
텍스트와 파일에서 여러 벤더의 AI 출처 표시를 제거하는 에이전트 스킬 + 표준 라이브러리 Python 서비스 — 본인이 소유한 콘텐츠의 프라이버시와 위생을 위해. 이 스킬은 얇은 클라이언트로, HTTP를 통해 기계를 구동하므로 에이전트 호스트에 Python이 필요하지 않습니다.
| 계층 | 대상 | 방법 |
|---|---|---|
| A | 보이지 않는 유니코드, 특수 공백, 양방향 문자, 태그 문자 | 결정적 Python 스크립트 |
| B | 통계적(토큰 샘플링) 텍스트 워터마크 | 에이전트 재작성 + 선택적 rewrite_text.py 훅 |
| 파일 | C2PA / EXIF / XMP / 문서 속성 | PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF, SVG, PDF, DOCX, XLSX, PPTX, EPUB, ODT, HTML, Markdown, MP4/MOV/M4A/M4V, WAV, MP3, FLAC |
벤더 / 생태계 (클래스 수준): Claude, Gemini / SynthID-Text, OpenAI 출처 표시 영역, open-LLM Kirchenbauer 스타일(그린 리스트) 및 키 기반 Gumbel / EXP (Aaronson) 마크.
최신 릴리스: v0.7.0
스킬 경로: skills/remove-ai-marks/
서비스 경로: service/
(마이그레이션: 이전 명칭 remove-claude-marks; 슬래시 별칭 /remove-claude-marks는 여전히 문서화됨)
이 스킬은 코드를 포함하지 않습니다 — HTTP를 통해 서비스를 호출합니다. 스킬(마크다운만)을 설치하고 서비스를 시작한 다음, http://127.0.0.1:8765가 아니라면 WATERMARKS_SERVICE_URL을 설정하세요.
Claude Code에서는 가장 빠른 방법이 번들로 제공되는 플러그인 마켓플레이스입니다 — 클론이 필요 없고 제자리에서 업데이트됩니다. 그 외 환경에서는 하나의 설치 프로그램이 지원되는 모든 호스트를 커버합니다 (Python 3.10+ 표준 라이브러리, 의존성 없음):```bash python3 install_skill.py --skill remove-ai-marks --target claude-code
| 호스트 | 대상 | 설치 위치 |
| --- | --- | --- |
| Claude Code (개인) | `--target claude-code` | `~/.claude/skills/<skill>` (`CLAUDE_CONFIG_DIR` 적용) |
| Claude Code (프로젝트) | `--target claude-project --project-dir PATH` | `PATH/.claude/skills/<skill>` |
| Cowork, claude.ai, 클라우드 세션, 루틴 | `--target cowork` | **Customize → Skills**에서 업로드할 `dist/<skill>.zip` |
| Cursor | `--target cursor` (기본값) | `~/.cursor/skills/<skill>` |
제공되는 스킬: `remove-ai-marks`(전체, 서비스 기반)와
`clean-user-facing-text`(텍스트 전용, 자체 포함). `--list`로 확인할 수 있습니다.
기존 설치는 `--force`를 전달하지 않는 한 보존되며, 교체는 먼저 스테이징되고
이전 설치는 고유한 이름의 백업으로 유지됩니다.
`--link`는 복사 대신 이 체크아웃을 심볼릭 링크하므로 편집 내용이
실시간으로 반영됩니다. Windows에서는 `py install_skill.py ...`를 사용하세요.
`install-skill.sh` 래퍼는 macOS/Linux 셸용으로 제공됩니다.
무엇이든 쓰기 전에, 설치 프로그램은 claude.ai 업로드와 Skills API가
강제하는 [Agent Skills](https://agentskills.io) 패키징 규칙에 따라 스킬을
검증합니다: 스펙 전용 프런트매터(`name`, `description`,
`license`, `compatibility`, `metadata`, `allowed-tools`), 디렉터리와 일치하는
최대 64자의 소문자 하이픈 표기 `name`, 최대 1024자의
비어 있지 않은 `description`. Cowork 번들은 추가로
패키저가 강제하는 30 MB 업로드 제한을 충족해야 합니다.
### 훅을 통한 자동 정리 (결정적)
스킬은 지시사항입니다: 모델이 호출 여부를 결정하며, 모델이 바로
마크를 생성하는 주체입니다. **훅**은 일치하는 모든 도구 호출에서
하네스에 의해 실행되며, 협조가 필요하지 않습니다. 이것이 훅을 이 워크플로의
결정적 절반으로 만듭니다.
플러그인은 `Write|Edit|MultiEdit|NotebookEdit`에 `PostToolUse` 훅을 등록하여
에이전트가 방금 작성한 파일에 대해
[`service/scripts/hook_written_file.py`](https://github.com/guillaumemeyer/watermarks-remover/blob/main/service/scripts/hook_written_file.py)를
실행합니다. 기본 검사 방식의 pre-commit 관례에 맞춘 두 가지 모드가 있습니다:
| 모드 | 동작 |
| --- | --- |
| `check` (기본값) | 출처 마크를 보고하고 파일은 그대로 둡니다. 결과는 모델에게 전달되어(종료 코드 2) 정리를 제안할 수 있습니다. |
| `clean` | 마크를 제자리에서 제거한 후, 디스크의 파일이 변경되었음을 모델에게 알립니다. |
모드는 플러그인 설정(`/plugin manage`의 **Hook mode**, 훅이
`CLAUDE_PLUGIN_OPTION_HOOK_MODE`로 읽음)에서 설정하거나, 환경에서
`WATERMARKS_HOOK_MODE=clean`으로 설정할 수 있습니다. 훅 명령은 의도적으로
`${user_config.hook_mode}`를 보간하지 **않습니다**: Claude Code는 사용자가
`/plugin manage`를 열어 설정한 적 없는 옵션을 참조하는 훅 실행을 거부하며
— 선언된 `default`로는 충족되지 않습니다 — 따라서 이를 보간하면
새로 설치한 환경에서 훅이 조용히 실행되지 않게 됩니다. 탐지는 `audit_lib`의
`scan_file` / `is_actionable`을 재사용하므로, 훅, pre-commit 게이트, CI
SARIF 내보내기가 무엇이 조치 대상인지에 대해 일치합니다. 정리는
`clean_file.py`를 셸로 호출하므로 정리 로직이 중복되지 않습니다. `clean` 모드는
형제 임시 파일에 쓴 후 실제 차이가 있을 때만 교체하므로, 이미 깨끗했던 파일은
mtime을 유지하고 파일 감시자를 다시 트리거하지 않습니다.
플러그인 없이 사용하려면 `~/.claude/settings.json`(또는 프로젝트
`.claude/settings.json`)에 직접 연결하세요:```json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "python3",
"args": ["/path/to/watermarks-remover/service/scripts/hook_written_file.py",
"--mode", "check"],
"timeout": 30
}
]
}
]
}
}
Windows에서는 python3를 py로 바꾸세요.
훅이 할 수 없는 것. 어떤 훅도 당신이 읽기 전에 어시스턴트의 채팅 메시지를
다시 쓸 수 없습니다. Claude Code의 Stop 훅은 last_assistant_message를
읽기 전용으로 받으며, 최종 응답에 대한 사전 전송 필터는 없습니다 — 이는 이
프로젝트가 이미 Cursor 규칙에 대해 문서화한 것과 동일한 한계입니다. 따라서
결정론적 보장은 에이전트가 작성하는 파일과 git으로 들어가는 모든 것에
대한 pre-commit 게이트를 포괄합니다. 채팅 기록에만
존재하는 텍스트는 여전히 스킬 워크플로에 의존하며, 이는 모델 지시 기반이므로
최선 노력 방식입니다.
이 저장소는 또한 Claude Code 플러그인이자 단일 플러그인
마켓플레이스(.claude-plugin/)이므로, 두 스킬 모두 두 개의 명령으로
설치 및 업데이트되며, 클론이나 스크립트가 필요하지 않습니다:```
/plugin marketplace add guillaumemeyer/watermarks-remover
/plugin install watermarks-remover@watermarks-remover
스킬은 네임스페이스가 지정된 형태로 로드됩니다: `/watermarks-remover:remove-ai-marks` 및
`/watermarks-remover:clean-user-facing-text` (다른 것이 해당 이름을 차지하지 않으면
그냥 `/remove-ai-marks`도 작동합니다). `/plugin marketplace update
watermarks-remover`는 이후 버전을 가져옵니다. CLI에서도
`claude plugin marketplace add …` / `claude plugin install …`로 동일하게 작동하며, 로컬
체크아웃에서는 `owner/repo` 대신 경로를 전달하여 사용할 수 있습니다.
유지관리자용: `make plugin-validate`는 두 매니페스트에 대해 `claude plugin validate . --strict`를
실행하며, `tests/test_plugin_manifest.py`는 CLI 없이 동일한 파일을 검사합니다.
### Claude Code```bash
# Personal — available in all your projects
python3 install_skill.py --skill remove-ai-marks --target claude-code
# or: make install-claude-code-skill
# Project — commit .claude/skills/ to share it with the repo
python3 install_skill.py --skill remove-ai-marks --target claude-project \
--project-dir /path/to/project
# or: make install-claude-project-skill PROJECT=/path/to/project
Claude Code는 재시작 없이 개인 및 프로젝트 스킬을 인식하며, /skills는 로드된 스킬 목록을 보여줍니다. /remove-ai-marks로 호출하거나 "AI 워터마크 / C2PA / Claude 마크 / SynthID급 텍스트 제거"를 요청하세요. 프로젝트 설치 방식은 클라우드 세션에서도 읽히는데, 이는 저장소를 클론하고 해당 .claude/skills/를 로드하기 때문입니다.
Cowork 세션은 사용자 머신의 ~/.claude/skills를 읽지 않습니다 — 대신 claude.ai 계정에 활성화된 스킬을 로드하며, 세션 시작 시 동기화됩니다. 따라서 번들을 업로드하여 설치합니다:```bash
python3 install_skill.py --skill remove-ai-marks --target cowork
그런 다음 Claude Desktop 앱에서 **Customize → Skills → Add**를 열고 zip을 업로드하세요 (claude.ai의 동일한 스킬 설정도 작동합니다). 번들은 재현 가능하며, 루트에 `SKILL.md`가 있는 단일 최상위 `remove-ai-marks/` 디렉터리를 포함하는데, 이는 업로드가 기대하는 레이아웃입니다.