Skip to content
machinemail

Installation

Install the machinemail CLI on macOS, Linux or Windows, pin a version, build it from source with Bun, and set up shell completions for bash, zsh and fish.

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.

Not published yet

Public releases are not available yet. The install script and download links on this page describe how installs will work once the first release is published; until then they return 404. To use the CLI today, build it from source.

Platforms

PlatformArchiveNotes
Linux x64machinemail-linux-x64.tar.gzglibc. Built without AVX2, so older CPUs and emulators run it.
Linux arm64machinemail-linux-arm64.tar.gzglibc.
macOS Intelmachinemail-darwin-x64.tar.gzNot notarized yet; see below.
macOS Apple siliconmachinemail-darwin-arm64.tar.gzNot notarized yet; see below.
Windows x64machinemail-windows-x64.zipmachinemail.exe plus an mm.cmd shim. Not Authenticode-signed yet.
Alpine and other muslnoneNot supported yet. The install script stops with an error instead of a binary that cannot start.

Each release also carries SHA256SUMS and a manifest.json with the version and every asset’s checksum.

Install script

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:

OptionVariableDefault
--version <x.y.z>MACHINEMAIL_VERSIONthe latest release
--dir <path>MACHINEMAIL_INSTALL_DIR$HOME/.local/bin
--base-url <url>MACHINEMAIL_DOWNLOAD_URLthe releases page
--no-mmthe mm link is made
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.

Download machinemail-windows-x64.zip from the release, 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:

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:

Terminal
xattr -d com.apple.quarantine ~/.local/bin/machinemail

Build from source

The CLI lives in apps/cli of the MachineMail monorepo and builds with Bun (the repository pins 1.4.2).

Terminal
bun install                     # at the repository root
cd apps/cli
bun run build                   # dist/machinemail for this machine
install -m 0755 dist/machinemail ~/.local/bin/machinemail
ln -sf machinemail ~/.local/bin/mm

bun run build first regenerates the commands from openapi/machinemail.yaml, so the binary matches the API spec in your checkout. To run from source without compiling, use bun run dev -- <args> (for example bun run dev -- --help); version then reports the commit as dev.

Other targets cross-compile from one machine:

Terminal
bun scripts/build.ts --target=darwin-arm64     # dist/darwin-arm64/machinemail
bun run release                                # every platform, archived, with SHA256SUMS

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.

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)".

Terminal
machinemail completion zsh > "${fpath[1]}/_machinemail"

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

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):

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. The check is a stub until releases are public: it makes no network call without a release manifest URL.