📷 Metadata Stripper
Your photos know more than you do. Read it, then erase it.
"The photo was innocent. The GPS coordinates were not."
What is it?
Every file whispers: where it was taken, with what camera, by whom and at what exact moment. That whisper is metadata — and half the time it includes GPS coordinates. Metadata Stripper v2 reads the whisper, shows it to you in a beautiful Textual TUI, and then removes it for good.
JPEG / PNG / WebP / TIFF / BMP / GIF / ICO — EXIF, GPS, XMP, ICC, thumbnail
PDF — document info, XMP packet
DOCX / XLSX / PPTX / ODT / ODS / ODP — core/app/custom properties
ZIP — comments, timestamps, junk files
MP3 / FLAC / WAV / OGG / OPUS — ID3, vorbis, RIFF INFO
MP4 / MOV / MKV / WEBM / AVI — tags, covr, LIST INFO
DOC / XLS / PPT / MSG (OLE2) — read-only analysis
Run it
pip install "metadata-stripper[all]" # or: pip install -e .[all]
metastrip # 🚀 opens the TUI
metastrip with no arguments opens the Textual TUI — the main
interface. All subcommands below also work for scripting.
The TUI
Six tabs, keyboard-first, dark theme with a fire-gradient dragon banner:
| Tab | What you can do |
|---|---|
| Explorar | type a path, scan (F5), filter GPS-only / high-risk, click a file |
| Detalle | every metadata field grouped (EXIF/GPS/XMP/ICC/doc/audio…) |
| GPS | decimal + DMS coordinates, geohash, plus code, altitude, nearest cities, map/OSM links, plausibility check |
| Limpiar | profile select (full/gps/dates/author/device/paper), keep/remove fields, dry-run, rename, output dir, live log |
| Batch | parallel mass-clean with N workers, progress bar, cancel |
| Reporte | export scan results as JSON / CSV / HTML |
| Renombrar | chameleon rename: random or {index} {name} {ext} {date} {time} {rand} |
Key bindings: F5 rescan · Ctrl+S clean selection · Ctrl+B clean all ·
R rename · E export · Q quit.
CLI (scripting)
metastrip scan ~/fotos -v # risk report per file
metastrip exif photo.jpg # full technical dump
metastrip gps show photo.jpg # coordinates + cities + map URL
metastrip gps remove photo.jpg # strip only GPS
metastrip strip photo.jpg --profile gps # selective by profile
metastrip strip ./export --keep make,model # keep camera info
metastrip batch ./export --workers 8 --report html
metastrip report ./dir --format html --out report.html
metastrip verify clean.jpg # exit 0 = clean
metastrip rename ./dir --mode random # no date hints
metastrip profiles # list cleaning profiles
Cleaning profiles
| Profile | What it removes |
|---|---|
full |
everything |
gps |
coordinates, latitude, longitude, altitude, geotag |
dates |
date/time/created/modified/datetime |
author |
author/creator/artist/owner/company/last |
device |
make/model/software/lens/camera/focal |
paper |
keeps only resolution/width/height/dpi/orientation/pixel |
Optional dependencies
Pillow + textual are required. Everything else is optional per format:
pip install "metadata-stripper[pdf]" # pypdf
pip install "metadata-stripper[audio]" # mutagen
pip install "metadata-stripper[ole]" # olefile
pip install "metadata-stripper[all]" # everything
Without an optional dep the format simply isn't registered (the TUI and CLI
keep working) and a clear pip install hint is shown if you try to use it.
Tests
pip install pytest
pytest
109 tests cover every format handler, GPS parsing, risk scoring, batch, reports, rename and redaction.
License
MIT — clean your own files and let the protagonist's geotag be a plot point, not a leak.
Release files for metadata-stripper 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| metadata_stripper-0.1.1.tar.gz | 77.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| metadata_stripper-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 143.9 kB
Release files / metadata_stripper-0.1.1.tar.gz
| Download URL | metadata_stripper-0.1.1.tar.gz |
|---|---|
| Size | 77.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7a313316ee20a059454a4ae7e49bf4a0340469ffaf8d7ee51122a0db35cf3058
|
|
BLAKE2b-256 checksum How to use checksums |
ada12366c7b8acd05c14db9fa2bfa08889762264abd9735d8802e45e048bdd0c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Release files / metadata_stripper-0.1.1-py3-none-any.whl
| Download URL | metadata_stripper-0.1.1-py3-none-any.whl |
|---|---|
| Size | 66.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5418d8c662a4e4ee9b0ac30d684d6a3b75b90a39959306fc3aece8198d3bd2cb
|
|
BLAKE2b-256 checksum How to use checksums |
4d173d46a5ebf507021e1b5d353f832587f04e3a62250c07bb78c660ede3500a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|