Installing Nix on non-NixOS is a non-trivial problem that, sadly and by definition, can’t be solved by Nix itself. The official installer for Nix is a Bash script that’s been successfully used countless times in various settings. But we’ve felt for some time that the official installer has shortcomings that make Nix onboarding more challenging than it needs to be. Today we’re excited to announce a bold new solution: the Determinate Nix Installer.
The Determinate Nix Installer is an opinionated alternative to the current install scripts and supports several platforms, including macOS (Intel, ARM), Linux (Intel, ARM), and Windows via WSL2. It also works automatically inside Docker and Podman containers and even supports SteamOS on Valve’s Steam Deck.
The opinionated part is that the Determinate Nix Installer installs Nix with Nix flakes and the unified CLI enabled in nix.conf
. Although flakes and the unified CLI remain experimental features of Nix, we’re confident that new users should adopt them now and that more seasoned Nix users should start making the transition.
The Determinate Nix Installer also stores an installation receipt (for uninstalling) at/nix/receipt.json
and a copy of the install binary at /nix/nix-installer
.
You can give it a try by running the following in a terminal:
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
Motivations
The current Nix install scripts do an excellent job but are challenging to maintain. Subtle differences in the shell implementations and specific characteristics of bash scripts make it difficult to make meaningful changes to the installer.
We began discussing a vision for a new installer internally. Later, we saw the installer discussion here on the NixOS Discourse and enthusiastically joined the Nix installer working group.
We take the core tenets of Nix very seriously. True to our name, we want to make software systems as determinate as possible. Making Nix installation robust, seamless, and trivially reversible is a crucial part of that. We wanted to experiment with the idea of an installer in a more structured language and see if this could be a worthwhile alternative. This release is a significant step in that direction.
Above all, we want our installer to work in any environment where Nix can work its magic, including in continuous integration and deployment environments. We provide a GitHub Action for the Determinate Nix Installer but it should be adaptable to any CI system.
So far, our explorations have been fruitful, so we wanted to share what we have and seek broader feedback. We appreciate that it must prove itself in various scenarios and we’re eager to collaborate with the Nix community to build that confidence.
You can read more on the rationale for the Determinate Nix Installer on our blog. We welcome feedback and contributions from the Nix community via the project’s GitHub repository.
We’ve licensed it under the GNU Lesser General Public License v2.1—the same license for Nix itself—which should provide little obstruction to eventually making it the official installer if that’s what the community desires. We’ve also released it as a Rust library that anyone can use.
All that remains is to thank everyone who collaborated on this project and provided feedback to help us get to where we are today.