{"id":51524228,"url":"https://github.com/adrozdenko/metascrub","last_synced_at":"2026-07-08T19:01:34.545Z","repository":{"id":367184036,"uuid":"1279640889","full_name":"adrozdenko/metascrub","owner":"adrozdenko","description":"🧼 For photographers: strip C2PA/IPTC/XMP/EXIF provenance tags that wrongly label your own AI-retouched photos as 'Made with AI'. Local, lossless, private.","archived":false,"fork":false,"pushed_at":"2026-06-24T22:31:39.000Z","size":4003,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T00:07:09.898Z","etag":null,"topics":["ai-detection","c2pa","content-credentials","exif","exiftool","image-processing","instagram","macos","metadata","privacy"],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adrozdenko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-24T22:06:05.000Z","updated_at":"2026-06-24T22:31:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/adrozdenko/metascrub","commit_stats":null,"previous_names":["adrozdenko/metascrub"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/adrozdenko/metascrub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrozdenko%2Fmetascrub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrozdenko%2Fmetascrub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrozdenko%2Fmetascrub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrozdenko%2Fmetascrub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adrozdenko","download_url":"https://codeload.github.com/adrozdenko/metascrub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrozdenko%2Fmetascrub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35275246,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-detection","c2pa","content-credentials","exif","exiftool","image-processing","instagram","macos","metadata","privacy"],"created_at":"2026-07-08T19:01:33.834Z","updated_at":"2026-07-08T19:01:34.486Z","avatar_url":"https://github.com/adrozdenko.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🧼 MetaScrub\n\n### Your photo. Your edit. Your work. — minus the metadata that mislabels it as AI.\n\n**For photographers.** You took the shot and retouched it with AI tools — it's still *your* photograph. But your editor embeds **C2PA / IPTC / XMP / EXIF** provenance tags, and platforms like Instagram read them and stamp your post *\"Made with AI.\"* MetaScrub removes those tags — **losslessly, entirely on your machine** — so your own work isn't misrepresented.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-7c6bff.svg)](LICENSE)\n![Platform](https://img.shields.io/badge/platform-macOS%20·%20Linux%20·%20Windows-111)\n![Python](https://img.shields.io/badge/python-3.9%2B-3776AB?logo=python\u0026logoColor=white)\n![No tracking](https://img.shields.io/badge/network-100%25%20offline-43e09b)\n![Lossless](https://img.shields.io/badge/quality-lossless-43e09b)\n\n\u003cimg src=\"docs/screenshot.png\" alt=\"MetaScrub dark UI\" width=\"640\"\u003e\n\n\u003c/div\u003e\n\n---\n\n## Why this exists\n\nYou photograph a client, then use an AI tool (Photoshop Generative Fill, Lightroom AI, Topaz, ChatGPT…) to retouch the shot — fix a stray hair, smooth skin, clean the background. The result is still **your** photograph: your subject, your composition, your work. But the moment an AI tool touches the file it writes a signed **C2PA manifest** and an IPTC `digitalSourceType: trainedAlgorithmicMedia` tag. Instagram, Facebook and others read that metadata and stamp your post *\"Made with AI\"* — even when the edit was trivial.\n\nThat label misrepresents genuine photography as synthetic. **MetaScrub removes the metadata** so your own photos are judged as what they are — losslessly, on your own machine, nothing uploaded.\n\n## ✅ Intended use — and the line it won't cross\n\nMetaScrub is for **cleaning false AI‑labels off photographs you actually took and retouched.** Your camera captured the moment; an AI tool helped you edit it; the work is yours.\n\nIt is **not** for passing **fully AI‑generated images** — text‑to‑image pictures invented from a prompt, with no camera involved — off as authentic photography. Removing metadata doesn't make a synthetic image real, and where a platform or law requires AI disclosure, **disclose it.** Be honest about what you made.\n\n## ✨ Features\n\n- 🖱️ **Friendly drag‑and‑drop app** — add many photos at once, watch them clean in real time\n- 🪶 **Lossless** — JPEG pixels are never re‑encoded; PNG/WebP are re‑encoded losslessly (pixels identical)\n- 🧾 **Before/after report** — see exactly which tags were removed on every image\n- 🔒 **100% offline** — a tiny local web server; your photos never leave your computer\n- 🗂️ **Originals are never touched** — cleaned copies are written to a separate `out/` folder\n- ⌨️ **CLI included** — script the same engine for batch jobs\n- 🧰 Removes: **C2PA / JUMBF manifests**, **IPTC DigitalSourceType**, **XMP**, **EXIF**, software/author tags\n\n## 📸 Supported formats\n\n`JPG` · `JPEG` · `PNG` · `WebP` · `HEIC` · `TIFF` · `GIF`\n\n## 🚀 Quick start\n\n### Requirements\n\nRuns anywhere with **Python 3.9+** (standard library only — no pip packages) plus [ExifTool](https://exiftool.org/) and [ImageMagick](https://imagemagick.org/):\n\n| OS | Install the two tools |\n|----|-----------------------|\n| **macOS** | `brew install exiftool imagemagick` |\n| **Linux** (Debian/Ubuntu) | `sudo apt install libimage-exiftool-perl imagemagick` |\n| **Windows** | `winget install OliverBetz.ExifTool ImageMagick.ImageMagick` |\n\n### Run the app\n\n```bash\ngit clone https://github.com/adrozdenko/metascrub.git\ncd metascrub\npython3 server.py        # Windows: py server.py\n```\n\nIt starts a tiny local server and opens the UI in your browser. Drag photos in, download the clean versions. Done.\n\n\u003e **macOS shortcut:** double‑click **`Photo Cleaner.command`** in Finder instead of using the terminal.\n\n### Use the CLI\n\n```bash\n./clean.sh                 # clean every image in ./in  -\u003e ./out\n./clean.sh ~/Photos        # clean a whole folder       -\u003e ./out\n./clean.sh a.jpg b.png     # clean specific files       -\u003e ./out\n```\n\nEach run prints a per‑file before/after report.\n\n### Run the Telegram bot\n\nCreate a bot with [BotFather](https://t.me/BotFather), then run:\n\n```bash\nexport METASCRUB_TELEGRAM_TOKEN=\"123456:your-bot-token\"\npython3 bot.py\n```\n\nSend the bot an image as a **File/Document** and it replies with a cleaned copy.\nTelegram photos may be compressed before the bot receives them, so File/Document\nuploads are best when you want to preserve the original bytes. Unlike the web\napp and CLI, Telegram bot traffic passes through Telegram. Telegram's default\nBot API download limit is 20 MB per file.\n\n## 🔍 How it works\n\n| Format | Method | Quality |\n|--------|--------|---------|\n| **JPEG / HEIC** | `exiftool -all=` — strips every metadata block, pixels untouched | 🟢 Lossless (no re‑encode) |\n| **PNG / WebP / TIFF** | `magick … -strip` re‑encode (drops C2PA chunks) + `exiftool -all=` | 🟢 Lossless (pixels identical) |\n\nThe app exposes a minimal local HTTP server (`server.py`, stdlib only). The browser posts each image's bytes to `/clean`; the server runs the tools above, writes a clean copy to `out/`, and returns the result for preview and download. No frameworks, no telemetry, no cloud.\n\n## ⚠️ What this can — and can't — do (read this)\n\nMetaScrub removes **metadata**, which is the signal platforms use for the automatic AI‑label. It does **not** remove **pixel‑level invisible watermarks** such as Google **SynthID** or **Trufo**, which some *generative* tools (OpenAI's `gpt-image`, Google's Imagen/Gemini) bake directly into the pixels. Those survive metadata removal, re‑encoding, cropping and compression by design.\n\n\u003e **Tip for photographers:** to keep your retouched photo unambiguously *yours*, prefer **non‑generative editors** (Lightroom, Capture One, Photoshop manual retouching, Topaz) over tools that *regenerate* the image. Pixel‑editing your own photograph adds no watermark and no `trainedAlgorithmicMedia` tag in the first place — and the result is plainly your own work, not a synthetic rebuild of it.\n\n## 🗂️ Project structure\n\n```\nmetascrub/\n├── Photo Cleaner.command   # double‑click launcher (macOS)\n├── server.py               # local web server + cleaning engine (stdlib only)\n├── bot.py                  # Telegram bot using the same cleaning engine\n├── index.html              # the UI (dark theme)\n├── clean.sh                # CLI batch cleaner\n├── in/                     # drop photos here (CLI) — git‑ignored\n└── out/                    # cleaned copies land here — git‑ignored\n```\n\n## 🤝 Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md). Ideas: Windows/Linux launchers, a native menu‑bar build, video metadata support, watermark‑detection reporting.\n\n## 📄 License\n\n[MIT](LICENSE) © 2026 Andrii Drozdenko\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrozdenko%2Fmetascrub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadrozdenko%2Fmetascrub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrozdenko%2Fmetascrub/lists"}