{"id":48375305,"url":"https://github.com/morphilab/theduckpurge","last_synced_at":"2026-06-12T08:01:34.727Z","repository":{"id":349384568,"uuid":"1202125757","full_name":"Morphilab/theduckpurge","owner":"Morphilab","description":"Limpieza segura y confiable de metadatos • PDF, imágenes, Office, audio y video","archived":false,"fork":false,"pushed_at":"2026-04-05T16:35:26.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-05T18:24:20.604Z","etag":null,"topics":["bash","cli","linux","metadata","privacy","security","security-tool","tool"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/Morphilab.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"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-04-05T16:23:37.000Z","updated_at":"2026-04-05T16:41:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Morphilab/theduckpurge","commit_stats":null,"previous_names":["morphilab/theduckpurge"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Morphilab/theduckpurge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphilab%2Ftheduckpurge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphilab%2Ftheduckpurge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphilab%2Ftheduckpurge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphilab%2Ftheduckpurge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Morphilab","download_url":"https://codeload.github.com/Morphilab/theduckpurge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Morphilab%2Ftheduckpurge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34234557,"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-06-12T02:00:06.859Z","response_time":109,"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":["bash","cli","linux","metadata","privacy","security","security-tool","tool"],"created_at":"2026-04-05T18:03:29.423Z","updated_at":"2026-06-12T08:01:34.722Z","avatar_url":"https://github.com/Morphilab.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🦆 The Duck Purge\n\n**Secure and reliable metadata sanitizer**\n\nProtect your privacy by removing metadata from PDFs, images, Office documents, audio, and video files.\n\n![GitHub Actions](https://github.com/morphilab/theduckpurge/workflows/Tests/badge.svg)\n![License](https://img.shields.io/badge/license-MIT-blue.svg)\n![Version](https://img.shields.io/badge/version-1.0.0-brightgreen)\n![Shell](https://img.shields.io/badge/shell-bash-89e051)\n\n## ✨ Features\n\n- **4 progressive cleaning levels** (`light` → `paranoid`)\n- Supports PDF, JPG, PNG, DOCX, XLSX, MP4, MP3, and more\n- Advanced options: `--check-only`, `--dry-run`, `--zero-trace`\n- Optional automatic backups\n- Automatic renaming of cleaned files\n- Fully offline — only depends on `mat2` and `exiftool`\n\n## ⚠️ AI Disclosure / Divulgación de IA\n\n**English:**  \nThis project was developed with assistance from artificial intelligence tools. Given the automated nature of some components, users are advised to review and test the code independently before integrating it into their own systems.\n\n**Español:**  \nEste proyecto fue desarrollado con asistencia de herramientas de inteligencia artificial. Dada la naturaleza automatizada de algunos componentes, se recomienda que los usuarios revisen y prueben el código independientemente antes de integrarlo en sus propios sistemas.\n\n## 🚀 Installation\n\n### Recommended (one-liner)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/morphilab/theduckpurge/main/install.sh | sudo bash\n```\n\n### Or clone the repository\n\n```bash\ngit clone https://github.com/morphilab/theduckpurge.git\ncd theduckpurge\nchmod +x theduckpurge\nsudo cp theduckpurge /usr/local/bin/\n```\n\n## 📖 Usage\n\nNo arguments shows the help. Examples:\n\n```bash\n# Only check metadata\ntheduckpurge --check-only document.pdf\n\n# Standard cleaning (recommended)\ntheduckpurge --level standard image.jpg\n\n# Maximum recursive cleaning\ntheduckpurge --level paranoid -R ./my_files/\n\n# Quiet, only errors and warnings\ntheduckpurge --quiet --level aggressive *.docx\n```\n\n### Demo\n\n**Before cleaning** — metadata leaks your authorship and software:\n\n```text\n$ exiftool photo.jpg | grep -E 'Author|Title|Software'\nTitle                          : Prueba TheDuckPurge\nAuthor                         : morphilab\n```\n\n**Clean it:**\n\n```text\n$ theduckpurge --level standard photo.jpg\ntheduckpurge v1.0.0 — standard\n• [1/1] Processing: photo.jpg (level: standard)\n✓ Cleaned: photo.jpg\n\nEvaluated: 1  |  Cleaned: 1  |  Skipped: 0  |  Failed: 0\n✓ Cleanup completed.\n```\n\n**After cleaning** — privacy metadata is gone, technical fields (size, dimensions, MIME) are preserved:\n\n```text\n$ exiftool photo.jpg | grep -E 'Author|Title'\n(no output)\n```\n\n**Dry-run recursive scan** of a directory tree:\n\n```text\n$ theduckpurge --dry-run --level paranoid -R ./my_files/\ntheduckpurge v1.0.0 — paranoid\n• Processing directory: ./my_files/\n• [1/3] [DRY RUN] Would process: report.pdf (level: paranoid)\n⚠ Unsupported format: notes.txt\n• [3/3] [DRY RUN] Would process: vacation.jpg (level: paranoid)\n\nEvaluated: 3  |  Simulated: 2  |  Skipped: 1  |  Failed: 0\n• Simulation completed.\n```\n\n### Main options\n\n| Option              | Description                                      |\n|---------------------|--------------------------------------------------|\n| `--level LEVEL`     | light / standard / aggressive / paranoid         |\n| `--check-only`      | Only verify, do not modify                       |\n| `--dry-run`         | Simulate without making changes                  |\n| `--zero-trace`      | Silent mode, no backups                          |\n| `--backup`          | Create backup before cleaning                    |\n| `--rename`          | Rename cleaned files                             |\n| `-R, --recursive`   | Process directories recursively                  |\n| `--quiet`           | Only show errors and warnings                    |\n| `--force`           | Ignore 100 MB size limit                         |\n\n## 🛡️ Cleaning Levels\n\n| Level         | Tools used                       | Speed        | Security       |\n|---------------|----------------------------------|--------------|----------------|\n| **light**     | mat2 --light                     | Very fast    | Basic          |\n| **standard**  | mat2 (default)                   | Fast         | Good           |\n| **aggressive**| mat2 + exiftool                  | Medium       | Very good      |\n| **paranoid**  | mat2 + exiftool + re-encode     | Slow         | **Maximum**    |\n\n## 📂 Project structure\n\n```\ntheduckpurge/\n├── theduckpurge              # Main script (557 lines)\n├── install.sh                # One-liner installer\n├── test/\n│   ├── test_theduckpurge.bats # 32 Bats tests\n│   └── fixtures/             # Real test files\n├── .github/workflows/        # CI/CD (ShellCheck + Bats)\n├── AGENTS.md                 # Development guide\n├── CHANGELOG.md\n├── LICENSE\n└── README.md\n```\n\n## 🧪 Tests\n\nThe project includes **32 automated tests** using [Bats](https://github.com/bats-core/bats-core). They cover argument parsing, metadata detection, dry-run, quiet mode, real cleaning, backup, rename, symlink rejection, recursive processing, paranoid mode, and more.\n\n```bash\n# Install test dependencies (once)\nmkdir -p test/test_helper\ngit clone --depth 1 https://github.com/bats-core/bats-support.git test/test_helper/bats-support\ngit clone --depth 1 https://github.com/bats-core/bats-assert.git  test/test_helper/bats-assert\n\n# Run tests\nbats --print-output-on-failure test/test_theduckpurge.bats\n```\n\n## Requirements\n\n- `mat2`\n- `exiftool` (`libimage-exiftool-perl`)\n- `ffmpeg` (only needed for `paranoid` level)\n\nInstall on Debian/Ubuntu:\n```bash\nsudo apt install mat2 libimage-exiftool-perl ffmpeg\n```\n\n---\n\n**License:** MIT  \n**Version:** 1.0.0 (June 2, 2026)  \n**Author:** morphilab\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorphilab%2Ftheduckpurge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorphilab%2Ftheduckpurge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorphilab%2Ftheduckpurge/lists"}