## 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.19 (2023-11-17)

- The experimental `nix` command can now act as a shebang interpreter by appending the contents of any `#! nix` lines and the script's location into a single call.

- URL flake references now support percent-encoded characters.

- Path-like flake references now accept arbitrary unicode characters (except `#` and `?`).

- The experimental feature `repl-flake` is no longer needed, as its functionality is now part of the `flakes` experimental feature. To get the previous behavior, use the `--file/--expr` flags accordingly.

- There is a new flake installable syntax `flakeref#.attrPath` where the "." prefix specifies that `attrPath` is interpreted from the root of the flake outputs, with no searching of default attribute prefixes like `packages.<SYSTEM>` or `legacyPackages.<SYSTEM>`.

- Nix adds `apple-virt` to the default system features on macOS systems that support virtualization. This is similar to what's done for the `kvm` system feature on Linux hosts.

- Add a new built-in function `builtins.convertHash`.

- `nix-shell` shebang lines now support single-quoted arguments.

- `builtins.fetchTree` is now its own experimental feature, `fetch-tree`. This allows stabilising it independently of the rest of what is encompassed by `flakes`.

- The interface for creating and updating lock files has been overhauled:

  - `nix flake lock` only creates lock files and adds missing inputs now. It will never update existing inputs.

  - `nix flake update` does the same, but will update inputs.

    - Passing no arguments will update all inputs of the current flake, just like it already did.
    - Passing input names as arguments will ensure only those are updated. This replaces the functionality of `nix flake lock --update-input`
    - To operate on a flake outside the current directory, you must now pass `--flake path/to/flake`.

  - The flake-specific flags `--recreate-lock-file` and `--update-input` have been removed from all commands operating on installables. They are superseded by `nix flake update`.

- Commit signature verification for the `builtins.fetchGit` is added as the new `verified-fetches` experimental feature.

- `nix path-info --json` (experimental) now returns a JSON map rather than JSON list. The `path` field of each object has instead become the key in the outer map, since it is unique. The `valid` field also goes away because we just use `null` instead.

  - Old way:

        [
          {
            "path": "/nix/store/8fv91097mbh5049i9rglc73dx6kjg3qk-bash-5.2-p15",
            "valid": true,
            // ...
          },
          {
            "path": "/nix/store/wffw7l0alvs3iw94cbgi1gmmbmw99sqb-home-manager-path",
            "valid": false
          }
        ]

  - New way

        {
          "/nix/store/8fv91097mbh5049i9rglc73dx6kjg3qk-bash-5.2-p15": {
            // ...
          },
          "/nix/store/wffw7l0alvs3iw94cbgi1gmmbmw99sqb-home-manager-path": null,
        }

  This makes it match `nix derivation show`, which also maps store paths to information.

- When Nix is installed using the binary installer, in supported shells (Bash, Zsh, Fish) `XDG_DATA_DIRS` is now populated with the path to the `/share` subdirectory of the current profile. This means that command completion scripts, `.desktop` files, and similar artifacts installed via `nix-env` or `nix profile` (experimental) can be found by any program that follows the XDG Base Directory Specification.

- A new command `nix store add` has been added. It replaces `nix store add-file` and `nix store add-path` which are now deprecated.

- A new option `always-allow-substitutes` has been added.

  When set to `true`, Nix will always try to substitute a derivation, even if it has the `allowSubstitutes` attribute set to `false`.