# Picmal, full documentation > Picmal is a native macOS application for batch converting and compressing > images, videos, audio files, and PDFs. It processes files entirely offline, > supports drag-and-drop workflows, and integrates with Finder, Shortcuts and > Raycast. This file is the complete Picmal documentation as a single document. For the site index, pricing, the supported format lists and the other machine-readable endpoints, read https://picmal.app/llms.txt first. Pricing on its own is at https://picmal.app/pricing.md, and the agent guide is at https://picmal.app/AGENTS.md. Every section below is also addressable on its own by appending `.md` to its page URL, e.g. https://picmal.app/docs/cli.md. --- # Introduction > Picmal documentation. Convert and compress images, audio, and video, combine and split PDFs, and make PDFs from images on your Mac without uploads or subscriptions. Source: https://picmal.app/docs Picmal is a macOS toolbox for your media: convert and compress images, audio, and video, combine and split PDFs, and turn images into multi-page PDFs. Drop your files in, pick your settings, and go. ### Simple by default No setup, no configuration, no technical knowledge required. Drop files in, choose a format, and convert. It works the first time you open it. ### Opinionated advanced mode When you need more control, advanced settings are available, but they come with sensible defaults already selected. You can tweak quality, codecs, and encoding, but you'll rarely need to. ### Native macOS integration Picmal is a native Mac app. Finder right-click, Services, Shortcuts, the menu bar, and drag and drop all work the way you'd expect on macOS. ### Private and local All processing happens on your Mac. No files leave your machine, no internet required, no accounts, no cloud. ## Documentation - [Getting started](/docs/getting-started). Install, first conversion, first compression - [Converting files](/docs/converting-files). Change file formats - [Compressing files](/docs/compressing-files). Reduce file sizes with presets - [Crop](/docs/crop). Trim margins off images and PDFs, or auto-trim borders - [Audio tools](/docs/audio-tools). Merge audio files, or split an audiobook by chapter - [Video tools](/docs/video-tools). Combine several videos into one, or build a photo slideshow - [PDF tools](/docs/pdf-tools). Combine, split, and make PDFs from images - [Vectorize](/docs/vectorize). Trace raster images into real SVG vectors - [Remove Background](/docs/remove-background). Cut the subject out onto a transparent PNG - [Download Video](/docs/download-video). Fetch videos from a link, ready to play - [Managing the queue](/docs/managing-the-queue). Priority, pause/resume, and the right-click menu - [Supported formats](/docs/supported-formats). Full list of input and output formats - [Image compression](/docs/image-compression). Per-format quality settings and presets - [Audio and video](/docs/audio-and-video). Codecs, bitrates, and encoding settings - [Resize and color space](/docs/resize-and-color-space). Image resizing modes and color profiles - [Watermarks](/docs/watermarks). Add a logo or PNG overlay to images and videos - [Output and naming](/docs/output-and-naming). Where files go and how they're named - [Watched folders](/docs/watched-folders). Automatic processing for folders - [Integrations](/docs/integrations). Drag & drop, Finder Services, Shortcuts, Raycast, menu bar - [License](/docs/license). Free trial, activation and deactivation - [FAQ and troubleshooting](/docs/faq). Common questions and fixes ## Keyboard shortcuts | Shortcut | Action | | --------- | --------------------------------------------------- | | Cmd+O | Add files or folders in the tool you're looking at | | Cmd+Return| Run the tool you're looking at | | Cmd+, | Open Settings | | Cmd+Q | Quit Picmal | --- # Getting Started > Install Picmal on your Mac in under a minute. Download the DMG, drag it to Applications, and convert your first batch of files. Source: https://picmal.app/docs/getting-started ## Install 1. [Download Picmal](https://picmal.app/downloads/Picmal-1.9.0.dmg) 2. Open the DMG file 3. Drag Picmal to your Applications folder 4. Launch Picmal Every download starts with a 7-day trial. Press **Try free** in the sidebar and every tool runs on that Mac for a week, no key, no card, no account. See [License](/docs/license#try-it-free) for what the trial covers. Check the [changelog](/changelog) for the latest version and release notes.
## Your first conversion 1. Launch Picmal, **Convert** is selected in the sidebar 2. Drop one or more files into the window (or click **Add Files**) 3. Pick your output format from the dropdown 4. Adjust settings if you want (compression, metadata, resize) 5. Click **Convert**. Your new files appear alongside the originals ## Your first compression 1. Select **Compress** in the sidebar 2. Drop your files in 3. Pick a preset (e.g., **Balanced**, **Web optimized**) or configure custom settings 4. Click **Compress**, compressed files are saved with a `_compressed` suffix by default ## Your first PDF The sidebar's **PDF** section has three more tools: - **Combine PDFs**. Drop two or more PDFs, drag to set the order, click **Combine** - **Split PDF**. Drop a PDF, type page ranges like `1-3, 5, 8-`, click **Split** - **Images to PDF**. Drop images, pick a page size, click **Create PDF** See [PDF tools](/docs/pdf-tools) for page ranges, page sizes, quality, and password protection. ## Merge audio The **Audio** section has **Merge Audio**. Drop in two or more tracks, drag them into order, and click **Merge** to get one file (it can even build a chaptered M4B audiobook), and **Split by Chapter**, which breaks a chaptered audiobook back into one file per chapter. See [Audio tools](/docs/audio-tools). ## Combine videos The **Media** section adds **Combine Videos**. Drop in two or more clips, drag them into order, and click **Combine** to get one video. Matching clips are joined losslessly; mismatched formats or sizes are scaled and re-encoded to match. Next to it is **Slideshow**. Drop in a batch of photos, set how long each one stays on screen, pick a frame size, and click **Create Slideshow** to get an MP4. See [Video tools](/docs/video-tools). ## Crop The **Media** section has a **Crop** tool. Drop images or PDFs in, type the margins to remove from each edge (pixels for images, millimeters for PDFs) and click **Crop**. Turn on auto-trim to strip a solid-color border off images without measuring anything. See [Crop](/docs/crop). ## Download a video Next to it is **Download Video**. Paste a link (or press ⌘V, or drag one from your browser), pick a folder, choose Best, 1080p, or Audio only, and click **Download**. Picmal makes sure what you get back opens in QuickTime. See [Download Video](/docs/download-video). ## Image tools The **Media** section also has two image tools. **Vectorize** traces a PNG or JPG into a real SVG. Pick a style per image and click **Vectorize All**. **Remove Background** lifts the subject out onto a transparent PNG, right on your Mac. See [Vectorize](/docs/vectorize) and [Remove Background](/docs/remove-background). ## Batch processing Drop multiple files or entire folders at once, up to 10,000 files. Picmal processes them all in one go, images, audio, and video. While a batch runs you can set per-file priority, pause and resume, or cancel; see [managing the queue](/docs/managing-the-queue). ## From the terminal Picmal includes `picmal-cli`, a command-line tool that runs the same engines as the app. Install it from the menu bar via **Picmal → Install Command Line Tool…** and you can convert, compress, combine and split PDFs, and more from any terminal. See [Command line (CLI)](/docs/cli) for the full reference. ## What's next - [Converting Files](/docs/converting-files). Learn about format conversion options - [Compressing Files](/docs/compressing-files). Explore compression presets - [Crop](/docs/crop). Trim margins off images and PDFs - [Audio tools](/docs/audio-tools). Merge audio files, or split an audiobook by chapter - [Video tools](/docs/video-tools). Combine several videos into one, or build a photo slideshow - [PDF tools](/docs/pdf-tools). Combine, split, and make PDFs from images - [Watched Folders](/docs/watched-folders). Set up automatic processing - [Command line (CLI)](/docs/cli). Drive Picmal from the terminal --- # App Icons > Turn a single image into ready-to-ship app icons on your Mac, a macOS .icns, a Windows .ico, and an Xcode-ready iOS icon set, with non-square images fit without cropping. Source: https://picmal.app/docs/app-icons Picmal's sidebar has an **App Icons** tool that turns one image into ready-to-ship app icons for every platform. Drop in a logo and get back a macOS `.icns`, a Windows `.ico`, and an iOS icon set. Like everything else in Picmal, it runs entirely on your Mac. ## Generate app icons 1. Select **App Icons** in the sidebar 2. Drop a single image into the window 3. Pick the formats you want, macOS, Windows, iOS, or any combination 4. Click **Generate** ![App Icons in Picmal: a 1024px source image loaded under the Media section of the sidebar, with the macOS, Windows, and iOS output formats checked in the bottom bar](/images/docs/app_icons.png) Each format is written into an output folder next to your source, named ` App Icons`. | Format | Output | What you get | | ------- | ------------------- | ------------------------------------------------------------------------ | | macOS | `AppIcon.icns` | The multi-resolution icon macOS apps use. | | Windows | `AppIcon.ico` | A multi-resolution `.ico` for Windows apps. | | iOS | `AppIcon.appiconset`| A universal 1024 icon set you can drag straight into Xcode's asset catalog. | ## Getting a clean result - **Use a square source, at least 1024×1024.** That's the largest size any of the icons need, so a big square image stays crisp everywhere. - **Non-square images are fit, never cropped.** A wide or tall image is centered and padded to a square, so nothing gets cut off. - **The iOS icon is flattened to an opaque background.** iOS icons can't be transparent, so a see-through source is placed on a solid background. The App Store rejects icons with an alpha channel otherwise. ## macOS tile shape By default the icon fills the square edge to edge. Next to the format checkboxes you can instead pick a **macOS tile shape** to round the image into a proper macOS app tile, with the margin and soft shadow baked in: - **Big Sur**: the classic squircle macOS has used since Big Sur. - **Tahoe**: the rounder corner from the newer icon style. - **None**. Leave the image full-bleed (the default). The shape applies to the `.icns` output. Windows and iOS icons are unaffected. ## Use it from Shortcuts and the terminal App Icons is available beyond the app window: - In Shortcuts, the **Generate App Icons** action takes one image and returns the icon files. See [Integrations](/docs/integrations#shortcuts-app). - From the terminal, use `picmal-cli app-icons` to generate icons (`app-icon` still works). See [Command line](/docs/cli#app-icons). Like Convert and Compress, the tool requires the [free trial or a license](/docs/license). --- # Audio and video > Audio and video conversion settings in Picmal, codecs, bitrates, and quality presets for compressing MP3, AAC, MP4, MOV, and more on Mac. Source: https://picmal.app/docs/audio-and-video ## Audio compression ### Codecs | Codec | Type | Best For | | ----- | -------- | ---------------------------------------------- | | AAC | Lossy | General music and audio, widest compatibility | | MP3 | Lossy | Legacy compatibility | | Opus | Lossy | Speech, podcasts, low-bitrate audio | | FLAC | Lossless | Archival, music production | | ALAC | Lossless | Apple Lossless, imports straight into Apple Music | ### ALAC (Apple Lossless) Pick **ALAC** as the output format to get a lossless `.m4a` from FLAC, WAV, or AIFF. It's the format Apple Music expects for lossless libraries. ALAC conversions are bit-for-bit lossless; they preserve every sample of the source. ### Bitrate modes | Mode | Description | | -------------- | ------------------------------------------------------------------- | | VBR (Variable) | Allocates more bits to complex passages. Best quality per file size | | ABR (Average) | Targets an average bitrate. Good balance | | CBR (Constant) | Fixed bitrate throughout. Predictable file size | ### Force mono Turn on **force mono** to collapse stereo audio down to a single channel. Useful for voice recordings and podcasts, where nobody notices the missing stereo field and the file comes out roughly half the size. ### Sample rate The **Custom** audio preset has a sample rate picker, from 8 kHz all the way up to 96 kHz: | Rate | Typical Use | | --------- | ---------------------------- | | 8 kHz | Telephony | | 16 kHz | VoIP, voice assistants | | 22.05 kHz | AM radio | | 44.1 kHz | CD audio | | 48 kHz | DVD, video production | | 96 kHz | High-resolution audio | Want to resample without touching the codec? Convert a file to its own format (FLAC → FLAC, for example) and pick your target sample rate. See [converting files](/docs/converting-files#same-format-conversions) for the details. Not every codec accepts every rate: MP3 stops at 48 kHz, and Opus only speaks 8, 12, 16, 24, and 48 kHz. Ask for 96 kHz into MP3 and Picmal converts at the nearest rate the codec does support, then says which one in the Convert table. It used to fail the encode and leave a 0-byte file. The command line makes the same substitution. ### Bit depth The **Custom** audio preset also lets you pick a bit depth on top of the sample rate: | Depth | Typical Use | | ------ | ------------------------------------------- | | 16 bit | CD quality, general listening | | 24 bit | Studio masters, mixing, mastering | | 32 bit | Floating-point processing, archival masters | Pair 16 bit with 44.1 kHz for CD-quality FLAC, or jump to 24 bit + 48 kHz for studio work. The dedicated **CD quality** preset is 16 bit + 44.1 kHz FLAC in one click. ![CD quality preset and bit depth setting in Picmal](/images/docs/bit-depth.png) ### Cover art Picmal can embed album art into your audio output automatically. Turn on **Embed cover art from the source folder** in **Settings → Audio**, and for each track it looks for a cover image in the same folder and writes it into the file. It works both when converting and when compressing. By default it looks for `cover.jpg`, `folder.jpg`, and `front.jpg`, but you can edit that list of filenames to match how your library is organized. The names have to match exactly, extension included. Add `cover.png` or `AlbumArt.jpg` to the list if that's how your library names them. Capitalization doesn't matter, and the image has to sit in the same folder as the track. Turn on **Skip files that already have artwork** to leave existing covers alone. Picmal only adds art to tracks that don't have any. Turn it **off** if you want the folder image to replace the artwork a track already carries. Only some formats can store a picture: **MP3, M4A, M4B, ALAC and FLAC**. WAV, AIFF, OGG and Opus have nowhere to put one, so choosing one of those leaves the output with no art. Picmal flags the row and explains why. Compressing a track keeps whatever art it already has, unless you also have **Remove metadata** turned on, which strips it along with everything else. ![Cover art settings in Picmal, with the source-folder filename list and skip-existing toggle](/images/docs/cover_art.png) ### Audio presets See [compressing files](/docs/compressing-files#audio-presets) for the full presets table. ## Video compression ### Codecs | Codec | Compatibility | Compression | Notes | | ------------ | ------------- | ----------- | ------------------------------------------- | | H.264 | Excellent | Good | Plays everywhere, web, mobile, desktop | | H.265 (HEVC) | Good | Better | ~50% smaller than H.264 at same quality | | VP9 | Good | Better | Google's codec, great for WebM | | AV1 | Growing | Best | Newest, best compression, slowest to encode | | Copy |, | None | Carries the existing picture and sound over untouched | #### Copy (no re-encode) Pick **Copy** when you only want to change the container. Picmal moves the existing video and audio streams into the new file without touching them, so a clip that would take minutes to re-encode is done in about a second, at the original quality. Copy needs the target container to be able to hold the streams it's given, and it needs nothing else about the picture to change. Ask for a resize, a frame-rate change, a playback-speed change, or a watermark and there's nothing to copy. Picmal encodes with H.264 instead. It's a Convert setting: compressing a video always means re-encoding it, so Compress falls back to H.264 too. ### Encoding speed | Speed | Encode Time | File Size | Quality | | --------- | ----------- | --------- | ------- | | Ultrafast | Fastest | Largest | Lowest | | Fast | Fast | Larger | Lower | | Medium | Moderate | Balanced | Good | | Slow | Slow | Smaller | Better | | Slower | Slowest | Smallest | Best | Slower speeds give the encoder more time to sniff out efficient compression. **Medium** is the sensible default for most jobs. ### CRF (Constant Rate Factor) CRF controls quality on a 0–51 scale. **Lower = better quality, larger file.** | CRF Range | Quality Level | | --------- | ----------------------------------- | | 18–20 | Visually lossless / archival | | 21–23 | High quality, good file size | | 24–26 | Balanced | | 27–28 | Noticeable compression, small files | | 29+ | Heavy compression | ### Audio quality for video **Settings → Video → Advanced** has its own **Audio quality** slider, shown in kbps (48–320). It's separate from the video quality slider: push it up for a music clip, pull it down for a talking head. It only applies when the soundtrack is actually re-encoded. A plain container change copies the audio across untouched, which is what keeps that path fast. From the terminal, `--audio-quality` on `convert` and `compress` does the same thing on a 1–100 scale. See [Command line](/docs/cli#convert). ### Frame rate Drop the frame rate (say 60 fps → 30 fps) to squeeze the file down further. Great for screen recordings, tutorial clips, and anything that doesn't need cinema-grade motion. Set the target frame rate in the video compression settings. ### Resolution Open **Video Options** and pick a **Resolution** to cap how tall the output can be, 2160p (4K), 1440p, 1080p, 720p, 480p, 360p, or **Original**. Picmal only ever scales down and keeps the aspect ratio, so a clip that's already shorter than your pick comes through untouched. Great for turning 4K phone footage into a web-friendly 1080p. The setting applies whether you're converting or compressing. ![The Resolution dropdown in Picmal's Video settings, open to Original, 2160p (4K), 1440p, 1080p, 720p, 480p, and 360p](/images/docs/set_video_resolution.png) ### Output format You can swap the container format while you compress. Take a MOV and come out the other side with MP4, MKV, WebM or AVI. Picmal handles codec compatibility for you; if the codec you picked won't fit in the container you chose, it quietly picks one that will. Set the output format in the video compression settings. Leave it alone if you want to keep the original container. ### Estimated size Before you run a video compression, Picmal shows an estimate of the output size based on your current codec, CRF, and frame-rate settings, so you know roughly how much space you'll save without having to encode first. Change a setting and the estimate updates. ![Estimated saving shown in the Saving column before compressing a video in Picmal](/images/docs/size_estimate.png) ### Video presets See [compressing files](/docs/compressing-files#video-presets) for the full presets table. ## Subtitle burn-in Attach an SRT or VTT file to any video and the subtitles get rendered straight into the frames. Because the text is literally painted onto the pixels, it plays on any device with zero guessing about subtitle tracks. ![Subtitle settings in Picmal](/images/docs/subtitles.png) ### How to use 1. Click the **film icon** next to a video in the file list 2. Pick your `.srt` or `.vtt` file 3. Convert as usual. The subtitles come out baked into the output ### Styling Open **Settings → Video** to control how subtitles look: | Setting | Options | | -------- | ------------------------------------------------------------ | | Size | Small, medium, large, or a custom point size | | Color | Any color (text and optional outline) | | Position | Top, center, or bottom of the frame | Styling is global. Whatever you pick in Settings applies to every video with a subtitle file attached. ### Existing subtitle tracks are preserved If a video already carries soft subtitle tracks (the kind Subler and other tools add), Picmal keeps them when it converts or compresses the file, as long as the output format can hold them: text subtitles into MP4, MOV, and WebM, and anything into MKV. A subtitle the target format can't store is quietly dropped so the conversion still goes through. This is separate from burn-in above, the tracks stay selectable subtitles rather than being painted onto the frames. It works in the app and from the command line. ## Playback speed Speed a video up or slow it down without wrecking the audio pitch. Useful for trimming down meeting recordings, rolling tutorials into time-lapses, or stretching a golf swing out for review. ![Per-video playback speed and SRT options in Picmal](/images/docs/video_options_speed_and_srt.png) ### How to use 1. Click the **film icon** next to a video in the file list 2. Pick a preset (0.25×, 0.5×, 2×, 4×) or enter a custom percentage from 10% to 800% 3. Optionally click **Apply speed to all videos** to reuse the setting across the whole batch Audio pitch is preserved, so 2× speeds up a narration without turning your voiceover into a chipmunk. --- # Audio tools > Merge audio files into one and split chaptered audiobooks into per-chapter files on your Mac, reorder, choose the output format, and build M4B audiobooks with chapters. Source: https://picmal.app/docs/audio-tools Picmal's sidebar has an **Audio** section for working with audio files as a whole, rather than converting them one by one. **Merge Audio** joins several files into a single track (and can build a chaptered M4B audiobook) while **Split by Chapter** breaks an audiobook back into one file per chapter. Like everything else in Picmal, both run entirely on your Mac. ## Merge Audio 1. Select **Merge Audio** in the sidebar 2. Drop two or more audio files into the window 3. Drag rows to set the order, the list order is the play order 4. Click **Merge** ![Merge Audio in Picmal: three audio files queued under the Audio section of the sidebar, with the Audio Options popover showing the output format and name](/images/docs/merge_audio.png) The merged file is saved next to the first one as ` (merged).`. If that name is taken, Picmal counts up instead of overwriting, ` (merged) 2.mp3`, and so on. - Drag rows to reorder; the number on each row is its position in the merged track. - Select rows and press Delete to remove them, or right-click for **Remove** / **Show in Finder**. - A file Picmal can't read as audio shows an orange warning and blocks the merge. Remove it and try again. ### Lossless when it can be When every file in the list already shares the same format, sample rate, and channels, Picmal joins the streams without re-encoding. It's fast and there's no quality loss. Mix formats (say an MP3 and a WAV) and it re-encodes them to the output format instead. Either way you get one continuous track. ### Output format Open **Audio Options** to choose the output format. Leave it on **Same as first file** to keep the first track's format (the setting that keeps a same-format merge lossless) or pick one of MP3, M4A, M4B, AAC, WAV, AIFF, FLAC, OGG, OPUS, or AC3 to convert everything as it merges. Your choice is remembered between sessions. ### Build a chaptered audiobook Pick **M4B** as the output format and a **Add chapter markers** option appears in Audio Options. Tick it, and each file you added becomes its own chapter in the finished book, named after the file. Point Merge Audio at the per-chapter files you get out of Audible or Libation and you get a single M4B that scrubs by chapter in Books, Music, or QuickTime. Leave it unticked for one continuous track with no chapters. ![Merge Audio in Picmal building an M4B audiobook: several audio files queued with the Audio Options popover showing M4B output and the Add chapter markers option](/images/docs/merge_audio_chapters.png) ### Output name In the same popover, type a name for the merged file, or leave it blank for the automatic ` (merged)` name. The extension follows the output format you picked. The file is always saved next to the first input. ## Split by Chapter The reverse of building an audiobook: take one chaptered file and get one file per chapter back. 1. Select **Split by Chapter** in the sidebar 2. Drop in a chaptered audiobook (M4B, M4A, or any file that carries chapter markers) 3. Its chapters show up in a list so you can check them 4. Choose an output format, or keep the original 5. Click **Split** ![Split by Chapter in Picmal: a chaptered audiobook's chapters listed under the Audio section of the sidebar, ready to split into one file per chapter](/images/docs/split_by_chapter.png) Each chapter is written out as `Book - 01 - Chapter Title`, tagged with its chapter title and track number so it stays in order in your library. Leave the format on the original to split without re-encoding, or pick another format (say MP3) to convert as it splits. A file with no chapter markers can't be split. Picmal tells you and skips it. ## Use it from Shortcuts and the terminal Merge Audio is available beyond the app window: - In Shortcuts, the **Merge Audio** action takes audio files in and returns the finished track. See [Integrations](/docs/integrations#shortcuts-app). - From the terminal, use `picmal-cli merge-audio` to join files and `picmal-cli split-chapters` to split an audiobook. See [Command line](/docs/cli#merge-audio). Like Convert and Compress, both tools require the [free trial or a license](/docs/license). --- # Command line (picmal-cli) > Run Picmal from the terminal. Convert, compress, combine and split PDFs, make PDFs from images, watch folders, and apply saved presets without opening the app. Source: https://picmal.app/docs/cli Picmal ships with a command-line companion, `picmal-cli`, bundled inside the app. Same conversion engine as the UI, so the output is identical. You just get flags, JSON, and exit codes you can drop into a script. ## Installation From the menu bar, choose **Picmal → Install Command Line Tool…**. Picmal asks for your administrator password and creates a symlink at `/usr/local/bin/picmal-cli`, which is on the default macOS `PATH` for both bash and zsh. After that, `picmal-cli` works from any terminal. ![Install Command Line Tool menu item in Picmal](/images/docs/install_command_line_tool.png) To remove it later, use **Picmal → Uninstall Command Line Tool…**. Only the symlink is removed; the app stays put. If you'd rather invoke the binary directly without installing it, it lives inside the app bundle: ``` /Applications/Picmal.app/Contents/MacOS/picmal-cli ``` `convert`, `compress`, `crop`, `combine-pdfs`, `combine-videos`, `split-pdf`, `images-to-pdf`, `merge-audio`, `split-chapters`, `remove-background`, and `watch` need a valid Picmal license. The 7-day trial covers the app, not the command line. The read-only commands (`presets`, `formats`, `license-status`, `version`) work without one. ## Synopsis ``` picmal-cli [options] ``` | Subcommand | What it does | | ---------------- | ------------------------------------------------- | | `convert` | Convert files to a target format | | `compress` | Compress files keeping the same format | | `crop` | Crop margins off images and PDF pages | | `combine-pdfs` | Combine two or more PDFs into one | | `split-pdf` | Split a PDF into one document per page range | | `images-to-pdf` | Create a multi-page PDF from images | | `merge-audio` | Merge two or more audio files into one | | `combine-videos` | Combine two or more videos into one | | `slideshow` | Turn still images into a video slideshow | | `split-chapters` | Split a chaptered audiobook into per-chapter files | | `remove-background` | Cut the background out of images (transparent PNG) | | `presets` | List or inspect saved presets (built-in + custom) | | `formats` | List supported formats by category | | `watch` | Add, list, and remove watched folders | | `license-status` | Check whether the host app is licensed | | `version` | Print the bundled app version | ## Global options These flags work on every subcommand: | Flag | Description | | --------------- | ------------------------------------------------------------------------------ | | `--json` | Force NDJSON output to stdout (one JSON object per line). Auto-on when piped. | | `--text` | Force human-readable output even when piped. | | `-q`, `--quiet` | Suppress per-file status lines (final summary still emitted). Where available. | | `--verbose` | Pass underlying tool stderr through. Useful for debugging. | ## convert Convert one or more files to a target format. ```bash picmal-cli convert -i photo.heic -f jpg picmal-cli convert -i ~/Pics -f webp -o ~/out --quality 80 picmal-cli convert -i a.png b.png -f avif --strip-metadata picmal-cli convert -i clip.mov -f mp4 --quality 70 picmal-cli convert -i photo.jpg -f jpg --resize 100kB picmal-cli convert -i photo.jpg -f jpg --copyright "© 2026 Jane Doe" --artist "Jane Doe" picmal-cli convert -i icon.icns -f png -o ~/out cat list.txt | picmal-cli convert -i - -f webp -o ~/out ``` | Flag | Description | | ------------------------- | ---------------------------------------------------------------------------- | | `-i`, `--input ` | One or more input paths. Use `-` to read newline-separated paths from stdin. | | `-f`, `--format ` | Target format extension (e.g. `jpg`, `webp`, `mp4`, `mp3`). | | `-o`, `--output ` | Output file or directory. Defaults to alongside each input. | | `-w`, `--overwrite` | Overwrite existing outputs. | | `--pattern ` | Rename outputs with a naming pattern (see [naming patterns](#naming-patterns)). | | `--quality ` | Quality 0–100. Format-specific defaults if omitted. Overrides `--preset`. | | `--preset ` | Apply a saved preset by name (see [Presets](#presets)). | | `--resize ` | Resize geometry (`1920x1080`, `1920x`, `x1080`, `50%`) or a target file size (`100kB`, `2MB`), images are scaled down to fit the budget. | | `--trim` | Trim a solid-color border off each image before resizing (5% tolerance; use [`crop --fuzz`](#crop) for another one). | | `--audio-quality ` | Audio quality 1–100 for video outputs, mapped to 48–320 kbps. Only used when the soundtrack is re-encoded. | | `--color-space ` | One of `srgb`, `p3`, `adobergb`, `gray`, `cmyk`. | | `--metadata ` | Preset: `stripall`, `essential`, or `keepall`. See [Metadata](#metadata). | | `--keep ` | Comma-separated categories to keep; everything else is stripped. | | `--strip ` | Comma-separated categories to strip; everything else is kept. | | `-s`, `--strip-metadata` | Strip EXIF/IPTC/XMP from output (alias for `--metadata stripall`). | | `--copyright ` | Copyright notice to embed (EXIF, IPTC, and XMP). Written even with `--strip-metadata`. | | `--artist ` | Artist / creator name to embed (EXIF Artist, IPTC byline, XMP creator). | | `--credit ` | Credit line to embed (IPTC credit, XMP credit). | | `--contact ` | Contact or URL to embed (XMP rights web statement, IPTC contact). | | `--pdf-dpi ` | DPI for PDF rasterization (also tags output density on raster outputs). | | `--icon-size ` | Which image to take out of a multi-size icon (`.icns`): `largest` (default), `all`, or a pixel size such as `512`. | | `--watermark ` | Watermark image path. | | `--watermark-opacity ` | 0.0–1.0. Default `0.5`. | | `--watermark-position` | `tl`, `tr`, `bl`, `br`, or `center`. Default `br`. | The copyright flags are independent of `--strip-metadata`: pass both to strip a photo's camera/GPS data while still stamping your own ownership tags onto the output. Empty flags are skipped; values you pass always overwrite any existing tag. An `.icns` input gives you one image at its largest embedded size. Pass `--icon-size all` to get one output per size instead, named `-x.` (the same convention `split-pdf` uses for pages), or a pixel size such as `--icon-size 256` to pick one. `--quality`, `--resize`, and `--watermark` apply to whatever comes out. Every output lands in `-o`, not beside the source. See [Apple icon files](/docs/converting-files#apple-icon-files). ### Metadata The metadata flags mirror the app's [Metadata settings](/docs/metadata). Use a preset, or take per-category control with `--keep` / `--strip`: ```bash picmal-cli convert -i photo.jpg -f jpg --metadata essential picmal-cli convert -i photo.jpg -f jpg --keep copyright,colorProfile picmal-cli convert -i photo.jpg -f jpg --strip location,identifiers ``` Categories: `location`, `camera`, `dateTime`, `copyright`, `colorProfile`, `orientation`, `identifiers`, `thumbnail`. Friendly aliases work too, `gps`, `icc`, `date`, `serial`, `lens`, `thumb`. `--keep` lists what survives; `--strip` lists what comes off and keeps the rest. Precedence is `--keep` > `--strip` > `--metadata` > `--strip-metadata`. These flags work the same on `compress` and `watch add`. ## compress Compress one or more files keeping the same format. Output defaults to `_compressed.` next to each input. ```bash picmal-cli compress -i big.jpg --quality 70 picmal-cli compress -i ~/Pics -o ~/out --strip-metadata picmal-cli compress -i clip.mp4 --quality 60 -o clip-small.mp4 picmal-cli compress -i portfolio.jpg --copyright "© 2026 My Studio" --contact "hello@example.com" picmal-cli compress -i podcast.mp3 --preset "Voice memo" ``` | Flag | Description | | ------------------------ | ------------------------------------------------------------------------- | | `-i`, `--input ` | One or more input paths. Use `-` for stdin. | | `-o`, `--output ` | Output file or directory. | | `--quality ` | Quality 0–100. Format-specific defaults if omitted. Overrides `--preset`. | | `--preset ` | Apply a saved preset by name (see [Presets](#presets)). | | `--trim` | Trim a solid-color border off each image before encoding (5% tolerance). | | `--audio-quality ` | Audio quality 1–100 for video outputs, mapped to 48–320 kbps. Only used when the soundtrack is re-encoded. | | `-s`, `--strip-metadata` | Strip EXIF/IPTC/XMP from output. | | `--copyright ` | Copyright notice to embed (EXIF, IPTC, and XMP). Written even with `--strip-metadata`. | | `--artist ` | Artist / creator name to embed. | | `--credit ` | Credit line to embed. | | `--contact ` | Contact or URL to embed. | | `-w`, `--overwrite` | Overwrite existing outputs. | | `--pattern ` | Rename outputs with a naming pattern (see [naming patterns](#naming-patterns)). | PDFs are compressed with the same text-preserving engine as the app: only the images inside are re-encoded, and the output is never larger than the input. Compressing a scan hard enough to shrink it means rebuilding the document, which drops its links, bookmarks, and form fields, when that happens `picmal-cli` prints a warning and adds `pdf_structure_dropped` to the file's `notes` in JSON output. See [How PDF compression works](/docs/image-compression#how-pdf-compression-works). ### Naming patterns `convert` and `compress` both take `--pattern`, which renames outputs using the same tokens as the app: `{original}`, `{date}`, `{datetime}`, `{year}`, `{month}`, `{day}`, `{camera}`, `{iso}`, and `{sequence}`. See [output and naming](/docs/output-and-naming#tokens) for what each one means. ```bash # holiday-001.webp, holiday-002.webp, ... picmal-cli convert -i ~/Pics/*.jpg -f webp -o ~/out --pattern 'holiday-{sequence:3}' # 2026-03-15_IMG_0042.jpg, dated from EXIF picmal-cli compress -i ~/Pics -o ~/out --pattern '{date}_{original}' ``` `{sequence}` numbers files in the order you pass them. Without `--pattern`, `convert` keeps the original name and `compress` appends `_compressed`. A `--output` path that names a file rather than a directory is used verbatim, pattern or not. If your `--preset` is an audio or video preset and you don't pass `--output`, `picmal-cli` picks the right container for you (Opus → `.opus`, AAC → `.m4a`, FLAC → `.flac`, VP9 → `.webm`). Pass `--output` if you want a specific path. ## crop Crop margins off images and PDF pages, or auto-trim a solid-color border from images. Margins are **pixels for images** and **millimeters for PDFs**. PDF pages keep their text, links, and form fields, only the page boxes change. ```bash picmal-cli crop photo.png --auto-trim picmal-cli crop scan.jpg --top 40 --bottom 40 picmal-cli crop report.pdf --top 20 --bottom 20 # 20 mm off each page picmal-cli crop *.pdf --left 15 -o out/ ``` | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------- | | `` | Image or PDF files to crop (positional, at least one). | | `--top ` | Margin to remove from the top. Default `0`. | | `--bottom ` | Margin to remove from the bottom. Default `0`. | | `--left ` | Margin to remove from the left. Default `0`. | | `--right ` | Margin to remove from the right. Default `0`. | | `--auto-trim` | Images only: remove a solid-color border by reading the corner color. | | `--fuzz ` | Auto-trim color tolerance, 0–50%. Default `5`. | | `-o`, `--output ` | Output directory. Default: next to each input, as `_cropped.`. | | `-w`, `--overwrite` | Overwrite existing output files. | Pass a margin, `--auto-trim`, or both, with neither, the command refuses rather than writing a byte-identical copy. `--auto-trim` on a PDF is an error for the same reason: give PDFs explicit margins. See [Crop](/docs/crop). For a border trim as part of a normal conversion, `convert` and `compress` take `--trim` instead. ## combine-pdfs Combine two or more PDFs into a single document. Inputs are merged in the order you pass them. Also available as `combine`, its name before 1.8.7. ```bash picmal-cli combine-pdfs a.pdf b.pdf picmal-cli combine-pdfs chapter*.pdf -o book.pdf ``` | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------- | | `` | PDF files to combine, in page order (positional, at least two). | | `-o`, `--output ` | Output file or directory. Default: ` (combined).pdf` next to the first input. | | `-w`, `--overwrite` | Overwrite an existing output file. | Password-protected inputs are refused (exit `11`). Unlock them first. Uses PDFKit, macOS's native PDF engine, so pages are copied losslessly. ## split-pdf Split a PDF into one document per page range. Each comma-separated range in `--pages` becomes its own file; with no `--pages`, every page is split into a separate file. ```bash picmal-cli split-pdf book.pdf --pages 1-3,5,8- picmal-cli split-pdf book.pdf picmal-cli split-pdf *.pdf --pages 1-2 -o out/ ``` | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------- | | `` | PDF files to split (positional, at least one). Each is split by the same ranges. | | `--pages ` | Page ranges, 1-based: `N`, `N-M`, `N-` (N to end), `-M` (start to M), comma-separated. Default: one file per page. | | `-o`, `--output ` | Output directory. Default: next to each input, as `-1.pdf`, `-2.pdf`, … | | `-w`, `--overwrite` | Overwrite existing output files. | Like `combine-pdfs`, it uses PDFKit and copies pages losslessly; password-protected inputs are refused. Unlock them first. ## images-to-pdf Create a multi-page PDF from images, one image per page, in the order you pass them. Accepts the formats macOS decodes natively (jpg, png, heic, tiff, gif, bmp, webp, avif, jp2, jxl). EXIF orientation is applied, so sideways phone photos come out upright. ```bash picmal-cli images-to-pdf scan1.jpg scan2.jpg picmal-cli images-to-pdf *.png --page-size a4 --quality 70 -o album.pdf picmal-cli images-to-pdf report.png --password secret ``` | Flag | Description | | ----------------------- | ----------------------------------------------------------------------------- | | `` | Image files, in page order (positional, at least one). | | `--page-size ` | `fit` (page wraps each image, default), `a4`, `letter`, or `xmm` (e.g. `210x297mm`). Fixed sizes auto-rotate to each image's orientation. | | `--quality ` | JPEG quality for embedded images, 40–100. Default `85`. | | `--password ` | Password required to open the PDF. | | `-o`, `--output ` | Output file or directory. Default: `.pdf` next to the first input. | | `-w`, `--overwrite` | Overwrite an existing output file. | ## app-icons Turn a single image into ready-to-ship app icons: a macOS `.icns`, a Windows `.ico`, and an iOS `.appiconset` you can drag into Xcode. Pass no format flag to generate all three. A non-square source is fit into the square without cropping, and the iOS icon is flattened onto an opaque background. ```bash picmal-cli app-icons logo.png # all three formats picmal-cli app-icons logo.png --macos # just .icns picmal-cli app-icons logo.png --ios --windows -o icons/ ``` Also available as `app-icon`, its name before 1.8.7. | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------------- | | `` | Source image to generate icons from (positional). Use a square image ≥ 1024×1024 for crisp results. | | `--macos` | Generate the macOS `.icns`. | | `--windows` | Generate the Windows `.ico`. | | `--ios` | Generate the iOS `.appiconset`. | | `-o`, `--output ` | Output directory. Default: a ` App Icons` folder next to the source. | | `-w`, `--overwrite` | Overwrite existing output files. | Pass any combination of `--macos`, `--windows`, and `--ios` to pick formats; with none, all three are generated. See [App Icons](/docs/app-icons). ## remove-background Cut the background out of one or more images and write each subject to a transparent PNG. It runs entirely on your Mac using Apple's Vision framework. Nothing is uploaded. ```bash picmal-cli remove-background photo.jpg picmal-cli remove-background *.png -o cutouts/ ``` | Flag | Description | | ----------------------- | ----------------------------------------------------------------------------------- | | `` | Source image(s) to remove the background from (positional). | | `-o`, `--output ` | Output directory. Default: `_removed.png` next to each source. | | `-w`, `--overwrite` | Overwrite existing output files. | | `--json` | Force JSON output. | An image with no clear subject is skipped and reported, and the rest of the batch still runs. A batch with both successes and skips exits `9`, bad arguments exit `2`, and a missing input path exits `4` before any work starts. See [Remove Background](/docs/remove-background). ## merge-audio Join two or more audio files into one, in the order you pass them. When every input shares the same codec, sample rate, and channels the streams are copied losslessly; mix formats and they're re-encoded to the output format instead. ```bash picmal-cli merge-audio part1.mp3 part2.mp3 picmal-cli merge-audio intro.wav track.wav outro.wav -o full.wav ``` | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------- | | `` | Audio files to merge, in order (positional, at least two). | | `-o`, `--output ` | Output file or directory. The extension sets the format. Default: ` (merged).` next to the first input, in that file's format. | | `-w`, `--overwrite` | Overwrite an existing output file. | Uses the same bundled ffmpeg as Convert and Compress. Decode-only formats (like APE) are refused as output targets. Pick a format Picmal can write. ## combine-videos Join two or more videos into one, in the order you pass them. When every input shares the same codec, resolution, and frame rate the streams are copied losslessly; mix formats or sizes and each clip is scaled onto the first one's frame and re-encoded to match. ```bash picmal-cli combine-videos clip1.mp4 clip2.mp4 picmal-cli combine-videos intro.mov main.mp4 outro.webm -o full.mp4 ``` | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------- | | `` | Video files to combine, in order (positional, at least two). | | `-o`, `--output ` | Output file or directory. The extension sets the format. Default: ` (combined).` next to the first input, in that file's format. | | `-w`, `--overwrite` | Overwrite an existing output file. | Uses the same bundled ffmpeg as Convert and Compress. H.264 for MP4/MOV/MKV, VP9 for WebM; H.264 encodes on the Mac's hardware media engine on both Apple Silicon and Intel. Decode-only formats are refused as output targets. Pick a format Picmal can write. ## slideshow Turn still images into a video slideshow. Images appear in the order you pass them, each held for the same time. Every image is scaled to fit the frame and centered, with black filling the rest, so nothing is ever cropped. ```bash picmal-cli slideshow photo1.jpg photo2.jpg photo3.jpg picmal-cli slideshow *.heic --duration 5 --resolution 4k -o trip.mp4 ``` | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------- | | `` | Image files, in the order they should appear (positional). | | `-o`, `--output ` | Output file or directory. Default: ` (slideshow).mp4` next to the first input. | | `--duration ` | Seconds each image is held. Default: `3`. | | `--resolution ` | Frame size: `match`, `4k`, `1080p` or `720p`. Default: `1080p`. | | `-w`, `--overwrite` | Overwrite an existing output file. | Output is H.264 MP4 at 30 fps. `match` sizes the frame to your largest image; the presets are 16:9, rotated to match the orientation of most of the inputs. See [Video tools](/docs/video-tools#slideshow). ## split-chapters Split a chaptered audiobook into one file per chapter. Picmal reads the chapter markers in an M4B/M4A audiobook (or any audio file that carries them) and writes one file per chapter, tagged with its title and track number. Pass several files to split them all. ```bash picmal-cli split-chapters book.m4b # one m4b per chapter picmal-cli split-chapters book.m4b --format mp3 # convert to mp3 picmal-cli split-chapters *.m4b --format mp3 -o out/ ``` | Flag | Description | | ----------------------- | ---------------------------------------------------------------------------------- | | `` | Audiobook file(s) to split (positional). | | `--format ` | Output format, e.g. `mp3`. Default: keep the input's format. | | `-o`, `--output ` | Output directory. Default: next to each input. | | `-w`, `--overwrite` | Overwrite existing output files. | Outputs are named ` - 01 - .`. Files with no chapter markers are reported and skipped. ## presets Browse the presets you've made in the app, plus the built-ins that ship with Picmal. Read-only. Make new ones in the app. ```bash picmal-cli presets list picmal-cli presets list --kind image picmal-cli presets show "Balanced" ``` ### list | Flag | Description | | ------------------------------ | ------------------------------- | | `--kind ` | Only show presets of this kind. | Text mode groups results under **Built-in** and **Custom**. JSON mode emits a `presets` array where each row carries `id`, `name`, `kind`, `source` (`"built-in"` or `"custom"`), and `description`. ### show ```bash picmal-cli presets show "Maximum quality" ``` Takes a preset name (case-insensitive) and prints everything it contains: - Image presets: per-format quality (`jpegQuality`, `webpQuality`, `pngLevel`, `heicQuality`, …) plus any resize / color / DPI sections. - Audio presets: codec, bitrate mode, target bitrate, sample rate, bit depth, mono flag. - Video presets: codec, CRF, encoding speed. If a name exists across kinds (the built-in "Maximum quality" exists for image, audio, and video), `show` prints every match. Custom presets win over built-ins of the same name within the same kind. ### Using presets in compress / convert Pass `--preset NAME` to either subcommand. The kind is matched against the input's category (image / audio / video), and the preset's values feed into the engine: - Image preset → per-output-format quality, resize geometry, target color space, DPI. - Audio preset → ffmpeg codec, bitrate, mono flag, sample rate, bit depth. - Video preset → ffmpeg codec, CRF, encoding speed. Input audio is stream-copied. Explicit flags always beat preset values. So `--preset "Maximum compression" --quality 95` gives you a high-quality output, not a tiny one. You can't create custom presets from the CLI. Make them in the app first (see [image compression](/docs/image-compression) and [audio and video](/docs/audio-and-video)). ## formats List the formats Picmal can read and write, grouped by category. ```bash picmal-cli formats picmal-cli formats --category image picmal-cli formats --json | jq '.formats.image' ``` | Flag | Description | | -------------------------------------------- | -------------------------------- | | `--category ` | Restrict output to one category. | ## watch Manage Picmal's watched folders from the terminal. The host app does the actual processing; `picmal-cli watch` only edits the list. ```bash picmal-cli watch add ~/Screenshots --format webp --strip-metadata picmal-cli watch add ~/Scans --action images-to-pdf picmal-cli watch list picmal-cli watch remove ~/Screenshots --yes ``` ### watch add | Flag | Description | | ------------------------ | --------------------------------------------------- | | `` | Folder path to watch (positional). | | `-o`, `--output ` | Output destination. Defaults to the watched folder. | | `-f`, `--format ` | Target format extension. Implies convert mode. | | `--action ` | `compress`, `convert`, `images-to-pdf`, or `combine-pdf`. Default: `compress`, or `convert` when `--format` is given. | | `-r`, `--recurse` | Watch subfolders recursively. | | `-s`, `--strip-metadata` | Strip metadata from processed files. | The batch actions collect what arrives instead of processing file by file: `images-to-pdf` turns the images that land within ten seconds of each other into one PDF, and `combine-pdf` merges the PDFs that land together into one, both in Finder name order. Page size, quality, and naming come from the folder's settings in the app. See [watched folders](/docs/watched-folders#actions). ### watch list Lists every configured watched folder, with mode, format, output, and UUID. ### watch remove ``` picmal-cli watch remove [--yes] ``` Pass either the folder path or the UUID printed by `watch list`. `--yes` (`-y`) skips the confirmation prompt, which is required when stdout isn't a terminal. ## license-status Prints whether the host app is licensed. ```bash picmal-cli license-status picmal-cli license-status --json ``` ## version Prints the bundled app version. ```bash picmal-cli version ``` ## Exit codes `picmal-cli` uses stable exit codes so scripts can branch on them: | Code | Meaning | | ---- | ------------------------------------------------------------------------ | | `0` | Success. | | `1` | Generic failure (e.g. underlying tool reported a non-zero exit). | | `2` | Usage error, bad arguments or missing required flag. | | `3` | Unlicensed. | | `4` | Input missing. | | `5` | Unsupported format. | | `7` | Cancelled (Ctrl+C). | | `8` | Output write failure (output already exists without `-w`, disk full, …). | | `9` | Partial success: some files succeeded, some failed in a batch. | | `10` | A bundled tool (magick, ffmpeg) couldn't be located. Reinstall fixes it. | | `11` | Input is corrupt or cannot be decoded. | ## JSON output When stdout isn't a terminal (piped or redirected), `picmal-cli` emits NDJSON: one JSON object per line. Force it with `--json`, force text with `--text`. Every event carries an `event` discriminator and an RFC 3339 `ts`. Successful file outputs go to **stdout**; errors, warnings, and progress go to **stderr**. The schema version is `1` and is included in the `started` event so consumers can detect breakages early. Every batch command ends its stream with a `completed` event carrying `produced` and `failed` counts, always as the last line, so a script can tell a finished batch from a process that died mid-run. `convert`, `compress`, `crop`, `split-pdf`, and `remove-background` all emit it. ```json {"event":"completed","produced":7,"failed":3,"ts":"2026-09-07T10:14:22Z"} ``` A `file` event can also carry a `notes` array when there is something you shouldn't miss. The only value today is `pdf_structure_dropped`, which means deeper PDF compression rebuilt that document and its links, bookmarks, and form fields did not survive. The field is omitted entirely when there is nothing to report, so existing consumers are unaffected. Example pipeline: ```bash picmal-cli compress -i ~/Pics -o ~/out --preset Balanced --json \ | jq -c 'select(.event=="file") | {input, output, savedPct: (1 - .bytesOut/.bytesIn)*100}' ``` --- # Clipboard optimization > Picmal automatically compresses any image you copy to your Mac's clipboard, so you paste a lighter version every time. Source: https://picmal.app/docs/clipboard-optimization Clipboard optimization lets Picmal automatically compress images you copy to the clipboard. Copy a screenshot, an image from a browser, or a file in Finder. Picmal optimizes it in the background and shows a small overlay so you can instantly copy the lighter version.