## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Release 2.26.0 (2025-01-22)

- Support for relative path inputs #10089

  Flakes can now refer to other flakes in the same repository using relative paths, e.g.

      inputs.foo.url = "path:./foo";

  uses the flake in the `foo` subdirectory of the referring flake. For more information, see the documentation on the `path` flake input type.

  This feature required a change to the lock file format. Previous Nix versions will not be able to use lock files that have locks for relative path inputs in them.

- Flake lock file generation now ignores local registries #12019

  When resolving indirect flake references like `nixpkgs` in `flake.nix` files, Nix will no longer use the system and user flake registries. It will only use the global flake registry and overrides given on the command line via `--override-flake`.

  This avoids accidents where users have local registry overrides that map `nixpkgs` to a `path:` flake in the local file system, which then end up in committed lock files pushed to other users.

  In the future, we may remove the use of the registry during lock file generation altogether. It's better to explicitly specify the URL of a flake input. For example, instead of

      {
        outputs = { self, nixpkgs }: { ... };
      }

  write

      {
        inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
        outputs = { self, nixpkgs }: { ... };
      }

- `nix copy` supports `--profile` and `--out-link` #11657

  The `nix copy` command now has flags `--profile` and `--out-link`, similar to `nix build`. `--profile` makes a profile point to the top-level store path, while `--out-link` create symlinks to the top-level store paths.

  For example, when updating the local NixOS system profile from a NixOS system closure on a remote machine, instead of

      # nix copy --from ssh://server $path
      # nix build --profile /nix/var/nix/profiles/system $path

  you can now do

      # nix copy --from ssh://server --profile /nix/var/nix/profiles/system $path

  The advantage is that this avoids a time window where path is not a garbage collector root, and so could be deleted by a concurrent `nix store gc` process.

- `nix-instantiate --eval` now supports `--raw` #12119

  The `nix-instantiate --eval` command now supports a `--raw` flag, when used the evaluation result must be a string, which is printed verbatim without quotation marks or escaping.

- Improved `NIX_SSHOPTS` parsing for better SSH option handling #5181 #12020

  The parsing of the `NIX_SSHOPTS` environment variable has been improved to handle spaces and quotes correctly. Previously, incorrectly split SSH options could cause failures in commands like `nix-copy-closure`, especially when using complex SSH invocations such as `-o ProxyCommand="ssh -W %h:%p ..."`.

  This change introduces a `shellSplitString` function to ensure that `NIX_SSHOPTS` is parsed in a manner consistent with shell behavior, addressing common parsing errors.

  For example, the following now works as expected:

      export NIX_SSHOPTS='-o ProxyCommand="ssh -W %h:%p ..."'

  This update improves the reliability of SSH-related operations using `NIX_SSHOPTS` across Nix CLIs.

- Nix is now built using Meson

  As proposed in RFC 132, Nix's build system now uses Meson/Ninja. The old Make-based build system has been removed.

- Evaluation caching now works for dirty Git workdirs #11992

## Contributors

This release was made possible by the following 45 contributors:

- Anatoli Babenia (@abitrolly)
- Domagoj Mišković (@allrealmsoflife)
- Yaroslav Bolyukin (@CertainLach)
- bryango (@bryango)
- tomberek (@tomberek)
- Matej Urbas (@mupdt)
- elikoga (@elikoga)
- wh0 (@wh0)
- Félix (@picnoir)
- Valentin Gagarin (@fricklerhandwerk)
- Gavin John (@Pandapip1)
- Travis A. Everett (@abathur)
- Vladimir Panteleev (@CyberShadow)
- Ilja (@suruaku)
- Jason Yundt (@Jayman2000)
- Mike Kusold (@kusold)
- Andy Hamon (@andrewhamon)
- Brian McKenna (@puffnfresh)
- Greg Curtis (@gcurtis)
- Andrew Poelstra (@apoelstra)
- Linus Heckemann (@lheckemann)
- Tristan Ross (@RossComputerGuy)
- Dominique Martinet (@martinetd)
- h0nIg (@h0nIg)
- Eelco Dolstra (@edolstra)
- Shahar "Dawn" Or (@mightyiam)
- NAHO (@trueNAHO)
- Ryan Hendrickson (@rhendric)
- the-sun-will-rise-tomorrow (@the-sun-will-rise-tomorrow)
- Connor Baker (@ConnorBaker)
- Cole Helbling (@cole-h)
- Jack Wilsdon (@jackwilsdon)
- ‮rekcäH nitraM‮ (@dwt)
- Martin Fischer (@not-my-profile)
- John Ericson (@Ericson2314)
- Graham Christensen (@grahamc)
- Sergei Zimmerman (@xokdvium)
- Siddarth Kumar (@siddarthkay)
- Sergei Trofimovich (@trofi)
- Robert Hensing (@roberth)
- Mutsuha Asada (@momeemt)
- Parker Jones (@knotapun)
- Jörg Thalheim (@Mic92)
- dbdr (@dbdr)
- myclevorname (@myclevorname)
- Philipp Otterbein