background grid image
Image for post changelog-determinate-nix-386
Aug 22, 2025 by Graham Christensen

Changelog: Determinate now has a nix-darwin module, plus loads of performance perks

I forgot to publish the release notes for 3.8.5. Oops 😬. So now you get a two-for-one deal instead!

We’ve recently shipped a ton of performance improvements, some small, some pretty significant. This release also improved the native Linux builders in some scenarios, especially around network access.

As a reminder: the native Linux builders in Determinate Nix enable macOS users to build for both ARM and x86 Linux with zero configuration. The native Linux builders are currently in developer preview mode and will slowly be rolled out to Determinate Nix users over the coming weeks. But if you’re eager to try it out now, reach out to us at support@determinate.systems and include your FlakeHub username.

As always, don’t hesitate to reach out to us with questions or feedback on Discord or via email at hello@determinate-systems.

And now for the updates. Let’s start with a user-facing change folks have been really clamoring for.

Determinate now has a nix-darwin module!

You can finally configure Determinate Nix with nix-darwin. Add the nix-darwin module and customize Determinate Nix to taste:

flake.nix
{
inputs.determinate.url =
"https://flakehub.com/f/DeterminateSystems/determinate/3.8.6";
inputs.nix-darwin.url =
"https://flakehub.com/f/nix-darwin/nix-darwin/0";
outputs.darwinConfigurations.mac = inputs.nix-darwin.lib.darwinSystem {
inherit system;
modules = [
inputs.determinate.darwinModules.default
{
determinate-nix.customSettings = {
flake-registry = "/etc/nix/flake-registry.json";
};
}
];
};
}

Notice the customSettings parameter, which enables you to pass in whatever custom Nix configuration you like. That configuration is then written to /etc/nix/nix.custom.conf for you.

Interactive UX

Nix’s evaluation caching no longer blocks other evaluators

Nix’s evaluation cache used to block other Nix processes from evaluating. This was most often noticed with tools like direnv. Determinate Nix doesn’t do that, instead enabling you to evaluate many projects in parallel.

Relevant pull request

More responsive tab completion

Tab completion now implies the --offline flag, which disables most network requests. Previously, tab-completing Nix arguments would attempt to fetch sources and access binary caches. Operating in offline mode improves the interactive experience of Determinate Nix when tab completing.

Relevant pull request

ZFS users: we fixed the mysterious stall

Opening the Nix database is usually instantaneous but would occasionally impose several seconds of mysterious latency. This was due to a quirk in ZFS that was quite recently fixed in that project. Determinate Nix works around the issue as well, eliminating the frustrating random stall when running nix commands.

Relevant pull request

Faster evaluation with more efficient I/O

“Unpacking into the Git cache” is much faster

Unpacking sources into the user’s cache with Determinate Nix now takes 1/2 to 1/4 of the time it used to. Previously, Nix serially unpacked sources into the cache. This change takes better advantage of our users’ hardware by parallelizing the import.

Real-life testing shows that an initial Nixpkgs import takes 3.6 seconds on Linux when it used to take 11.7 seconds, which is 8.1 seconds less.

Relevant pull request

Parallelized copying of sources to the daemon

Determinate Nix’s evaluator no longer blocks evaluation when copying paths to the store. Previously, Nix would pause evaluation when it needed to add files to the store. Now, the copying is performed in the background allowing evaluation to proceed.

Relevant pull request

Faster Nix evaluation

Eliminated thousands of duplicate Nix daemon queries

Determinate Nix more effectively caches store path validity data within a single evaluation. Previously, the Nix client would perform many thousands of extra Nix daemon requests. Each extra request takes real time, and this change reduced a sample evaluation by over 12,000 requests.

Relevant pull request

Parallelized memory garbage collection

We changed the “marking” process of the evaluator’s garbage collector to use multiple threads. Determinate Nix more quickly collects garbage across the large heap that Nixpkgs and NixOS tends to create.

This change has cut over five seconds from nix search on nixpkgs, from 24.3 seconds to 18.9 seconds.

Relevant pull request

Fewer daemon queries, fewer daemon reconnects

We fixed a bug with lazy trees that caused the Nix client to frequently reconnect to the daemon. This issue caused a fairly significant regression in the performance of lazy trees in some cases. As part of this change, we also reduced the number of queries the client needs to make in the first place.

Other changes

  • We fixed an issue where the Nix evaluation cache was a bit too eager and failed with don't know how to recreate store derivation.
  • Determinate Nix is now fully formatted by clang-format, making it easier than ever to contribute to the project.
  • Determinate Nix now uses main as our development branch, moving away from detsys-main.
  • Determinate Nix is now based on upstream Nix 2.30.2.

How to get Determinate Nix

If you already have Determinate Nix installed, you can upgrade to 3.8.6 with one Determinate Nixd command:

Upgrade command for version 3.8.6
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:

Logo for graphical installer

Install Determinate Nix on macOS now

Apple Silicon and Intel

On Linux:

Install Determinate Nix 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:

.github/workflows/nix-ci.yaml
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@v4
- uses: DeterminateSystems/determinate-nix-action@v3
- uses: DeterminateSystems/flakehub-cache-action@main
- uses: DeterminateSystems/nix-flake-checker-action@main
- run: nix flake check

In Amazon Web Services:

aws.tf
data "aws_ami" "detsys_nixos" {
most_recent = true
owners = ["535002876703"]
filter {
name = "name"
values = ["determinate/nixos/epoch-1/*"]
}
filter {
name = "architecture"
values = ["x86_64"]
}
}

Share
Avatar for Graham Christensen
Written by Graham Christensen

Graham is a Nix and Rust developer, with a passion and focus on reliability in the lower levels of the stack. He founded Determinate Systems, Inc to support Nix adoption at your workplace.

Would you like access to private flakes and FlakeHub Cache?

Sign up for FlakeHub