Release 2.29.0 (2025-05-14)
After the special backport-based release of Nix 2.28 (timed to coincide with Nixpkgs 25.05), the release process is back to normal with 2.29.
As such, we have slightly more weeks of work from master
(since 2.28 was branched from 2.27) than usual.
This fact is counterbalanced by the fact that most of those changes are bug fixes rather than larger new features.
-
Prettified JSON output on the terminal #12555 #12652
This makes the output easier to read.
Scripts are mostly unaffected because for those, stdout will be a file or a pipe, not a terminal, and for those, the old single-line behavior applies.
--json --pretty
can be passed to enable it even if the output is not a terminal. If your script creates a pseudoterminal for Nix's stdout, you can pass--no-pretty
to disable the new behavior. -
Repl: improve continuation prompt for incomplete expressions #12846
Improved REPL user experience by updating the continuation prompt from invisible blank spaces to a visible
" > "
, enhancing clarity when entering multi-line expressions. -
REPL
:load-flake
and:reload
now work together #8753 #13180Previously,
:reload
only reloaded the files specified with:load
(or on the command line). Now, it also works with the flakes specified with:load-flake
(or on the command line). This makes it correctly reload everything that was previously loaded, regardless of what sort of thing (plain file or flake) each item is. -
Increase retry delays on HTTP 429 Too Many Requests #13052
When downloading Nix, the retry delay was previously set to 0.25 seconds. It has now been increased to 1 minute to better handle transient CI errors, particularly on GitHub.
-
S3: opt-in the STSProfileCredentialsProvider #12646
Added support for STS-based authentication for S3-based binary caches, i.e. enabling seamless integration with
aws sso login
. -
Reduce connect timeout for http substituter #12876
Previously, the Nix setting
connect-timeout
had no limit. It is now set to5s
, offering a more practical default for users self-hosting binary caches, which may occasionally become unavailable, such as during updates. -
C API: functions for locking and loading a flake #10435 #12877 #13098
This release adds functions to the C API for handling the loading of flakes. Previously, this had to be worked around by using
builtins.getFlake
. C API consumers and language bindings now have access to basic locking functionality.It does not expose the full locking API, so that the implementation can evolve more freely. Locking is controlled with the functions, which cover the common use cases for consuming a flake:
nix_flake_lock_flags_set_mode_check
nix_flake_lock_flags_set_mode_virtual
nix_flake_lock_flags_set_mode_write_as_needed
nix_flake_lock_flags_add_input_override
, which also enablesvirtual
This change also introduces the new
nix-fetchers-c
library, whose single purpose for now is to manage the (nix.conf
) settings for the built-in fetchers.More details can be found in the C API documentation.
-
No longer copy flakes that are in the nix store #10435 #12877 #13098
Previously, we would duplicate entries like
path:/nix/store/*
back into the Nix store. This was prominently visible for pinned system flake registry entries in NixOS, e.g., when runningnix run nixpkgs#hello
. -
Consistently preserve error messages from cached evaluation #12762 #12809
In one code path, we are not returning the errors cached from prior evaluation, but instead throwing generic errors stemming from the lack of value (due to the error). These generic error messages were far less informative. Now we consistently return the original error message.
-
Faster blake3 hashing #12676
The implementation for blake3 hashing is now multi-threaded and used memory-mapped IO. Benchmark results can be found the pull request.
-
Fix progress bar for S3 binary caches and make file transfers interruptible #12877 #13098 #12538
The progress bar now correctly display upload/download progress for S3 up/downloads. S3 uploads are now interruptible.
-
Add host attribute of github/gitlab flakerefs to URL serialization #12580
Resolved an issue where
github:
orgitlab:
URLs lost theirhost
attribute when written to a lockfile, resulting in invalid URLs. -
Multiple signatures support in store urls #12976
Added support for a
secretKeyFiles
URI parameter in Nix store URIs, allowing multiple signing key files to be specified as a comma-separated list. This enables signing paths with multiple keys. This helps with RFC #149 to enable binary cache key rotation in the NixOS infra.Example usage:
nix copy --to "file:///tmp/store?secret-keys=/tmp/key1,/tmp/key2" \ "$(nix build --print-out-paths nixpkgs#hello)"
-
nix flake show now skips over import-from-derivation #4265 #12583
Previously, if a flake contained outputs relying on import from derivation during evaluation,
nix flake show
would fail to display the rest of the flake. The updated behavior skips such outputs, allowing the rest of the flake to be shown. -
Add
nix formatter build
andnix formatter run
commands #13063nix formatter run
is an alias fornix fmt
. Nothing new there.nix formatter build
is sort of likenix build
: it builds, links, and prints a path to the formatter program:$ nix formatter build /nix/store/cb9w44vkhk2x4adfxwgdkkf5gjmm856j-treefmt/bin/treefmt
Note that unlike
nix build
, this prints the full path to the program, not just the store path (in the example above that would be/nix/store/cb9w44vkhk2x4adfxwgdkkf5gjmm856j-treefmt
). -
Amend OSC 8 escape stripping for xterm-style separator #13109
Improve terminal escape code filtering to understand a second type of hyperlink escape codes. This in particular prevents parts of GCC 14's diagnostics from being improperly filtered away.
Contributors
This release was made possible by the following 40 contributors:
- Farid Zakaria (@fzakaria)
- The Tumultuous Unicorn Of Darkness (@TheTumultuousUnicornOfDarkness)
- Robert Hensing (@roberth)
- Félix (@picnoir)
- Valentin Gagarin (@fricklerhandwerk)
- Eelco Dolstra (@edolstra)
- Vincent Breitmoser (@Valodim)
- Brian McKenna (@puffnfresh)
- ulucs (@ulucs)
- John Ericson (@Ericson2314)
- Andrey Butirsky (@bam80)
- Dean De Leo (@whatsthecraic)
- Las Safin (@L-as)
- Sergei Zimmerman (@xokdvium)
- Shahar "Dawn" Or (@mightyiam)
- Ryan Hendrickson (@rhendric)
- Rodney Lorrimar (@rvl)
- Erik Nygren (@Kirens)
- Cole Helbling (@cole-h)
- Martin Fischer (@not-my-profile)
- Graham Christensen (@grahamc)
- Vit Gottwald (@VitGottwald)
- silvanshade (@silvanshade)
- Illia Bobyr (@ilya-bobyr)
- Jeremy Fleischman (@jfly)
- Ruby Rose (@oldshensheep)
- Sergei Trofimovich (@trofi)
- Tim (@Jaculabilis)
- Anthony Wang (@anthowan)
- Jörg Thalheim (@Mic92)
- Sandro (@SuperSandro2000)
- tomberek (@tomberek)
- Dmitry Bogatov (@KAction)
- Sizhe Zhao (@Prince213)
- jade (@lf-)
- Pierre-Etienne Meunier (@P-E-Meunier)
- Alexander Romanov (@ajlekcahdp4)
- Domagoj Mišković (@allrealmsoflife)
- Thomas Miedema (@thomie)
- Yannik Sander (@ysndr)
- Philipp Otterbein
- Dmitry Bogatov