# Pixstrip

Batch image processor for Linux. Resize, convert, compress, strip metadata, watermark, rename, and adjust - all in one wizard or one command.

![Pixstrip workflow screen](data/screenshots/01.png)

## Download

Grab the latest AppImage from the [releases page](https://git.lashman.live/lashman/pixstrip/releases), make it executable, and run:

```bash
chmod +x Pixstrip-x86_64.AppImage
./Pixstrip-x86_64.AppImage
```

No dependencies to install. GTK4 and libadwaita are bundled inside.

## Features

Pixstrip handles the operations photographers, designers, and web developers repeat on every batch of images. Each operation is a step in a wizard - enable only what you need, skip the rest.

| Operation | What it does |
|---|---|
| **Resize** | Scale by width, height, exact dimensions, or fit-in-box. Social media presets included. |
| **Adjustments** | Brightness, contrast, saturation, rotation, crop. Grayscale, sepia, sharpen effects. |
| **Convert** | JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP. Per-format mapping for mixed input batches. |
| **Compress** | Optimized encoders: mozjpeg, oxipng, libwebp, ravif. Live before/after quality preview. |
| **Metadata** | Strip all, privacy mode, photographer mode, or pick individual EXIF categories. |
| **Watermark** | Text or image overlays. Position grid, rotation, opacity, tiling, custom fonts. |
| **Rename** | Prefix, suffix, case conversion, sequential counters, regex, EXIF variable templates. |

Beyond the per-image operations:

- **8 built-in presets** for common workflows (Blog Photos, Social Media, Web Optimization, and more)
- **Custom presets** - save any workflow and reuse it
- **Watch folders** - monitor directories and auto-process new images
- **Processing history** with undo via system trash
- **File manager integration** for Nautilus, Nemo, Thunar, and Dolphin
- **Full CLI** with complete feature parity

## Screenshots

<details>
<summary>Image selection and thumbnail grid</summary>

![Images step](data/screenshots/02.png)

</details>

<details>
<summary>Resize with live preview</summary>

![Resize step](data/screenshots/03.png)

</details>

<details>
<summary>Format conversion cards</summary>

![Convert step](data/screenshots/04.png)

</details>

<details>
<summary>Compression with before/after preview</summary>

![Compress step](data/screenshots/05.png)

</details>

<details>
<summary>Image adjustments</summary>

![Adjustments step](data/screenshots/06.png)

</details>

<details>
<summary>Metadata handling with custom categories</summary>

![Metadata step](data/screenshots/07.png)

</details>

<details>
<summary>Text watermark with live preview</summary>

![Watermark step](data/screenshots/08.png)

</details>

<details>
<summary>Batch rename with live file preview</summary>

![Rename step](data/screenshots/09.png)

</details>

<details>
<summary>Output summary and processing</summary>

![Output step](data/screenshots/10.png)
![Processing complete](data/screenshots/11.png)

</details>

<details>
<summary>Settings and extras</summary>

![Save as preset](data/screenshots/12.png)
![Settings](data/screenshots/13.png)
![Processing history](data/screenshots/14.png)
![Keyboard shortcuts](data/screenshots/15.png)

</details>

## GUI Usage

**Preset workflow:** Pick a preset on the first screen. Pixstrip loads recommended settings and jumps to the image selection step. Add images, review the output summary, and hit Process.

**Custom workflow:** Select Custom, toggle the operations you want, then step through each one. Every step has a help button with guidance specific to that operation. Advanced options are tucked behind expanders to keep the interface clean.

The step indicator at the top shows your progress. Click any completed step to jump back. Disabled steps are automatically skipped. Navigate with Back/Next buttons or Alt+Left/Alt+Right.

## CLI Usage

The CLI mirrors every GUI feature. Process images with flags, presets, or a combination of both.

```bash
# Resize to 1200px wide
pixstrip process photos/ --resize 1200

# Convert to WebP at high quality
pixstrip process *.png --format webp --quality high

# Fit within 1920x1080, strip metadata, rename to lowercase
pixstrip process photos/ --resize fit:1920x1080 --strip-metadata --rename-case lower

# Use a saved preset
pixstrip process photos/ --preset "Blog Photos"

# Override a preset option
pixstrip process photos/ --preset "Blog Photos" --resize 800

# Fine-tune compression per format
pixstrip process photos/ --jpeg-quality 90 --webp-quality 85 --avif-quality 70

# Add a tiled diagonal watermark
pixstrip process photos/ --watermark "(c) 2026" --watermark-tiled \
  --watermark-rotation 45 --watermark-color ff0000

# Combine everything
pixstrip process photos/ -r --resize fit:1920x1080 --format webp \
  --quality high --strip-metadata --rename-case lower -o output/
```

Rename templates support variables:

| Variable | Value |
|---|---|
| `{name}` | Original filename without extension |
| `{ext}` | File extension |
| `{counter}` | Sequential number |
| `{counter:N}` | Sequential number with N-digit padding |
| `{width}` | Image width in pixels |
| `{height}` | Image height in pixels |
| `{date}` | File modification date (YYYY-MM-DD) |

```bash
pixstrip process photos/ --rename-template "{name}_{width}x{height}.{ext}"
```

## Built-in Presets

| Preset | Operations |
|---|---|
| Blog Photos | Resize 1200px wide, JPEG high quality, strip all metadata |
| Social Media | Fit 1080x1080, compress medium, strip metadata |
| Web Optimization | Convert to WebP, compress high, sequential rename |
| Email Friendly | Resize 800px wide, JPEG medium quality |
| Privacy Clean | Strip all metadata, no other changes |
| Photographer Export | Resize 2048px, compress high, privacy metadata, rename by date |
| Archive Compress | Lossless compression, preserve metadata |
| Print Ready | Maximum quality, convert to PNG, keep all metadata |

## Watch Folders

Monitor directories for new images and process them automatically with a preset.

```bash
# Add a watch folder
pixstrip watch add ~/incoming --preset "Web Optimization"

# List active watches
pixstrip watch list

# Start watching
pixstrip watch start

# Remove a watch
pixstrip watch remove ~/incoming
```

In the GUI, watch folders are configured in Settings.

## File Manager Integration

Right-click images in your file manager to process them with Pixstrip. Toggle integration per file manager in Settings.

| File Manager | Method |
|---|---|
| Nautilus (GNOME Files) | Python extension, dynamic preset submenu |
| Nemo (Cinnamon) | Python extension, dynamic preset submenu |
| Thunar (Xfce) | Custom action, regenerated when presets change |
| Dolphin (KDE) | Service menu, regenerated when presets change |

## Building from Source

Requires Rust 1.85+, GTK4 4.16+, and libadwaita 1.6+.

```bash
# Install GTK4/libadwaita dev packages (Ubuntu/Debian)
sudo apt install libgtk-4-dev libadwaita-1-dev

# Build
git clone https://git.lashman.live/lashman/pixstrip.git
cd pixstrip
cargo build --release

# Run
./target/release/pixstrip-gtk    # GUI
./target/release/pixstrip-cli    # CLI
```

<details>
<summary>Build an AppImage</summary>

The included build script bundles all dependencies into a portable AppImage.

```bash
./build-appimage.sh
```

This downloads `linuxdeploy` and its GTK plugin on first run, bundles the GTK4 libraries, and produces `Pixstrip-x86_64.AppImage`.

</details>

## Project Structure

```
pixstrip/
  pixstrip-core/    Shared library - image operations, presets, pipeline, watcher
  pixstrip-gtk/     GTK4/libadwaita GUI application
  pixstrip-cli/     Command-line interface
  data/             Desktop file, metainfo, icons, screenshots
```

## License

CC0 - Public Domain. Do whatever you want with it.
