background grid image
Image for post changelog-determinate-nix-370
Jul 4, 2025 by Graham Christensen

Changelog: faster CI, deep flake overrides, and a better nix store delete in Determinate Nix 3.7.0

Celebrate the Fourth of July with the release of Determinate Nix version 3.7.0! We’ve shipped several Nix performance and UX improvements and we’re also excited to roll out lazy trees to more users.

Prefetch flake inputs in parallel

This release introduces the nix flake prefetch-inputs command to Determinate Nix.

Flake inputs are typically fetched “just in time.” That means that Nix fetches flake inputs as needed during the evaluation process, which can slow down evaluation in projects with many flake inputs. Ideally, though, Nix could avoid such slow-downs by fetching flake inputs prior to evaluation.

The new nix flake prefetch-inputs command does precisely that, fetching all flake inputs in parallel so that they’re already available when you need to evaluate any expression. We expect that running this new command before building things with Nix should dramatically improve evaluation performance for most projects, especially in CI. Note that projects with many unused flake inputs may not benefit from this change since the new command fetches every inputs whether they’re used or not.

We plan to run some experiments in GitHub Actions to see if and how much this helps.

Relevant pull request

Deep flake input overrides now work as expected

An override like this…

{
inputs.foo.inputs.bar.inputs.nixpkgs.follows = "nixpkgs";
}

…used to implicitly set inputs.foo.inputs.bar to flake:bar, which led to an unexpected error like this:

Terminal window
error: cannot find flake 'flake:bar' in the flake registries

With this release, Nix no longer creates a parent override (like for foo.bar in the example above) if it doesn’t set an explicit ref or follows attribute; instead, Nix only recursively applies its child overrides.

This closes four upstream Nix issues. Check out DeterminateSystems/nix-src#95 for more details and a snazzy diagram!

Relevant pull request

nix store delete now shows you why deletion was not possible

Here’s some example error output:

Terminal window
error: Cannot delete path '/nix/store/6fcrjgfjip2ww3sx51rrmmghfsf60jvi-patchelf-0.14.3'
because it's referenced by the GC root '/home/eelco/Dev/nix-master/build/result'.
error: Cannot delete path '/nix/store/rn0qyn3kmky26xgpr2n10vr787g57lff-cowsay-3.8.4'
because it's referenced by the GC root '/proc/3600568/environ'.
error: Cannot delete path '/nix/store/klyng5rpdkwi5kbxkncy4gjwb490dlhb-foo.drv'
because it's in use by '{nix-process:3605324}'.

Relevant pull request

Lazy-tree improvements

Improved lazy tree evaluation caching for flakes accessed with a path flakeref.

Relevant pull request

Lazy trees on its way to general availability

Since the last release, we’ve finished preparation for rolling out lazy tree to more users. We’re going to start enabling lazy trees for about 5% of Determinate Nix users on version 3.7.0 outside of CI.

You can see if you’re enrolled in the lazy trees rollout using the determinate-nixd version command:

Check if Determinate Nix is due for an upgrade
determinate-nixd version

If Determinate Nix is up to date, you should see this:

Terminal window
Determinate Nixd daemon version: 3.7.0
Determinate Nixd client version: 3.7.0
You are running the latest version of Determinate Nix.
The feature lazy-trees is enabled.

If you’d like to opt out, please contact support@determinate.systems.

We’re excited for more folks to experience the, frankly, huge performance benefits of lazy trees in their workflows.

How to get Determinate Nix

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

Upgrade command for version 3.7.0
sudo determinate-nixd upgrade

If you don’t yet have Determinate Nix installed, you can install it 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