Alpha 0.1.0

Runlix

Local inference on Apple Silicon, without Python.

Year
2026
Area
AI, Desktop
Stack
Rust · MLX · mlx-c · Avalonia · .NET

The problem

On Apple Silicon, MLX models are used through Python: environments, dependencies, scattered caches and a terminal. The point is not the quality of the model, it is all the scaffolding needed to start it.

Constraints

  • No Python in the bundle: a single app to drag into Applications.
  • Memory and determinism measured, not estimated: thresholds in tests, not in intentions.
  • One generation at a time: a declared limit beats a queue that pretends.
  • User data is never touched: tests neither read nor write the real folder.

Architecture

  • Rust core (runlix-core) on top of a vendored mlx-c: fixes live in patches, never in local edits.
  • Avalonia/.NET desktop app driving the core; 228 MB .app bundle, 81 MB DMG.
  • Separate product site: downloads, reserved area, licences and plans, with self-hosted fonts.
  • 691 tests per language and seed-pinned generation oracles: the same sequence, every time.

Decisions that matter

Sorting the vocabulary was the cost

Over 128,000 logits everything was sorted on every token: 1.77 ms out of roughly 2 ms total. Candidates are now materialised in stages — 64, then ×8 — taking the speed from 64% to 93% of greedy.

Vendored, translated, never edited in place

mlx-c stays intact and every fix lives in a patch: if it no longer applies, the build fails and names it. Architectures are rewritten in idiomatic Rust, each with its own oracle. Without an oracle it is not done.

The memory threshold is measured, not estimated

Deterministic peak at 1115 MB evaluating layer by layer, against 1558 MB without. The earlier thresholds were re-measured when what they measured changed.

Where it got to

Alpha 0.1.0: 688 of 691 tests green, a signed but not yet notarised DMG, one generation at a time and MLX safetensors only. The product site is live on runlix.it.