# imgst
`imgst` is a command-line tool for processing and metadata removal from
image files (currently JPEG).
It recursively scans a directory, removes metadata such as EXIF, and writes the
cleaned files into a separate output directory while preserving the folder
structure.
## Why
When publishing images on websites or sharing them publicly, embedded metadata
(EXIF) may leak sensitive information:
- GPS coordinates
- Device information (camera model, serial)
- Date and time the photo was taken
- Thumbnails containing past edits
- Optional personal identifiers
Images uploaded from mobile devices frequently include **location metadata**,
which can expose private home or workplace addresses.
Additionally, metadata increases file size, affecting storage and page load
performance.
### Safer and lighter images
By stripping metadata:
- No privacy-leaking metadata remains
- Storage and bandwidth usage shrink
- Website performance improves
## Features
- Recursive directory scanning with ignore rules (`.gitignore`, `.ignore`)
- JPEG EXIF metadata removal (`web-image-meta`)
- Preserves the directory hierarchy
- Parallel processing for performance
- Dry-run mode shows what would be processed without modifying files
- Optional statistics (`--stats`) including total space savings
- Logging with adjustable verbosity (`-v`, `RUST_LOG`)
## Requirements
- Rust toolchain (Rust 1.89 or newer recommended)
To install Rust:
```sh
curl https://sh.rustup.rs -sSf | sh
```
Verify installation:
```sh
rustc --version
cargo --version
```
## Building
Clone the repository and build the binary:
- **Official**: ssh://anon@ijanc.org/imgst
- Mirror Sourcehut: git@git.sr.ht:~ijanc/imgst
- Mirror Github: git@github.com:ijanc/imgst.git
```sh
git clone ssh://anon@ijanc.org/imgst
cd imgst
cargo build --release
```
The binary will be located at:
```
target/release/imgst
```
You can add it to your PATH or move it to `/usr/local/bin`.
or
```
cargo install --path .
```
## Command Overview
`imgst` currently supports one primary operation:
### Metadata Cleaning
Recursively removes metadata from image files and writes the result to a
separate output folder:
```sh
imgst --input ./photos --output ./public/photos
```
Preserves folder structure:
```
photos/
└── albums/
└── party/
└── img_001.jpg
public/photos/
└── albums/
└── party/
└── img_001.jpg <-- cleaned
```
### Dry-run mode
Shows what would be processed but does not write anything:
```sh
imgst -i ./photos -o ./out --dry-run -v
```
### Statistics mode
Display space savings after completion:
```sh
imgst -i ./photos -o ./out --stats
```
Example output:
```
Stats:
Original total : 9.83 GB
Clean total : 8.97 GB
Saved : 860 MB (8.7%)
```
## Logging and verbosity
`imgst` uses standard Rust logging (`env_logger`).
Default level: **INFO**
Use `-v` to enable DEBUG:
```sh
imgst -v -i ./photos -o ./out
```
Or configure directly:
```sh
RUST_LOG=debug imgst ...
```
## License
Licensed under the ISC license\
(see [`LICENSE`](LICENSE) or https://opensource.org/licenses/ISC)