Files
Bolt-Compress/README.md
T

4.6 KiB

Bolt Compress

A local desktop app for batch-compressing and resizing videos and images. Drop in a handful of files, choose how small you want them, and hit compress. No uploads, no accounts, no waiting on a website.

Built with PyQt6, Pillow, and FFmpeg.

Bolt Compress screenshot

Features

  • Drag and drop batch queue for images, videos, or a mix of both
  • Image tools — resize to a bounding box, scale by percentage, or keep dimensions; save as JPEG, WebP, PNG, or the original format; adjust quality; keep or strip metadata
  • Video tools — H.264, H.265, VP9, and AV1 encoders; quality (CRF), encoding speed, resolution, and audio bitrate controls
  • Per-file progress and status with before/after sizes and percentage saved
  • Cancellable background encoding so the interface stays responsive
  • Output next to originals or in a folder you choose; existing files are never overwritten
  • Remembers settings between launches
  • 100% offline — files are processed entirely on your machine

Requirements

  • Python 3.9 or newer
  • PyQt6 and Pillow (requirements.txt)
  • FFmpeg and ffprobe on PATH for video compression. Images work without FFmpeg.

On Windows, FFmpeg can be installed with:

winget install Gyan.FFmpeg

Make sure both ffmpeg and ffprobe resolve from a terminal after installation:

ffmpeg -version
ffprobe -version

If you prefer not to modify PATH, put ffmpeg.exe and ffprobe.exe in a bin folder beside app.py, or point the BOLT_FFMPEG_DIR environment variable at the folder that contains them.

Run it

python -m pip install -r requirements.txt
python app.py

Or double-click run.bat on Windows. You can also pass files or folders directly:

python app.py "C:\Videos\holiday.mp4" "C:\Photos"

Bolt Compress is also runnable as a module:

python -m bolt_compress

How to use it

  1. Drag media into the window, or use Add files / Add folder.
  2. Choose Images or Videos in the settings panel and tune the options.
  3. Pick an output destination (or leave it on Next to originals).
  4. Press Compress.

Output filenames use the suffix -compressed. If that file already exists, -compressed (2), -compressed (3), and so on are used. Originals are never modified.

Files that already have a result are skipped on the next run, so you can add more media without reprocessing the whole batch. Once everything in the queue is finished, the button changes to Compress again if you want a fresh set of copies with new settings.

Supported formats

Images in: JPG/JPEG, PNG, WebP, BMP, TIFF
Images out: original format, JPEG, WebP, or PNG

Videos in: MP4, MOV, MKV, AVI, WebM, M4V, MPEG, WMV, FLV, TS, 3GP, MTS, M2TS
Videos out: MP4 (H.264/H.265) or WebM (VP9/AV1)

Animated images (GIF, APNG, animated WebP) are not supported yet. Multi-page TIFFs are also skipped to avoid silently dropping frames.

Notes on video encoding

  • The quality slider maps to each codec's CRF value: higher means better quality and a larger file. The default (68) is a good balance for H.264.
  • AV1 produces excellent compression but can be extremely slow. The Fast speed setting is recommended for long videos.
  • Resizing caps the shorter edge at the selected resolution and never upscales. For example, 1080p gives a landscape video a height of 1080 and a portrait video a width of 1080.
  • Audio is re-encoded to AAC for MP4 and Opus for WebM, or removed entirely.
  • Only the primary video stream and the audio tracks are carried over. Subtitle and data tracks are omitted.
  • Output video is 8-bit 4:2:0 for broad player compatibility. HDR sources are converted, so their colors may look different.
  • Video metadata is stripped by default to maximize savings; enable Keep metadata if you need chapters or global tags.

Project layout

app.py                       Launcher
bolt_compress/
  app.py                     Application setup and entry point
  main_window.py             Main window, queue, drag/drop, destinations
  settings_panel.py          Image and video settings UI
  processing.py              Pillow/FFmpeg engines and background worker
  media.py                   Probing, path handling, FFmpeg discovery
  models.py                  Shared data models
  theme.py                   Dark theme, app mark, media icons
  widgets.py                 Empty-state drop target
  assets/                    Small SVG assets used by the stylesheet
run.bat                      Windows launcher
requirements.txt
docs/screenshot.png          Interface preview