Easy-to-use image converter for modern formats, built with Electron and TypeScript.
Note: This is a complete rewrite from Python/PySide6 to TypeScript/Electron. See MIGRATION.md for details.
Convert images between JPEG XL, AVIF, WebP, JPEG, and PNG formats with optimal compression.
Process multiple images simultaneously for faster batch conversions.
Scale images by dimensions, percentage, longest/shortest side, or megapixels.
Keep EXIF metadata and file timestamps intact during conversion.
Choose to overwrite, skip, or automatically rename duplicate files.
Automatically saves your preferences using electron-store, so your workflow continues where you left off.
A native-inspired titlebar with window controls that keeps the content area consistent across platforms.
Preview input images directly inside the app, with React-powered components for richer interactivity.
- Electron - Cross-platform desktop framework
- TypeScript - Type-safe JavaScript
- Sharp - High-performance image processing (libvips-based)
- External Encoders:
cjxl(libjxl) for JPEG XL encoding- Native Sharp support for AVIF, WebP, JPEG, PNG
- Node.js 18+
- npm or yarn
- External encoder binaries (optional, for JPEG XL):
cjxlfor JPEG XL encoding
npm installnpm run devnpm run build
npm startnpm run packagenpm run package:win # Windows
npm run package:linux # Linux
npm run package:mac # macOSWhen building for Windows on macOS/Linux, the Windows-specific Sharp binaries are automatically installed via the postinstall script. If you need to manually install them:
bash scripts/install-sharp-win.shPackaged apps will be in the release/ directory.
src/
├── main.ts # Electron main process entry point
├── preload.ts # Preload script for IPC bridge
├── common/
│ └── types.ts # Shared TypeScript types
├── main/
│ ├── controller.ts # Processing orchestration
│ ├── worker.ts # Image conversion worker
│ └── process-manager.ts # External process management
└── renderer/
├── index.html # UI structure
├── styles.css # Application styles
└── app.ts # Frontend logic
- JPEG XL - Best compression, modern format
- AVIF - Excellent compression, broad support
- WebP - Good compression, universal support
- JPEG - Classic format with MozJPEG optimization
- PNG - Lossless with high compression
- None - Keep original dimensions
- Dimensions - Resize to specific width × height
- Percentage - Scale by percentage (e.g., 50%)
- Longer Side - Resize based on longer dimension
- Shorter Side - Resize based on shorter dimension
- Megapixels - Target specific megapixel count
- Concurrency - Number of parallel conversions (auto-detected)
- Preserve Metadata - Always enabled (keeps EXIF data)
- Preserve Timestamps - Always enabled (maintains file dates)
- Delete Originals - Remove source files after conversion
- Skip Processed - Always enabled (skips already compressed files)
If you want JPEG XL support, install libjxl:
Ubuntu/Debian:
sudo apt install libjxl-toolsmacOS (Homebrew):
brew install jpeg-xlWindows: Download from libjxl releases and add to PATH.
The following formats are natively supported through Sharp:
- AVIF
- WebP
- JPEG (with MozJPEG)
- PNG
See LICENSE.txt for details.
See LICENSE_3RD_PARTY.txt for dependencies.