🛡️ FSF Tools
File Sanitization Framework — the Swiss Army knife for file metadata
View, clean, spoof, strip, forge, hash, and audit metadata across images, audio, PDF, and Office files
Русское руководство / Russian Guide
✨ What Makes FSF Tools Different?
| Feature | FSF Tools 🛡️ | ExifTool 📸 | MAT2 🧹 |
|---|---|---|---|
| Core Philosophy | Generate plausible metadata | Read/write tags | Strip everything |
| User Knowledge | Automated (presets, profiles) | Requires expert knowledge | None (just cleans) |
| Physical Correlation | Yes (Exposure Triangle sync) | No | N/A |
| Identity Forging | Yes (Consistent personas) | No | No |
| Forensic Audit | Built-in inconsistency checks | No | No |
| Surgical Strip | Yes (GPS-only, dates-only, etc.) | Manual per-tag | All or nothing |
| Trip Timeline | Yes (multi-day GPS drift) | No | No |
| Hash Mutation | Yes (change hash without corruption) | No | No |
| Metadata Templates | Yes (save/load YAML profiles) | Partial (argfiles) | No |
🚀 Quick Start
Install
pip install fsf-tools
# or clone for development
git clone https://github.com/Svargentyur/fsf-tools.git
cd fsf-tools
pip install -e .
📋 Commands (16 total)
🔍 View metadata
fsf view photo.jpg
fsf view --json photo.jpg
🧹 Clean (strip all metadata)
fsf clean photo.jpg
fsf clean photo.jpg -o clean.jpg
✂️ Strip (surgical removal) NEW
Remove only specific metadata categories — keep everything else intact.
fsf strip photo.jpg --gps # GPS/location only
fsf strip photo.jpg --dates # Date/time only
fsf strip photo.jpg --device # Camera make/model/serial
fsf strip photo.jpg --thumbnail # Embedded thumbnail
fsf strip photo.jpg --all # All of the above
🎭 Spoof (set specific values)
fsf spoof photo.jpg --preset iphone_15_pro --city tokyo --sync-time
fsf spoof document.pdf --author "Jane Doe" --title "Quarterly Report"
🎲 Randomize (generate plausible fakes)
fsf randomize photo.jpg
fsf randomize photo.jpg --scene night_street --preset sony_a7iv --sync-time
🧬 Forge (consistent identity across files)
fsf forge *.jpg --locale jp --camera fuji_xt5 --city kyoto
📅 Timeline (trip simulation) NEW
Apply a realistic multi-day trip timeline with GPS drift between hotspots, time-of-day correlated exposure, and natural shooting patterns.
fsf timeline *.jpg --city tokyo --preset sony_a7iv --days 3 --sync-time
fsf timeline *.jpg --city paris --style enthusiast --days 5
🔑 Hash (compute, verify, mutate) NEW
fsf hash photo.jpg # Show MD5/SHA1/SHA256
fsf hash photo.jpg -a sha512 # Specific algorithm
fsf hash photo.jpg --mutate # Change hash without corrupting file
fsf hash photo.jpg --verify <expected> # Verify against known hash
📋 Template (save/load metadata profiles) NEW
fsf template save photo.jpg my_preset -d "Tokyo night preset"
fsf template list
fsf template apply my_preset target.jpg
fsf template delete my_preset
🕵️ Audit (forensic consistency check)
fsf audit photo.jpg
🛠️ Other Commands
fsf clone— Clone metadata from one file to anotherfsf compare— Compare metadata of two files side by sidefsf batch— Batch process all supported files in a directoryfsf report— Analyze a file for privacy risks (risk score 0–100)fsf export— Export file metadata to a JSON filefsf presets— List available camera presets and cities
🎯 Realism Features
- 📸 Exposure Triangle: ISO, shutter speed, and aperture are physically correlated
- 🌇 Scene Profiles: 6 profiles (daylight, golden hour, indoor, night, portrait, landscape)
- 📷 18 Camera Presets: With real firmware strings, lens models, and resolutions
- 🌍 20 Cities: With 80+ tourist hotspot GPS coordinates
- 👤 Identity Forge: Generate consistent personas with names in 6 locales
- 🔍 Forensic Audit: 10 checks for EXIF inconsistencies
- ⏱️ Timestamp Sync: Match file system mtime/atime to EXIF dates
- 📅 Trip Timeline: Multi-day GPS drift with time-of-day scene correlation
- ✂️ Surgical Strip: Remove GPS/dates/device/thumbnail independently
- 🔑 Hash Mutation: Change file hash without affecting visual content
- 📋 YAML Templates: Save and reuse metadata profiles
📁 Supported Formats
| Format | View | Clean | Spoof | Strip | Clone |
|---|---|---|---|---|---|
| JPEG / PNG / TIFF / WebP | ✅ | ✅ | ✅ | ✅ | ✅ |
| MP3 / FLAC / OGG / M4A | ✅ | ✅ | ✅ | — | ✅ |
| ✅ | ✅ | ✅ | — | ✅ | |
| DOCX / XLSX / PPTX | ✅ | ✅ | ✅ | — | ✅ |
🔧 Development
git clone https://github.com/Svargentyur/fsf-tools.git
cd fsf-tools
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest # 27 tests
📝 License
Released under the GNU General Public License v3.0 (GPL-3.0).
Metadata
Release files for fsf-tools 3.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fsf_tools-3.0.0.tar.gz | 673.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fsf_tools-3.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 743.8 kB
Release files / fsf_tools-3.0.0.tar.gz
| Download URL | fsf_tools-3.0.0.tar.gz |
|---|---|
| Size | 673.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bc88a860c30bb36d9628785629062ec03efe87735a94e721e38578d6d9d5ed83
|
|
BLAKE2b-256 checksum How to use checksums |
f4aaebf55d1aeb72f3f0c6acb1601d518cdc70e9d73c737e67c2a81a6b3239cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / fsf_tools-3.0.0-py3-none-any.whl
| Download URL | fsf_tools-3.0.0-py3-none-any.whl |
|---|---|
| Size | 70.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bee93b12d5e85f43c4e4fee2dd6227549a47f11fff86475c936f53939036af44
|
|
BLAKE2b-256 checksum How to use checksums |
777a62a6e599772dcddc5ce48b04feb272194debe5db040ca659e05a74f3bc88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|