A Linux image compressor / converter for all common image formats. Lossless or lossy, individually or in batch, GUI or instant processing.
- compress common image formats (PNG, JPEG, GIF, WebP, AVIF, JXL, SVG) lossless or lossy.
- BMP + TIFF are always encoded to WebP.
- animated GIFs and PNGs are always compressed losslessly; animated WebP is flattened to its first frame.
- convert any input format to any supported output format.
- optionally strip metadata (EXIF/XMP/JUMBF), reset file attributes.
- save output next to the original, to a custom folder, or backup->overwrite originals.
- optionally write the results into an
imslim-<timestamp>-<pid>directory. - overwriting keeps the filename; when the output format changes (or BMP/TIFF are re-encoded to WebP), the result is written beside the original, which is left in place.
- skip files whose compressed result would be larger.
- recurse directories for batch compression.
- three-column window: queue, options, and a live original/processed comparison.
- right-click a queued file for Copy Path and Properties (dimensions, byte size, EXIF, timestamps).
- drop files or folders on the window, or paste copied files or an image with
Ctrl+V. - ImSlimNow: process files straight from a file manager, without the main window.
- configurable compression timeout, log level and log rotation.
- follows the system light/dark theme; UI strings are translatable.
Download the latest release — the AppImage, install_appimage.sh, imslim.desktop, imslim-now.desktop and imslim.svg into one folder — then run:
bash install_appimage.sh ImSlim-*-linux-x86_64.AppImageThis copies the AppImage to ~/Applications, adds ImSlim to your application menu, and registers it as a handler for the supported image types.
imslim [FILES...] # queue the given files and folders, then open the window
imslim --now FILES... # process them immediately, without the main window
imslim --help # usage
imslim --version # versionPaths are handed to an already running ImSlim; without arguments the main window opens. Unknown options are rejected; put -- before a filename that starts with -. ImSlimNow takes no single-instance lock, so it runs alongside the GUI and exits with 0 on success, 1 when some files failed and 2 on a usage or environment error.
ImSlim is built with Python / PySide6. The compression libraries are built from source and statically linked:
- gifsicle
- Jpegli (
cjpegli/djpegli) - libavif (
avifenc/avifdec) - libjxl (
cjxl/djxl) - libwebp (
cwebp) - mozjpeg (
jpegtran) - oxipng
- pngquant
- svgo
The AppImage and wheel carry these binaries, so no system tools are needed at runtime. Logs are written to ~/.local/state/ImSlim/imslim.log (rotating); ImSlimNow writes imslim-now.log beside it so the two processes never rotate the same file.
Requires Python 3.14+, uv; C/C++ toolchain (CMake, Ninja, pkg-config, curl, git) for the bundled tools; scripts/build_tools.sh installs what the distro package manager (apt/pacman) provides and downloads a pinned Node for svgo. Translations need GNU gettext.
git clone https://github.com/dcog989/ImSlim
cd ImSlim
make init # uv sync
make tools # build src/imslim/bin/linux-x86_64/
make runmake build # build the wheel + sdist
make check # runs ruff check + ruff format check + basedpyright + pytest
make clean # remove all build artifacts
make distclean # remove build tools - expensive!
make fix # auto fix lint issues and format
make init # runs uv sync, installs deps
make install # install locally (even if version unchanged)
make package-linux # build the Linux AppImage
make run # runs the app
make tools # runs build / update script for image libraries
make translations # extract strings and rebuild translation catalogs
make uninstall # remove the uv tool, desktop entry, icon and AppImage
make upgrade # refresh dependency lockfile to newest versionsuv tool upgrade imslim # just imslim
uv lock --upgrade && uv sync # this project's Python deps
uv tool upgrade --all # global uv-installed toolsUI strings are wrapped in _() from imslim._i18n, which loads gettext catalogs from src/imslim/locale/. Add a language with ./scripts/translations.sh init <lang>, edit its .po, then
make translations to regenerate the template and compile the .mo files (requires GNU gettext). Untranslated builds fall back to English.
Note
make install: installs the app into the user's home (via uv tool install), registers it as a handler for supported image types and directories, and refreshes the desktop menu cache with whatever tool the distro provides (kbuildsycoca on KDE, update-desktop-database on freedesktop-based DEs). It runs kbuildsycoca6/kbuildsycoca5 or update-desktop-database when present, so it works across KDE, GNOME, XFCE, and others.

