MLXDocs
MLX Node

Apps and updates

Markdown

MLX Node updates itself from a catalog that mlx.app signs; every download is checked against the catalog's SHA-256 and the app's Developer ID signature. Other makers' AI apps are in the AI App Store, inside MLX Node since 0.17.

MLX Node is the one download. Its Apps page lists MLX's own Mac apps in this catalog with their version and one button that does the next thing: Install, Update or Open. MLX Node itself is the only row. The code is mac/MLX/Core/Hub.swift (the catalog, installs, the notification centre) and mac/MLX/UI/AppsView.swift (the page).

The catalog

GEThttps://mlx.app/api/apps

The answer is the catalog as a JSON string (payload), signed by the sequencer's key:

FieldTypeNotes
payloadstringThe catalog: a JSON array, one entry per app.
sigstringEd25519 signature, hex, over SHA-256 of "mlx-apps-v1\n" + payload.
keystringThe sequencer's public key, hex. When MLX Node has pinned the sequencer's key while witnessing the ledger, it refuses a catalog signed by any other key.
revstring12 hex characters that change whenever any version, status, rollout or note changes.
atnumberWhen the catalog was built, in ms.

Each app in payload:

FieldTypeNotes
idstringThe app's id: node for MLX Node.
name, blurb, page, iconstringWhat the Apps page shows.
bundleId, teamstringWhat the installer checks in the app's signature: app.mlx.mac for MLX Node; team CCKXS9W488.
fileNamesstring[]Names an installed copy may have, newest first.
version, minOS, size, sha256, urlThe public build: a notarized disk image. null while there is none.
notesstringWhat's new, shown under the app.
statusstringavailable, new (a blue dot until seen), beta, or soon (listed, not installable).
rolloutnumber0–100: the share of Macs that see this version as an update.

The heartbeat reply carries catalogRev and inboxRev, so MLX Node fetches the catalog and the announcements only when they change (and at least every six hours).

Rollout

A Mac sees a version as an update when the first two bytes of SHA-256 of "<app>:<version>:<device public key>", read big-endian, modulo 100, are below rollout. The same Mac always lands on the same side, so a 20% rollout reaches the same fifth of Macs until it widens. A new install always gets the current version.

Installing and updating

  1. Download

    MLX Node downloads the disk image from the catalog's url and checks its size and SHA-256 against the catalog.

  2. Check

    It hands the image to its installer service (MLXUpdater.xpc, the only part of MLX Node outside the App Sandbox). The service mounts it read-only and checks the app inside: a Developer ID signature from team CCKXS9W488, the catalog's bundle id (only app.mlx.* apps, never MLX Node through this path), and a version newer than the installed one.

  3. Install

    The app is copied to the same folder as the installed copy (or to Applications, or ~/Applications for a new install) and swapped in. An app that is running is never replaced: the page says "Quit to update".

Automatic updates are on by default (Apps page → Update automatically). MLX Node updates itself once per version while its panel is closed; other apps are updated while they aren't running.

The menu bar dot and the notification centre

The icon shows a red dot when an installed app (MLX Node included) has an update, and a blue dot for something new: an app not installed yet, an announcement or unread wallet news. The bell in the panel opens the notification centre: updates, new apps, announcements and wallet news, newest first.

GEThttps://mlx.app/api/inbox?app=0.12.0&seat=free

Announcements, written by MLX in Admin → Announcements. app (MLX Node's version) and seat (free or dedicated) narrow the list to the announcements meant for that audience; nothing else is sent. What was read stays on the Mac.

FieldTypeNotes
itemsarrayNewest first, up to 50: { id, title, body, link?, at, until?, audience, minApp?, maxApp? }. link is an https page, or an app id (such as node) that opens its row on the Apps page.
revnumberThe newest announcement's time; the heartbeat's inboxRev carries the same value.
LinkWhat MLX Node does
mlx://appsOpens the Apps page.
mlx://install?app=<id>Opens the Apps page at that app. It never installs by itself: the owner presses Install.

From MLX Node 0.17, mlx://store and mlx://install?app=<a>,<b> open the AI App Store window instead; see AI App Store links. See Links for the others.