Repository navigation
Personal AI Router 0.7.0 — macOS Apple Silicon
Personal AI Router 0.7.0 — macOS Apple Silicon
The fork's first non-prerelease build. It is the graduated version of the 0.7.0-rc.N line and carries everything those candidates carried. Unsigned and not notarized. Not a production-ready or NVIDIA-signed distribution. It targets macOS arm64 only; Windows, Linux desktop and Intel Mac packages are not included. Privileged-helper registration and automatic firewall setup stay unavailable in unsigned builds: instead of prompting, PAIR shows Firewall setup: manual guidance under Settings → Service.
It is the fork's Latest release, so 0.7.0-rc.N installs are offered it through the in-app updater, and scripts/install-mac.sh installs it by default. The earlier candidates remain on the releases page.
Upgrade notes
- Desktop 0.7.0 ships service product 2.5.0. The relay envelope protocol stays v2 and no JSON-RPC method was removed, so upgrade desktop/TUI and services together.
- Mixed clusters: a member running an older workload-manager does not carry the engine-native view from remote nodes, so that view is complete only once every member is upgraded. The originating node is unaffected.
- Per-node inference totals cover the period since the broker started, and reset when the broker restarts; per-job figures persist with the workload store.
What this release adds
The engine's own view, on the node card
- Each node's engine reports its own counters — request and token totals, prefill and generation speeds, cache efficiency, loaded models — and PAIR carries them across the cluster and shows them on the node card. They are the engine's numbers, so they include traffic PAIR did not route; they are shown as a separate, labelled "engine self-report" and are never merged with PAIR's own totals.
- The engine's API key cannot leak: PAIR defines its own response type and reads the engine's payload field by field, so the key the engine returns is dropped by construction.
Live in-flight numbers, on a running job
- A running job's card shows what is happening now: elapsed time, time to first byte, what has streamed, and — for oMLX — the engine's own token count, decode rate, prefill progress and queue position. Earlier candidates showed nothing until a job ended, so a job stuck in prefill looked identical to one halfway through decoding.
- No estimates. The live card shows what PAIR measures exactly and what the engine measures exactly. A chunk count is never presented as a token count, and no rate is derived from one. Anything nobody reported reads "not reported", never
0.
What this release fixes
- A manual peer's engine-native view was never fetched. The engine-native view was read only by the node-scanner, and only for the nodes in its own mDNS directory. A peer registered as a manual node — reached over Tailscale or a static address — is never in that directory, so its record carried its model list but no engine counters, and the desktop showed nothing for it.
nvpair-manual-nodesnow reads the engine's counters over the same pinned cluster-mTLS client it already used for the model list. - A job's live frame rarely carried the engine's numbers. The job's two live publishers shared one per-job frame limiter, and the chunk-driven one won nearly every window, so the engine's half of the frame was almost never published. Both publishers now put both halves on the frame they leave; the one-frame-per-two-seconds bound is unchanged. A pre-existing data race on the frame interval was fixed in the same change.
Full list: CHANGELOG.
Validation
Built from 16e0f87 on a clean tree.
make check,npm run dead-code:checkandmake testpass: 625 desktop unit tests and every Go module, including the newnvpair-shared/inferencemetricsandnvpair-ui-broker/nodemetricspackages.go test -raceis green in the broker, the workload-manager and the three inference proxies.- The feature was reviewed three times before merge (per task, whole branch, and an independent final pass), and then validated against a live two-node cluster — this machine and a second Mac, paired as cluster members:
- a request served by the peer carried its measurement and its live frame back to the originating member, under the right job id, with the origin, the engine and the run id travelling with it;
- the per-job numbers matched the engine's own
usageblock exactly (prompt tokens 60, completion tokens 199, prefill 320 ms, decode 2470 ms, time to first token 320 ms, total 2790 ms); - the peer's engine-native view matched that machine's own oMLX counters exactly (requests 2, prompt tokens 123, completion tokens 599, prefill 161.1 and generation 69.1 tokens per second);
- with a warm model, 5 of 6 live frames carried the engine's live numbers — the first is published before the engine's rows have been read.
- Package checks:
- The app reports 0.7.0, and the service binaries report their
services/versions.jsonversions and are arm64-only. LICENSE,LICENSE.electron.txt,LICENSES.chromium.htmlandTHIRD_PARTY_NOTICES.mdare present in the packaged app.- The DMG checksum is valid, and the app inside the DMG and the ZIP is identical to the built bundle (content-manifest SHA-256
dc748cd2868551a08744f51fe4ba83608dd92903ccaf641bdd7fa696a8475255). NVPAIR-Setup-0.7.0-arm64.dmgSHA-2562e43fb5fabd78e1685368f25b6aed85531bd5df5926f2573bc4b4f8cb38f4881;NVPAIR-Setup-0.7.0-arm64.zipSHA-2565d7eb3c57c6956711994f9849d92749d29262a854d02926fb6491dde26d19189;service-binaries-mac-arm64.zipSHA-25647d54a1478a7bbb3641c8ead6eadcfbcc6cc3ad588c2aae8abb953985d96cdef.- The update feed points at this fork. Code signing is ad-hoc only.
- The app reports 0.7.0, and the service binaries report their
- The cross-process suite in
services/testsfails 15 tests on the build machine because a running PAIR application holds ports 11434/1234/14320/14322. The identical failure set reproduces at the base commit, so it is an environment condition, not a regression. - No release-candidate profile was recorded for this build. The rc.3 profile in Performance and energy remains the most recent measurement; no percentage improvement is claimed.
Assets
NVPAIR-Setup-0.7.0-arm64.dmg and .zip with their blockmaps, service-binaries-mac-arm64.zip (the packaged service binaries), SHA256SUMS, and the macOS update feeds latest-mac.yml / latest-arm64-mac.yml.
Not validated
- The per-job phase durations need a newer oMLX, or a non-streaming request. oMLX 0.7.2's streaming
usagechunk carries the token counts but notprompt_eval_duration,generation_durationortime_to_first_token; its non-streaming response does. Against 0.7.2 a streaming job shows its token counts and reads "not reported" for the phase durations — the honest, designed behaviour. - The first frame of a job carries no engine reading: it is published before the engine's rows have been read.
- The live card's chunk counter reads 0 for oMLX streams, which carry
reasoning_contentrather thancontentdeltas; the byte count and the engine's own token count are unaffected. - Windows, Linux desktop and Intel Mac runtime; Windows worker-hang recovery and GPU readings.
- Fresh install on a new machine, uninstall, purge, and corrupt- or interrupted-download handling of this build.
- Upgrade from a
0.7.0-rc.Nbuild on a live machine, and the profiling of this build. - Apple trust: no Developer ID signing or notarization; Gatekeeper may block first launch.