Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

NixOS/experimental-nix-installer

An experimental fork of the Determinate Nix Installer to explore upstreaming.

NixOS/experimental-nix-installer.json
{
"createdAt": "2023-05-10T14:49:04Z",
"defaultBranch": "main",
"description": "An experimental fork of the Determinate Nix Installer to explore upstreaming.",
"fullName": "NixOS/experimental-nix-installer",
"homepage": "",
"language": "Rust",
"name": "experimental-nix-installer",
"pushedAt": "2025-11-22T00:12:23Z",
"stargazersCount": 111,
"topics": [],
"updatedAt": "2025-11-22T18:49:40Z",
"url": "https://github.com/NixOS/experimental-nix-installer"
}

An experimental fork of the Determinate Nix Installer, to play with upstreaming.

Section titled “An experimental fork of the Determinate Nix Installer, to play with upstreaming.”

Note, this is different from the Determinate Nix Installer, available at https://github.com/DeterminateSystems/nix-installer.

If you’re having a problem with installing Nix, this repository is almost certainly the wrong place to record issues.

Section titled “If you’re having a problem with installing Nix, this repository is almost certainly the wrong place to record issues.”

If you used the official Nix install scripts, report issues at https://github.com/NixOS/nix/issues.

If you used the Determinate Nix Installer, report issues at https://github.com/DeterminateSystems/nix-installer.


Crates.io CI Docs.rs License Discord

Determinate Nix Installer is the easiest and most reliable way to install [Nix]—as well as our longest-running project.

When we created Determinate Nix, we added support for it directly into the installer via the --determinate flag.

