lottie-mini
Compress image-sequence Lottie files — right in your browser.
Frequently asked questions
No. The compressor, preview tool, and inspector all run entirely in your browser. There is no server-side processing — once the page loads, you can disconnect from the network and everything still works. Your animation never leaves your device.
There is no hard limit imposed by the tool itself. The practical ceiling depends on your browser's memory: most modern machines handle 100–200 MB Lottie files comfortably, and we've seen successful runs on files over 500 MB. The compression pipeline streams frame-by-frame rather than holding everything in memory at once.
Yes. The compressor produces standard Lottie JSON (or dotLottie zip) output. Every modern player — lottie-web, lottie-react, lottie-react-native, Rive's Lottie player, Bodymovin-native iOS/Android — accepts the output without configuration changes.
Quality first uses all frames at WebP quality 75 — best fidelity, typical 3% of original size. Balanced (the default) keeps every other frame at quality 75 — typical 1.5%. Smallest keeps every other frame at quality 70 and resizes to 600px wide — typical 1%. Lossless uses WebP lossless encoding with no frame skipping — typical 50–70%, useful for files that need pixel-perfect playback.
If embedded image assets are less than 20% of the file, the compressor has nothing to work with. Use the Inspector to see the byte breakdown. Pure-vector Lottie files are already optimally small.
Yes. The compressor, preview, and inspector all accept both .json and .lottie input. When you input a .lottie file, you can download the compressed result as .lottie too, preserving the original manifest and any non-animation entries.
The same compression logic is packaged as a Python + PyQt6 desktop GUI in the open-source repository. It supports batch processing and runs entirely offline. A standalone npm CLI is on the roadmap.
It shouldn't. The pipeline rewrites the layer ip/op/st values to account for any frame skipping, so the wall-clock duration stays identical. If you see a timing change, please open an issue with the source file.