MLXDocs
MLX Node

MLX Node

Markdown

MLX Node is the menu bar app that makes a Mac part of MLX Network. It holds the Mac's device key, links the Mac to a wallet, runs the AI jobs the server hands out within the owner's limits, and reports in with a signed heartbeat.

Download it from mlx.app/download. It runs on Macs with Apple silicon. The source is in mac/ in the mlx.app repository, and mirrored in the public repository MLXapp/mac.

GEThttps://mlx.app/api/download/mac

This redirects to the current public build: a disk image signed with a Developer ID and notarized by Apple.

Install from Terminal

One line installs MLX Node on a Mac with Apple silicon and macOS 14 or later:

sh
curl -fsSL mlx.app/i | sh

To pass on an invite, add the inviting wallet's name. MLX Node then opens Create wallet with that invite code filled in:

sh
curl -fsSL mlx.app/i/luca | sh

The script (lib/install/script.ts; read it at https://mlx.app/install?raw=1) checks the Mac, downloads the public build from /api/download/mac, checks that it is signed by MLX's Developer ID (team CCKXS9W488, bundle app.mlx.mac) and accepted by Gatekeeper, copies it to /Applications (or ~/Applications), never over a newer copy, and opens it. It doesn't need sudo and installs nothing else. Opened in a browser, mlx.app/i goes to the download page and mlx.app/i/<name> to the wallet with that invite.

What it does

  • Runs jobs. It asks the server for a job, runs it with Apple's MLX framework, and sends back a hash of the tokens it generated. See Jobs and checks.
  • Reports in. It sends a signed heartbeat with its state, its limits and what it did today. The heartbeat's reply says whether it may take jobs, what it earns, and whether a newer version is out.
  • Holds the wallet. From 0.12 the MLX Wallet is native in the panel: balances, deposit, swap, send, receive and dedicated seats, signed on the Mac after Touch ID. See The wallet in MLX Node.
  • Keeps itself up to date. From 0.11 its Apps page installs and updates MLX apps from a catalog mlx.app signs, and a notification centre shows updates, new apps and news. See Apps and updates.
  • Witnesses the ledger. It checks the sequencer's signed checkpoints and consistency proofs, cosigns them with its device key, and compares the newest anchor read straight from Solana. See Witnesses.
  • Takes commands from the owner's phone. Pause, resume or new limits, from MLX.app on iPhone or iPad. See Remote commands.

Everything lives in one popover under the menu bar icon. The icon is orange while MLX Node runs.

The device key

On first launch MLX Node makes a P-256 signing key in the Mac's Secure Enclave (mac/MLX/Core/DeviceKey.swift). The key can sign but never leaves the Mac. What is stored is only the Enclave's encrypted handle, which is useless on any other Mac. It sits in the app's own folder (Application Support/MLX/device-secure-enclave.key, readable only by the owner), not in the Keychain, so macOS never asks for a password.

A Mac without a Secure Enclave, such as a virtual machine, gets a software P-256 key (device-software.key) instead. The server can't tell the two apart: macOS gives it no attestation. See What this does not prove yet.

The device's public key, compressed and written as lowercase hex starting 02 or 03, is its id everywhere: in bind_device, in the x-mlx-device header and in /api/device/<pk>. The folder is called "MLX" whatever the app is called, because a new folder would mean a new key, and the Mac would be unlinked from its wallet.

Linking to a wallet

From 0.12, with the wallet on the Mac, linking is one step: MLX Node signs a link request for the wallet with its device key, and the wallet (after Touch ID) sends bind_device with that signature as proof.

Without the wallet on the Mac (or with Use my browser instead):

  1. MLX Node signs an open link request ("any wallet") and opens wallet.mlx.app with it.
  2. The owner unlocks or creates a wallet and confirms the Mac.
  3. The wallet sends a bind_device transaction with the Mac's signature as proof.
  4. MLX Node polls GET /api/device/<pk> until it sees the new link.

A Mac belongs to one wallet at a time. Linking it to another wallet moves it. A wallet can link up to 32 devices. The details are in Links.

When it works

The owner's limits decide (Limits and Policy in mac/MLX/Core/Policy.swift):

LimitWhat it does
After idle forOff (idleMinutes 0) is manual mode: the owner presses Start and Stop, and MLX Node works while the Mac is in use. Any other value is idle mode: work starts after that many idle minutes, and stops as soon as the owner touches the Mac. New installs start in manual mode.
MemoryThe share of the Mac's memory a job may use.
HoursWork only between these hours, local time. Equal values mean any time.
Only on powerWork only while plugged in (on by default).
HeatStop when the Mac reports this thermal state or hotter (fair or serious).
PauseThe owner paused or stopped it.

It also never works in Low Power Mode. While it can't work, the panel and the heartbeat say why: "Waiting for power", "Outside your hours", "Letting your Mac cool down" and so on. Those minutes don't count as available for rewards. See What counts as available.

On a dedicated seat it asks for the next job as soon as a result is in, so jobs run back to back. On a free seat the server spaces them out. See Free seats.

Updates

The heartbeat reply's latest names the current public build. The panel then shows an update card. With Update automatically on (the Apps page, on by default from 0.11), MLX Node updates itself once per version while its panel is closed; otherwise nothing happens until the owner presses Update:

  1. MLX Node downloads the disk image from /api/download/mac?via=app.
  2. It hands the image to the installer service inside the app (MLXUpdater.xpc). The service mounts the image and checks the Developer ID signature, the bundle id app.mlx.mac, the team and that the version is newer.
  3. Work stops, the new version is swapped in, and MLX Node restarts.

If the app's folder can't be written to, the disk image is saved to Downloads and opened in Finder instead. Opened from the disk image, MLX Node installs itself to Applications. It never replaces a newer copy.

Names

The app is called MLX Node. Its bundle id is app.mlx.mac, its executable MLX, and its URL scheme mlx://. Older installs called MLX.app rename themselves once after an update. The public build's version is in the heartbeat reply (latest.version) and on the download page.