---
title: "Installation"
description: "Install the machinemail CLI on macOS, Linux or Windows, pin a version, and set up shell completions for bash, zsh and fish."
canonical: "https://machinemail.dev/docs/cli/installation"
---

# Installation

> Install the machinemail CLI on macOS, Linux or Windows, pin a version, and set up shell completions for bash, zsh and fish.

Source: https://machinemail.dev/docs/cli/installation

The CLI is one self-contained executable per platform: the Bun runtime and the app compiled together, about 80 MB on disk. You need neither Bun nor Node to run it. The same binary answers to `machinemail` and `mm`.

## Platforms

| Platform              | Archive                           | Notes                                                                                            |
| --------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------ |
| Linux x64             | `machinemail-linux-x64.tar.gz`    | glibc. Built without AVX2, so older CPUs and emulators run it.                                   |
| Linux arm64           | `machinemail-linux-arm64.tar.gz`  | glibc.                                                                                           |
| macOS Intel           | `machinemail-darwin-x64.tar.gz`   | Not notarized yet; see below.                                                                    |
| macOS Apple silicon   | `machinemail-darwin-arm64.tar.gz` | Not notarized yet; see below.                                                                    |
| Windows x64           | `machinemail-windows-x64.zip`     | `machinemail.exe` plus an `mm.cmd` shim. Not Authenticode-signed yet.                            |
| Alpine and other musl | none                              | Not supported yet. The install script stops with an error instead of a binary that cannot start. |

Releases are published on [github.com/machinemail/cli](https://github.com/machinemail/cli/releases), tagged `cli-v<version>`. Each release also carries `SHA256SUMS` and a `manifest.json` with the version and every asset's checksum.

## Install script

**macOS and Linux**

```bash title="Terminal"
curl -fsSL https://machinemail.dev/install.sh | sh
```

The script:

1. picks the archive for your OS and CPU (an x64 shell under Rosetta on Apple silicon gets the arm64 build),
2. downloads it with `SHA256SUMS` and refuses to install on a checksum mismatch,
3. installs `machinemail` into `~/.local/bin`, replacing an older copy atomically,
4. links `mm` to it, unless an unrelated `mm` is already there,
5. tells you if the directory is not on your `PATH`.

Options go after `sh -s --`; each has an environment variable too:

| Option              | Variable                   | Default               |
| ------------------- | -------------------------- | --------------------- |
| `--version <x.y.z>` | `MACHINEMAIL_VERSION`      | the latest release    |
| `--dir <path>`      | `MACHINEMAIL_INSTALL_DIR`  | `$HOME/.local/bin`    |
| `--base-url <url>`  | `MACHINEMAIL_DOWNLOAD_URL` | the releases page     |
| `--no-mm`           |                            | the `mm` link is made |

```bash title="Terminal"
curl -fsSL https://machinemail.dev/install.sh | sh -s -- --version 0.1.0 --dir /usr/local/bin
```

Only `https://` and `file://` download URLs are accepted.

**Windows**

Download `machinemail-windows-x64.zip` from the [latest release](https://github.com/machinemail/cli/releases/latest), unzip it into a folder on your `PATH`, and run `machinemail.exe`. The zip also contains `mm.cmd`, so `mm` works too. SmartScreen warns about the unsigned executable until releases are signed.

Check the install:

```bash title="Terminal"
machinemail --version
machinemail version --json
```

```text
machinemail 0.1.0 (877499ccae83, linux-x64)
{
  "version": "0.1.0",
  "commit": "877499ccae83",
  "built_at": "2026-10-09T15:42:40.659Z",
  "target": "linux-x64"
}
```

The commit is the 12-character git commit the binary was built from (with `-dirty` if the CLI sources had uncommitted changes). Include the `version --json` output when you report a problem.

### macOS Gatekeeper

The macOS binaries are signed ad hoc but not notarized yet. A binary installed with `curl` (the install script) is not quarantined and runs. One downloaded with a browser is blocked by Gatekeeper; clear the quarantine flag to run it:

```bash title="Terminal"
xattr -d com.apple.quarantine ~/.local/bin/machinemail
```

## Shell completions

`machinemail completion <shell>` prints a completion script for bash, zsh or fish. It completes commands, actions, flags (with descriptions in zsh and fish), enum values, config keys and profile names, and covers `mm` too. The script never runs the CLI while you type; it reads profile names straight from the config file.

**bash**

```bash title="Terminal"
mkdir -p ~/.local/share/bash-completion/completions
machinemail completion bash > ~/.local/share/bash-completion/completions/machinemail
```

Or load it in `~/.bashrc` with `eval "$(machinemail completion bash)"`.

**zsh**

```bash title="Terminal"
machinemail completion zsh > "${fpath[1]}/_machinemail"
```

Then restart zsh. Or add `source <(machinemail completion zsh)` to `~/.zshrc`, after `compinit`.

**fish**

```bash title="Terminal"
machinemail completion fish > ~/.config/fish/completions/machinemail.fish
```

The script is generated from the command tree of the binary that printed it, so regenerate it after upgrading.

## Upgrade and uninstall

To upgrade, run the install script again; it replaces the binary in place. To uninstall, delete the binary and the link, and optionally the config directory (which holds your saved keys):

```bash title="Terminal"
machinemail logout --yes                 # revoke the stored key first, if you want it gone
rm ~/.local/bin/machinemail ~/.local/bin/mm
rm -r ~/.config/machinemail
```

The CLI does not check for updates unless you turn it on with `machinemail config set update_check true`. When on, it reads the latest release's `manifest.json` from github.com/machinemail/cli at most once a day. Version 0.1.0 was built before that address was set, so on 0.1.0 also set `MACHINEMAIL_UPDATE_URL=https://github.com/machinemail/cli/releases/latest/download/manifest.json.
