Skip to content

Comparison — Linux on macOS builders and runtimes ​

Last reviewed: September 4, 2026

At a glance ​

Determinate native builderApple containernix-darwin linux-builderIOHK nix-linux-builder
Jobrealize Linux drvsrun Linux processesrealize Linux drvsrealize Linux drvs
TransportVZ via determinate-nixdVZ, one VM per containerQEMU SSH or VZ SSHVZ via external-builders
aarch64-linuxyes (gated)--arch arm64yesyes
x86_64-linuxyes (gated)--arch amd64 --rosettaVZ+Rosetta / QEMU TCGRosetta
Runs ci --test in a worktreenoyesonly if you SSH in and install dubno
Builds uncached Linux drvsyes, if grantednot by itselfyesyes, ungated
Persistent guest storeopaqueno (ephemeral container)yeshost store via VirtioFS
Setup on this hostconfigured, HTTP 400works (1.1.0)/etc/nix/machines missingnot installed
Interactive fail shellnocontainer exec / machinessh builder@linux-buildernix-linux-shell

Consensus ​

Split the jobs. Realizing a Linux drv and executing a working-tree test suite are different kernels of work. Every Nix-native helper (Determinate, nix-darwin, IOHK) is a builder. Apple container is a runtime. Sparkles needs both: substitutes (or a builder) for packages.aarch64-linux.ci, and a runtime to exec it.

Virtualization.framework won the transport. Determinate, Apple container, linux-builder-vz, and IOHK all sit on VZ. QEMU remains the bootstrap for Intel Macs and for the stock darwin.linux-builder.

Rosetta, not TCG, for x86_64-linux on Apple silicon. Apple Containerization, linux-builder-vz, and IOHK all say so. Confirmed here with uname and Nix hello.

The splits ​

  1. Gating. Determinate's helper is a product feature. IOHK's is a flake you enable. Same protocol, different door.
  2. Guest store vs host store. nix-darwin QEMU snapshots the store to avoid lock deadlocks. IOHK/Determinate/container bind the host store and pay VirtioFS's DAC_OVERRIDE tax (IOHK with an ext4 loop).
  3. Persistence. A launchd NixOS VM keeps /nix/store warm. Apple container run --rm does not. container machine is the persistent sibling, but $HOME is not /Volumes/Dev.

Delta — sparkles today ​

See sparkles-baseline. The short version: Linux flake outputs substitute; they do not build; they execute inside Apple container with /nix/store mounted — and the dev shell is entered there from its derivation's JSON, the way nix-shell enters one, so the guest has CI's exact environment. ci --host-system is the dispatcher.