# Calling the ImageOptim macOS app from a Node.js script

> Learn how to launch the ImageOptim macOS app from a Node.js script using the child_process module and the open -a command to optimize a folder of images.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2023-01-18 | Updated: 2026-08-07 | Topics: [Node.js](https://flaviocopes.com/tags/node/) | Canonical: https://flaviocopes.com/calling-the-imageoptim-macos-app-from-a-nodejs-script/

[sharp](https://github.com/lovell/sharp) is what I usually use to optimize images in my [Node.js](https://flaviocopes.com/book/node/) scripts.

But sometimes I like using the [ImageOptim macOS application](https://imageoptim.com/mac) to optimize images with a GUI.

This time I had the need to start it from a [Node.js](https://flaviocopes.com/nodejs/) script.

Here’s what I did.

Import `execFile` from the built-in `node:child_process` module:

```javascript
import { execFile } from 'node:child_process'
```

then I called it in this way to optimize all images in a specific folder:

```javascript
const imagesFolder = './img'

execFile('open', ['-a', 'ImageOptim', imagesFolder], (error) => {
  if (error) {
    console.error('Could not open ImageOptim', error)
  }
})
```

`execFile()` passes the folder as an argument instead of interpolating it into a shell command. This handles spaces in the path and avoids treating path characters as shell syntax.

This starts the app and hands it the folder. It does not wait for ImageOptim to finish processing the files, and it only works on macOS with ImageOptim installed.
