Every file has a story.
MetaDetective reads it.
Metadata. Hidden inside every document, image, and file your targets publish. Authors. Software versions. GPS coordinates. Internal hostnames. Creation dates. All embedded. All exposed. MetaDetective surfaces it.
Powered by exiftool. 25+ fields extracted from documents, images, and media - authors, software, creation dates, internal hostnames, serial numbers, hyperlinks.
iPhone and iPad photos carry sub-meter GPS precision. MetaDetective now reads HEIC and HEIF natively - a direct line to geolocation from a single image file.
Crawl target sites directly. No search engine in the middle, no IP blocks. Multithreaded, configurable depth, rate-limited, extension-filtered.
DMS to decimal degrees conversion, Nominatim reverse geocoding with caching, direct map links. Physical location from a single file.
HTML for client reports. TXT for archiving. JSON for piping into jq, databases, or custom tooling. Structured. Predictable. Scriptable.
--parse-only Author Creator limits extraction to exactly what you need. Less noise. Faster output. Cleaner downstream pipelines.
One file. Zero Python dependencies. Deploy anywhere Python 3 and exiftool are available.
# Fastest - one curl, no pip, no clone $ curl -O https://raw.githubusercontent.com/franckferman/MetaDetective/stable/src/MetaDetective/MetaDetective.py $ python3 MetaDetective.py -h # Install exiftool if needed $ sudo apt install libimage-exiftool-perl # Debian / Ubuntu / Kali $ brew install exiftool # macOS
$ python3 -m venv MetaDetectiveEnv $ source MetaDetectiveEnv/bin/activate $ pip install MetaDetective $ metadetective -h
$ git clone https://github.com/franckferman/MetaDetective.git $ cd MetaDetective $ python3 src/MetaDetective/MetaDetective.py -h
$ docker pull franckferman/metadetective $ docker run --rm -it franckferman/metadetective -h # Mount a local directory $ docker run --rm -v $(pwd)/loot:/data franckferman/metadetective -d /data
# Singular deduplicated view $ python3 MetaDetective.py -d ./loot/ # PDF and DOCX only, filter noise $ python3 MetaDetective.py -d ./loot/ -t pdf docx -i admin anonymous # Per-file formatted display $ python3 MetaDetective.py -d ./loot/ --display all --format formatted
# JSON, targeted fields only $ python3 MetaDetective.py -d ./docs/ \ --parse-only Author Creator \ -e json -o ~/results/ # Pivot with jq $ jq '.unique.Author' ~/results/MetaDetective_Export-*.json
# Scan without downloading $ python3 MetaDetective.py --scraping --scan \ --url https://target.com/ # Download PDFs, depth 2, 8 threads $ python3 MetaDetective.py --scraping \ --url https://target.com/ \ --download-dir ~/loot/ \ --extensions pdf docx --depth 2 --threads 8
# iPhone photos - extract GPS $ python3 MetaDetective.py -d ./photos/ \ -t heic heif jpg \ --parse-only 'GPS Position' 'Map Link' # HTML report with reverse geocoding $ python3 MetaDetective.py -f photo.heic -e html