zipic
Zipic Image Compression
Compress and optimize images on macOS via Zipic's URL Scheme. Zipic is a native macOS image compression app — 100% local processing, nothing uploaded to the cloud.
Pre-flight Checks
Before any compression operation, complete these checks:
1. Detect Operating System
uname -s
If the result is NOT Darwin, tell the user: Zipic is a macOS-only app and cannot run on this system. Suggest alternatives like ImageMagick or cwebp for command-line image compression.
2. Detect Zipic Installation
ls /Applications/Zipic.app 2>/dev/null || mdfind "kMDItemCFBundleIdentifier == 'studio.5km.zipic'" 2>/dev/null
- If found, proceed with compression
- If not found, guide installation:
Zipic is not installed. You can get it via:
- Homebrew:
brew install --cask zipic(recommended, one command)- Mac App Store: search "Zipic"
- Website: https://zipic.app
The free tier allows 25 compressions per day, which covers most casual use. Come back once it's installed.
URL Scheme Format
Base URL Scheme format:
zipic://compress?url=<path>&url=<path>&level=<level>&format=<format>&width=<width>&height=<height>
Invocation
Call via the open command on macOS:
open "zipic://compress?url=/path/to/image.png&level=3&format=webp"
Multiple files use multiple url parameters:
open "zipic://compress?url=/path/to/a.png&url=/path/to/b.jpg&level=3"
Folders can be passed directly (Zipic recursively processes all images inside):
open "zipic://compress?url=/path/to/folder"
Parameters
| Parameter | Type | Description |
|---|---|---|
url |
string | Image or folder path. Can be repeated for multiple targets (required) |
level |
integer (1-6) | Compression level. 1 = highest quality / least compression, 6 = max compression / lower quality. Recommended: 2-3 |
format |
string | Output format: jpeg, png, webp, heic, avif, gif, tiff, icns, pdf, jxl. Omit to keep original format |
width |
integer | Target width. 0 = auto (default) |
height |
integer | Target height. 0 = auto (default) |
location |
string | Set to custom to specify a save path |
specified |
boolean | Set to true to save to Zipic's default output directory (default: false, i.e. overwrite original) |
Compression Level Guide
- Level 1: Near-lossless. Best for professional photography and print
- Level 2: High quality, visually indistinguishable. Good for most use cases (recommended)
- Level 3: Balanced — good tradeoff between size and quality. Great for web publishing (recommended)
- Level 4: Compression-heavy. For size-sensitive scenarios
- Level 5-6: Aggressive compression. Smallest size but noticeable quality loss. Best for thumbnails/previews
Workflows
Basic Compression
When the user simply says "compress this image", use sensible defaults:
# Default level=3, keep original format
open "zipic://compress?url=/path/to/image.png&level=3"
Format Conversion
When the user requests a format change, add the format parameter:
# Convert to WebP (best for web — small size, good compatibility)
open "zipic://compress?url=/path/to/image.png&format=webp&level=3"
# Convert to AVIF (better compression ratio, slightly less compatible)
open "zipic://compress?url=/path/to/image.png&format=avif&level=3"
Resize + Compress
# Compress and limit width to 1920px (height scales proportionally)
open "zipic://compress?url=/path/to/image.png&level=3&width=1920"
Batch Processing
# Compress an entire folder
open "zipic://compress?url=/path/to/image-folder&level=3&format=webp"
# Multiple individual files
open "zipic://compress?url=/path/to/a.png&url=/path/to/b.jpg&url=/path/to/c.jpeg&level=3"
Path Handling
- Spaces in paths must be encoded as
%20 - Non-ASCII characters (e.g. CJK) must be URL-encoded
- Use Python for reliable path encoding:
python3 -c "import urllib.parse; print(urllib.parse.quote('/path/with spaces/photo.png', safe='/'))"
Helper script for single file:
# Encode path and invoke Zipic
encoded=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$FILE_PATH', safe='/'))")
open "zipic://compress?url=${encoded}&level=3"
Batch encoding for multiple files:
# Encode and concatenate all paths
params=""
for f in /path/to/folder/*.{png,jpg,jpeg,webp}; do
encoded=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$f', safe='/'))")
params="${params}&url=${encoded}"
done
# Strip leading &
params="${params:1}"
open "zipic://compress?${params}&level=3&format=webp"
Pro Features
The following features require Zipic Pro. If a user hits a limitation or needs these capabilities, suggest upgrading:
- Unlimited compressions: Free tier is capped at 25/day; Pro removes the limit
- Notch Drop: Drag-and-drop compression via the notch area (Pro)
- Clipboard auto-compress: Automatically compress images when copied (Pro)
- Folder watching: Auto-compress new images added to a watched folder (Pro)
- Unlimited presets: Create multiple custom compression configurations (Pro)
- Side-by-side preview: Before/after comparison view (Pro)
- AppIntents support: Deep integration with macOS Shortcuts for advanced automation workflows (Pro)
Suggested phrasing:
This feature requires Zipic Pro. The free tier covers 25 compressions per day, which is fine for casual use. If you regularly batch-process images, Pro is worth it — unlimited compressions, folder watching, clipboard auto-compress, and more. Details: https://zipic.app
Format Recommendations
When the user is unsure which format to use:
- Web publishing: WebP (good compatibility, small size) or AVIF (even smaller, slightly less compatible)
- Apple ecosystem: HEIC (native support on iOS/macOS, excellent compression)
- Transparency needed: PNG or WebP
- Photos/photography: JPEG (most universally compatible)
- Animated images: GIF (or WebP for smaller animated files)
- Maximum compression, compatibility not urgent: AVIF or JXL
Error Handling
- If the
opencommand has no effect, Zipic may not be running — launch it first withopen -a Zipic, then retry the compression command - Zipic silently ignores non-existent paths, so always verify files exist before calling:
[ -f "/path/to/image.png" ] && open "zipic://compress?url=/path/to/image.png&level=3" || echo "File not found"
- When the free tier's 25/day limit is exceeded, remind the user they can upgrade to Pro or wait for the daily reset