Install
Install MUON on macOS
MUON ships as a native macOS app (Apple silicon) that hosts its own local backend and background runner — there is nothing else to start. The app is not Apple-signed, so the first launch needs one extra step past Gatekeeper.
Requirements
- Node.js 20.10 or newer and npm on your
PATHfor the installer. Node 24 is recommended. - macOS on Apple silicon (arm64). Intel and universal builds are not available.
- git installed and on your
PATH. MUON works on git workspaces and shells out for identity, diffs and merges. - At least one coding-agent CLI installed and logged in. MUON drives your own agents; it never ships or authenticates one for you.
| Agent | Install | Log in (you run this) |
|---|---|---|
| Claude Code | npm i -g @anthropic-ai/claude-code | run claude and sign in |
| Codex | npm i -g @openai/codex | codex login |
| Cursor | curl https://cursor.com/install -fsS | bash | cursor-agent login |
| OpenCode | curl -fsSL https://opencode.ai/install | bash | opencode auth login |
| Kiro | curl -fsSL https://cli.kiro.dev/install | bash | kiro-cli login or KIRO_API_KEY for headless use |
Each lane plays its strongest position
Claude Code and Codex build, lead, and hold the coordinator seat. Cursor runs review-class roles (reviewer, QA, architect, scout) with a guarantee attached: it reads and judges, and your workspace stays untouched. OpenCode is the crew's scout, and MUON forwards it no credential at all. Kiro runs governed worker roles; it can also hold the attached coordinator seat. MUON forwards a Kiro API key only to the child when one is configured.
Using Kiro? Set it up first
Kiro needs a little more than an install and a login: an IAM Identity Center login also needs a profile, and Kiro needs at least one fleet seat. Follow Set up Kiro for MUON before muon mcp install kiro, or run muon kiro doctor for a guided check.
Get the app
Download the app from the download page: grab MUON-<version>-arm64.dmg, open it, and drag MUON into Applications. Every artifact ships with a published SHA-256 checksum (SHA256SUMS) so you can verify what you got before you open it.
First launch: getting past Gatekeeper
Because the app carries no Developer ID signature, macOS blocks the very first launch and calls MUON an app from an “unidentified developer.” You only do this once.
- 01
System Settings → Privacy & Security → Open Anyway
Double-click
MUON.apponce. When macOS blocks it, open System Settings → Privacy & Security, scroll to the “MUON was blocked” notice, and click Open Anyway. This is the path on current macOS releases. - 02
Older macOS: right-click → Open
On older releases you can instead Control-click (or right-click)
MUON.app, choose Open, then confirm Open in the dialog. - 03
Or: clear the quarantine flag from the Terminal
xattr -dr com.apple.quarantine /Applications/MUON.app
This is the standard macOS mechanism for an unsigned app you trust — the same thing “Open Anyway” does. Run it once, after the app is in
/Applications.
Install the CLI and TUI
Node.js 20.10 or newer and npm on your PATH are required; Node 24 is recommended. Download the installer first:
curl -fsSLO https://getmuon.com/install.sh
Use Node to verify the installer on macOS. The system LibreSSL does not support this signature check. Save the following as verify.mjs. Cross-check the embedded key and fingerprint with the release signing keys bulletin.
import { createHash, createPublicKey, verify } from "node:crypto";
import { writeFileSync } from "node:fs";
// MUON release-manifest key. Cross-check the keyId at https://docs.getmuon.com/release-keys
const KEY = "MCowBQYDK2VwAyEAj38Q783SKDGtQhxTS24pOX2UMgsPipkL1RzlnJHpFxY=";
const KEY_ID = "e63d771f74c661945d3674cf633b8b07d7628536ba9783a958e13b91f341cbb6";
const get = async (url) => { const r = await fetch(url); if (!r.ok) throw new Error(`${url}: HTTP ${r.status}`); return Buffer.from(await r.arrayBuffer()); };
const der = Buffer.from(KEY, "base64");
if (createHash("sha256").update(der).digest("hex") !== KEY_ID) throw new Error("key fingerprint mismatch");
const channel = JSON.parse(await get("https://download.getmuon.com/channels/stable.signed.json"));
const { version } = JSON.parse(Buffer.from(channel.payload, "base64"));
if (!/^\d+\.\d+\.\d+$/.test(version)) throw new Error("unexpected version");
const installer = await get("https://getmuon.com/install.sh");
const signature = await get(`https://download.getmuon.com/releases/${version}/install.sh.sig`);
const key = createPublicKey({ key: der, format: "der", type: "spki" });
if (!verify(null, installer, key, signature)) { console.error("SIGNATURE INVALID. Do not run install.sh."); process.exit(1); }
writeFileSync("install.sh", installer);
console.log(`install.sh verified for MUON ${version}`);node verify.mjs
Only if it prints “install.sh verified”, run:
bash install.sh
That installs muon (the CLI — it auto-starts the local brain on first use, so there is no server to run) and muon-tui (the full-screen terminal cockpit) and muon-mcp (the MCP server). On macOS it also installs the desktop app, which carries the brain; pass --no-desktop for the CLI alone, --desktop-only for only the app, or --replace-desktop to replace an existing app.--desktop explicitly selects the macOS default. Then run:
Run muon login and finish sign-in in your browser. A locked distributed install refuses work with exit code 12; sign in and retry.
muon setup
The setup wizard connects your agents. Check readiness with muon setup --check, then run muon doctor for diagnostics. Prefer help from your agent? Set up with your agent.
The npm package @getmuon/cli is not published yet. Use the verified installer.
It verifies your GitHub identity (MUON stays locked until you do), registers MUON as an MCP server with the coding agents you choose, and starts the brain and runner. For the details, see the CLI reference and the MCP guide.
Verify the installer
Before running install.sh, verify its detached signature with the published manifest key. The release signing keys page lists both public keys, their fingerprints, and the exact verification commands.
“Unsigned” — why, and is it safe?
MUON is not signed with an Apple Developer ID certificate and is not notarized. Treat it as a controlled build, not (yet) a certificate-verified one.
- Why: Developer ID signing requires an active Apple Developer Program membership; the entitlements, notarization hook and config seam already exist so it can flip on later with no rework.
- What it means for you: macOS quarantines and warns on first launch. There is no other behavioral difference — MUON still runs entirely on your machine.
- How to trust the build: every release ships a published
SHA256SUMSfile next to the download — verify the DMG's checksum before opening it.
Auto-update
muon update --check # report available updates muon update --dry-run # show what would run muon update --cli-only # CLI, TUI and MCP only muon update --desktop-only # desktop only
muon update --host <url> selects a release host.
From a terminal, muon updateupdates the CLI and the app together and brings MUON back up if it was running. In the app, the sidebar's Updates panel checks MUON's release feed when you click Check for updates, or on every launch if you turn that on (it is off by default).
An app installed in /Applications applies the update itself. It downloads the update, verifies it against the feed, swaps the app in place and relaunches, keeping a rollback copy until the new version boots. Every step is your click. A copy anywhere else can only tell you a newer release exists.
Anonymous usage telemetry is on by default
MUON reports which surfaces and commands are used, whether dispatches succeed, and model token counts and cost. Turn it off in the first-run wizard, in Settings → Privacy, or with muon telemetry off. muon telemetry status prints exactly what is sent, including the one exception: MCP tool calls are captured in full. The privacy page has the details.
Where MUON stores data
| Path | What |
|---|---|
~/Library/Application Support/MUON/ | Settings, the embedded SQLite brain, the graph store, the lockfile |
…/MUON/logs/brain.log | Embedded backend log |
~/.muon-runtime-logs/<data-dir-digest>/runner.log | Sandboxed runner boot, lease, dispatch and recovery log |
Uninstalling: delete MUON.app. Clearing the data directory is a manual step today.