The installer works across a wide range of environments, including macOS, Linux, Windows Subsystem for Linux (WSL), SELinux, the Valve Steam Deck, and more. It can install either Nix or [Determinate Nix][det-nix] (with [flakes] enabled by default), it offers support for seamlessly [uninstalling Nix]!(#uninstalling), it enables Nix to survive [macOS upgrades][macos-upgrades], and [much more]!(#features).

The quickest way to have a great Nix experience is with [Determinate Nix][det-nix]. This one liner will do just that on any supported system:

Terminal window
curl -fsSL https://install.determinate.systems/nix | sh -s -- install --determinate

If you’d prefer upstream Nix:

Terminal window
curl -fsSL https://install.determinate.systems/nix | sh -s -- install

[!TIP] The best way to get Determinate Nix on macOS is with the macOS package.

Determinate Nix Installer successfully completes tens of thousands of installs every day in a number of environments, including [Github Actions]!(#as-a-github-action) and [GitLab]!(#on-gitlab):

PlatformMulti user?root onlyMaturity
Linux (x86_64 and aarch64)✓ (via [systemd])Stable
MacOS (x86_64 and aarch64)Stable (see note)
[Valve Steam Deck][steam-deck] (SteamOS)Stable
[Windows Subsystem for Linux][wsl] 2 (WSL2) (x86_64 and aarch64)✓ (via [systemd])Stable
[Podman] Linux containers✓ (via [systemd])Stable
[Docker] containersStable

You can install Determinate Nix on [GitHub Actions][actions] using [determinate-nix-action][determinate-nix-action]. Here’s an example configuration:

on:
pull_request:
push:
branches: [main]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/determinate-nix-action@v3
- name: Run `nix build`
run: nix build .

If you would rather use upstream Nix, use [nix-installer-action][nix-installer-action] !:

jobs:
build:
steps:
- uses: DeterminateSystems/nix-installer-action@main

The [determinate-nix-action] is updated and tagged for every Determinate release. For example, DeterminateSystems/determinate-nix-action@v3.5.2 will always install Determinate Nix v3.5.2.

Additionally, an extra tag on the major version is kept up to date with the current release. The DeterminateSystems/determinate-nix-action@v3 reference, for example, installs the most recent release in the v3.x.y series.

Determinate Nix Installer installs Nix by following a plan made by a planner. To review the available planners:

Terminal window
/nix/nix-installer install --help

Planners have their own options and defaults, sharing most of them in common. To see the options for Linux, for example:

Terminal window
/nix/nix-installer install linux --help

You can configure planners using environment variables or command arguments:

Terminal window
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
NIX_BUILD_GROUP_NAME=nixbuilder sh -s -- install --nix-build-group-id 4000
# Alternatively:
NIX_BUILD_GROUP_NAME=nixbuilder ./nix-installer install --nix-build-group-id 4000

See [Installer settings]!(#installer-settings) below for a full list of options.

Having problems with the installer? Consult our [troubleshooting guide]!(./docs/troubleshooting.md) to see if your problem is covered.

You can upgrade Nix by running:

Terminal window
sudo -i nix upgrade-nix

Alternatively, you can [uninstall]!(#uninstalling) and [reinstall]!(#install-nix) with a different version of the installer.

You can remove Nix installed by Determinate Nix Installer by running:

Terminal window
/nix/nix-installer uninstall

[GitLab CI][gitlab-ci] runners are typically [Docker] based and run as the root user. This means that systemd is not present, so you need to pass the --init none option to the Linux planner.

On the default [GitLab] runners, you can install Nix using this configuration:

test:
script:
- curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux --no-confirm --init none
- . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
- nix run nixpkgs#hello
- nix profile install nixpkgs#hello
- hello

If you are using different runners, the above example may need to be adjusted.

[!WARNING] When --init none is used, only root or users who can elevate to root privileges can run Nix:

Terminal window
sudo -i nix run nixpkgs#hello

If you don’t use [systemd], you can still install Nix by explicitly specifying the linux plan and --init none:

Terminal window
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install linux --init none

In [Docker]/[Podman] containers or [WSL2][wsl] instances where an init (like systemd) is not present, pass --init none.

For containers (without an init):

[!WARNING] When --init none is used, only root or users who can elevate to root privileges can run Nix:

Terminal window
sudo -i nix run nixpkgs#hello

[!WARNING] If you want to add a flake.nix, first declare a working directory (such as /src) in your Dockerfile. You cannot lock a flake placed at the docker image root (/) (see details). You would get a file '/dev/full' has an unsupported type during the docker build.

# append this to the below dockerfiles
WORKDIR /src
# now flakes will work
RUN nix flake init
RUN nix flake lock
# Dockerfile
FROM ubuntu:latest
RUN apt update -y
RUN apt install curl -y
RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \
--extra-conf "sandbox = false" \
--init none \
--no-confirm
ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin"
RUN nix run nixpkgs#hello
Terminal window
docker build -t ubuntu-with-nix .
docker run --rm -ti ubuntu-with-nix
docker rmi ubuntu-with-nix
# or
podman build -t ubuntu-with-nix .
podman run --rm -ti ubuntu-with-nix
podman rmi ubuntu-with-nix

For containers with a [systemd] init:

# Dockerfile
FROM ubuntu:latest
RUN apt update -y
RUN apt install curl systemd -y
RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \
--extra-conf "sandbox = false" \
--no-start-daemon \
--no-confirm
ENV PATH="${PATH}:/nix/var/nix/profiles/default/bin"
RUN nix run nixpkgs#hello
CMD [ "/bin/systemd" ]
Terminal window
podman build -t ubuntu-systemd-with-nix .
IMAGE=$(podman create ubuntu-systemd-with-nix)
CONTAINER=$(podman start $IMAGE)
podman exec -ti $CONTAINER /bin/bash
podman rm -f $CONTAINER
podman rmi $IMAGE

With some container tools, such as [Docker], you can omit sandbox = false. Omitting this will negatively impact compatibility with container tools like [Podman].

We strongly recommend first [enabling systemd][enabling-systemd] and then installing Nix as normal:

Terminal window
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install

If [WSLg][wslg] is enabled, you can do things like open a Linux Firefox from Windows on Powershell:

Terminal window
wsl nix run nixpkgs#firefox

To use some OpenGL applications, you can use [nixGL][nixgl] (note that some applications, such as blender, may not work):

Terminal window
wsl nix run --impure github:guibou/nixGL nix run nixpkgs#obs-studio

If enabling systemd is not an option, pass --init none at the end of the command:

[!WARNING] When --init none is used, only root or users who can elevate to root privileges can run Nix:

Terminal window
sudo -i nix run nixpkgs#hello
Terminal window
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install linux --init none

If you’d like to bypass the confirmation step, you can apply the --no-confirm flag:

Terminal window
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | \
sh -s -- install --no-confirm

[!TIP] If you’re looking for Determinate Nix, make sure to pass --determinate at the same time.

This is especially useful when using the installer in non-interactive scripts.

Existing Nix installation scripts do a good job but they are difficult to maintain.

Subtle differences in the shell implementations and tool used in the scripts make it difficult to make meaningful changes to the installer.

Determinate Nix installer has numerous advantages over these options:

  • It installs Nix with [flakes] enabled by default
  • It enables Nix to [survive macOS upgrades][survival-mode]
  • It keeps an installation receipt for easy [uninstallation]!(#uninstalling)
  • It uses [planners]!(#planners) to create appropriate install plans for complicated targets—plans that you can review prior to installation
  • It enables you to perform a best-effort reversion in the facing of a failed install
  • It improves installation performance by maximizing parallel operations
  • It supports an expanded test suite including “curing” cases (compatibility with Nix already on the system)
  • It supports SELinux and OSTree-based distributions without asking users to make compromises
  • It operates as a single, static binary with external dependencies such as [OpenSSL], only calling existing system tools (like useradd) when necessary
  • As a macOS remote build target, it ensures that Nix is present on the PATH

It has been wonderful to collaborate with other participants in the [Nix Installer Working Group][wg] and members of the broader community. The working group maintains a [foundation-owned fork of the installer][forked-installer].

While Determinate Nix Installer tries to provide a comprehensive and unquirky experience, there are unfortunately some issues that may require manual intervention or operator choices. See [this document]!(./docs/quirks.md) for information on resolving these issues:

  • [Using MacOS after removing Nix while nix-darwin was still installed, network requests fail]!(./docs/quirks.md#using-macos-after-removing-nix-while-nix-darwin-was-still-installed-network-requests-fail)

See [this guide]!(./docs/building.md) for instructions on building and distributing the installer yourself.

The Determinate Nix Installer is available as a standard [Rust] library. See [this guide]!(./docs/rust-library.md) for instructions on using the library in your own Rust code.

You can pin to a specific version of Determinate Nix Installer by modifying the download URL. Here’s an example:

Terminal window
VERSION="v0.6.0"
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix/tag/${VERSION} | \
sh -s -- install

To discover which versions are available, or download the binaries for any release, check the [Github Releases][releases].

Each installer version has an [associated supported nix version]!(src/settings.rs)—if you pin the installer version, you’ll also indirectly pin to the associated nix version.

You can also override the Nix version using --nix-package-url or NIX_INSTALLER_NIX_PACKAGE_URL= but doing this is not recommended since we haven’t tested that combination. Here are some example Nix package URLs, including the Nix version, OS, and architecture:

Differing from the upstream [Nix][upstream-nix] installer scripts:

  • In nix.conf:
    • the nix-command and flakes features are enabled
    • bash-prompt-prefix is set
    • auto-optimise-store is set to true (On Linux only)
    • always-allow-substitutes is set to true
    • extra-nix-path is set to nixpkgs=flake:nixpkgs
    • max-jobs is set to auto
    • upgrade-nix-store-path-url is set to https://install.determinate.systems/nix-upgrade/stable/universal, to prevent unintentional downgrades.
  • an installation receipt (for uninstalling) is stored at /nix/receipt.json as well as a copy of the install binary at /nix/nix-installer
  • nix-channel --update is not run, ~/.nix-channels is not provisioned
  • ssl-cert-file is set in /etc/nix/nix.conf if the ssl-cert-file argument is used.

Determinate Nix Installer provides a variety of configuration settings, some [general]!(#general-settings) and some on a per-command basis. All settings are available via flags or via NIX_INSTALLER_* environment variables.

These settings are available for all commands.

Flag(s)DescriptionDefault (if any)Environment variable
--log-directivesTracing directives delimited by commaNIX_INSTALLER_LOG_DIRECTIVES
--loggerWhich logger to use (options are compact, full, pretty, and json)compactNIX_INSTALLER_LOGGER
--verboseEnable debug logs, (-vv for trace)falseNIX_INSTALLER_VERBOSITY
Flag(s)DescriptionDefault (if any)Environment variable
--determinateInstalls [Determinate]NIX_INSTALLER_DETERMINATE
--explainProvide an explanation of the changes the installation process will make to your systemfalseNIX_INSTALLER_EXPLAIN
--extra-confExtra configuration lines for /etc/nix.confNIX_INSTALLER_EXTRA_CONF
--forceWhether the installer should forcibly recreate files it finds existingfalseNIX_INSTALLER_FORCE
--initWhich init system to configure (if --init none Nix will be root-only)launchd (macOS), systemd (Linux)NIX_INSTALLER_INIT
--nix-build-group-idThe Nix build group GID350 (macOS), 30000 (Linux)NIX_INSTALLER_NIX_BUILD_GROUP_ID
--nix-build-group-nameThe Nix build group namenixbldNIX_INSTALLER_NIX_BUILD_GROUP_NAME
--nix-build-user-countThe number of build users to create32NIX_INSTALLER_NIX_BUILD_USER_COUNT
--nix-build-user-id-baseThe Nix build user base UID (ascending) (NOTE: the first UID will be this base + 1)350 (macOS), 30000 (Linux)NIX_INSTALLER_NIX_BUILD_USER_ID_BASE
--nix-build-user-prefixThe Nix build user prefix (user numbers will be postfixed)_nixbld (macOS), nixbld (Linux)NIX_INSTALLER_NIX_BUILD_USER_PREFIX
--nix-package-urlThe Nix package URLNIX_INSTALLER_NIX_PACKAGE_URL
--no-confirmRun installation without requiring explicit user confirmationfalseNIX_INSTALLER_NO_CONFIRM
--no-modify-profileModify the user profile to automatically load Nix.trueNIX_INSTALLER_MODIFY_PROFILE
--proxyThe proxy to use (if any); valid proxy bases are https://$URL, http://$URL and socks5://$URLNIX_INSTALLER_PROXY
--ssl-cert-fileAn SSL cert to use (if any); used for fetching Nix and sets ssl-cert-file in /etc/nix/nix.confNIX_INSTALLER_SSL_CERT_FILE
--no-start-daemonStart the daemon (if not --init none)trueNIX_INSTALLER_START_DAEMON

You can also specify a planner with the first argument:

Terminal window
nix-installer install <plan>

Alternatively, you can use the NIX_INSTALLER_PLAN environment variable:

Terminal window
NIX_INSTALLER_PLAN=<plan> nix-installer install
Flag(s)DescriptionDefault (if any)Environment variable
--explainProvide an explanation of the changes the installation process will make to your systemfalseNIX_INSTALLER_EXPLAIN
--no-confirmRun installation without requiring explicit user confirmationfalseNIX_INSTALLER_NO_CONFIRM

You can also specify an installation receipt as the first argument (the default is /nix/receipt.json):

Terminal window
nix-installer uninstall /path/to/receipt.json
Flag(s)DescriptionDefault (if any)Environment variable
--out-fileWhere to write the generated plan (in JSON format)/dev/stdoutNIX_INSTALLER_PLAN_OUT_FILE
Flag(s)DescriptionDefault (if any)Environment variable
--no-confirmRun installation without requiring explicit user confirmationfalseNIX_INSTALLER_NO_CONFIRM

nix-installer self-test only takes [general settings]!(#general-settings).

[actions] !: https://github.com/features/actions [cache] !: https://docs.determinate.systems/flakehub/cache [det-nix] !: https://docs.determinate.systems/determinate-nix [determinate] !: https://docs.determinate.systems [determinate-flake] !: https://github.com/DeterminateSystems/determinate [determinate-nix-action] !: https://github.com/DeterminateSystems/determinate-nix-action [detsys] !: https://determinate.systems [docker] !: https://docker.com [enabling-systemd] !: https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/#how-can-you-get-systemd-on-your-machine [flakehub] !: https://flakehub.com [flakes] !: https://zero-to-nix.com/concepts/flakes [forked-installer] !: https://github.com/nixos/experimental-nix-installer [gitlab] !: https://gitlab.com [gitlab-ci] !: https://docs.gitlab.com/ee/ci [macos-upgrades] !: https://determinate.systems/posts/nix-survival-mode-on-macos/ [nix] !: https://nixos.org [nix-installer-action] !: https://github.com/DeterminateSystems/nix-installer-action [nixgl] !: https://github.com/guibou/nixGL [nixos] !: https://zero-to-nix.com/concepts/nixos [openssl] !: https://openssl.org [podman] !: https://podman.io [privacy] !: https://determinate.systems/policies/privacy [private-flakes] !: https://docs.determinate.systems/flakehub/private-flakes [releases] !: https://github.com/DeterminateSystems/nix-installer/releases [rust] !: https://rust-lang.org [selinux] !: https://selinuxproject.org [semver] !: https://docs.determinate.systems/flakehub/concepts/semver [steam-deck] !: https://store.steampowered.com/steamdeck [survival-mode] !: https://determinate.systems/posts/nix-survival-mode-on-macos [systemd] !: https://systemd.io [upstream-nix] !: https://github.com/NixOS/nix [wg] !: https://discourse.nixos.org/t/nix-installer-workgroup/21495 [wsl] !: https://learn.microsoft.com/en-us/windows/wsl/about [wslg] !: https://github.com/microsoft/wslg