Determinate Nix 3.11.1 is out and it delivers parallel evaluation, a long-awaited improvement, to our users.
In many real-world cases we’ve seen evaluation times cut in half or more.
But that’s not all: we’ve drastically improved the default nix flake init
template and fixed build cancellation on macOS.
Let’s take a closer look.
Parallel evaluation
Parallel evaluation (or parallel eval for short) is possibly the most exciting change we’ve shipped in months. It promises to speed up a wide range of Nix operations by distributing work across multiple processors. We plan to introduce parallel eval incrementally on a per-operation basis over the coming weeks and months.
We’ve started with these commands, which can now evaluate Nix expressions in parallel:
nix search
nix flake check
nix flake show
nix eval --json
As a real-world example, parallel eval has significantly reduced evaluation time for a flake we use internally that outputs multiple NixOS configurations. How significant? For this set of NixOS configurations, evaluation time was cut in half, from over 20 seconds to under 9 seconds.
Some other examples:
nix search "https://flakehub.com/f/NixOS/nixpkgs/0.1" cowsay --no-eval-cache
used to take 15 seconds and now takes 6 seconds (a speedup of 2.5x)nix flake check github:NixOS/hydra/7de71224795804b3f5e6aa5a038d8143ba6fc415 --no-build --no-eval-cache
used to take 20 seconds and now takes less than 5.5 seconds (a speedup of 3.7x)
Parallel eval is currently in developer preview, and we’ve turned it on for our Trailblazers.
If you’d like to try it right away, set eval-cores
to 0 in your /etc/nix/nix.custom.conf
:
eval-cores = 0 # Evaluate across all cores
With this release, we’ve also introduced a new builtin, builtins.parallel
, that enables users to explicitly parallelize evaluation within a Nix expression.
Using builtins.parallel
can drastically improve the performance of projects using import-from-derivation (IFD).
It reduced the evaluation time of github:edolstra/parallel-eval-test#ifd
, for example, from 50 seconds to 10 seconds.
Using this new builtin requires turning on an additional experimental feature:
extra-experimental-features = parallel-eval
builtins.parallel
could have its semantics changed significantly or even be removed from Determinate Nix during the developer preview.
Relevant pull request
A useful nix flake init
template default
Nix’s default flake template is extremely bare bones, and not a useful starting point.
Determinate Nix now uses a more fleshed out default template, including targeting multiple systems.
Relevant pull request
Build cancellation is repaired on macOS
A recent macOS update changed how signals are handled by Nix and broke using Ctrl-C to stop a build. Determinate Nix on macOS correctly handles these signals and stops the build.
Relevant pull request
How to get Determinate Nix
If you already have Determinate Nix installed, you can upgrade to 3.11.1 with one Determinate Nixd command:
sudo determinate-nixd upgrade
If you don’t yet have Determinate Nix installed, you can upgrade or migrate to Determinate Nix on macOS using our graphical installer:

Install Determinate Nix on macOS now
Apple Silicon and Intel
On Linux:
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \ sh -s -- install --determinate
On NixOS, we recommend using our dedicated NixOS module or our NixOS ISO (NixOS installer for x86_64, NixOS installer for ARM) with Determinate Nix pre-installed.
On GitHub Actions:
on: pull_request: workflow_dispatch: push: branches: - main
jobs: nix-ci: runs-on: ubuntu-latest # Include this block to log in to FlakeHub and access private flakes permissions: id-token: write contents: read steps: - uses: actions/checkout@v5 - uses: DeterminateSystems/flake-checker-action@main - uses: DeterminateSystems/determinate-nix-action@v3 - uses: DeterminateSystems/flakehub-cache-action@main - run: nix flake check
In Amazon Web Services:
data "aws_ami" "detsys_nixos" { most_recent = true owners = ["535002876703"]
filter { name = "name" values = ["determinate/nixos/epoch-1/*"] }
filter { name = "architecture" values = ["x86_64"] }}