Fact-checked by Grok 2 weeks ago

Nix (package manager)

Nix is a purely functional package manager for Unix-like systems that treats software packages as immutable values, similar to those in functional programming languages like Haskell, enabling reproducible builds, declarative configurations, and reliable deployments without traditional dependency conflicts. Developed by Eelco Dolstra during his PhD research at Utrecht University, Nix originated as a research project around 2003, with its core concepts outlined in a 2004 conference paper and further detailed in Dolstra's 2006 thesis on purely functional software deployment. The tool builds packages in isolated environments to prevent undeclared dependencies and ensure bit-for-bit identical outputs across different machines, a feature that underpins its use in creating consistent development setups, minimal container images, and entire operating system configurations. At its core, Nix uses the Nix Expression Language (often abbreviated as Nix language), a domain-specific language for defining packages and system configurations in a declarative manner, allowing users to specify desired states rather than imperative installation steps. This approach facilitates atomic upgrades and rollbacks, as multiple versions of packages can coexist without interfering, stored in a unique directory structure under /nix/store that hashes package contents for integrity and provenance tracking. Nix powers the Nixpkgs repository, a vast collection exceeding 120,000 packages as of 2025, which serves as the primary software source for the NixOS Linux distribution—a fully declarative operating system built atop Nix—and supports cross-platform installations on Linux, macOS, and Windows via subsystems like WSL. Nix's design promotes reliability by enforcing purity in builds, meaning external influences like network access or mutable state are restricted during compilation, which mitigates issues common in traditional package managers such as partial upgrades or environment pollution. It also integrates with modern workflows through features like flakes, an experimental extension introduced in 2021 for more structured and reproducible project definitions, enhancing reproducibility in continuous integration and multi-user environments. Beyond packaging, Nix has influenced broader ecosystem tools, including Guix (a functional package manager for GNU systems) and deployments in cloud-native and DevOps scenarios, underscoring its role in advancing safe, policy-free software management.

Overview

Core Principles

Nix operates on a purely functional package management paradigm, treating packages as immutable values akin to those in functional programming languages. In this approach, each package is conceptualized as a pure function that takes dependencies as inputs and produces built artifacts as outputs, ensuring that once built, a package never changes. This functional model eliminates side effects during construction, promoting reproducibility across different environments and machines. A key aspect of Nix is its declarative specification of system configurations, where users describe the desired state of their environment in high-level configuration files rather than issuing a sequence of imperative commands. These specifications, written in the Nix expression language, define the exact set of packages and their versions needed, allowing the system to compute and realize the configuration automatically. This declarative method contrasts with traditional package managers by focusing on "what" the system should be, rather than "how" to achieve it step-by-step, thereby reducing errors from command sequencing. Build purity is enforced in Nix to guarantee deterministic outcomes, achieved by isolating build environments and requiring complete declaration of all inputs, including dependencies and build tools. Inputs are hashed cryptographically, creating unique identifiers for each derivation, which prevents impurities such as undeclared external influences from affecting the build process. As a result, rebuilding the same Nix expression under identical conditions always yields bit-for-bit identical outputs, a property essential for reliable distribution and verification. Nix supports atomic upgrades and rollbacks by generating generations of the system or user environment, where each upgrade creates a new generation without modifying existing ones. This allows seamless switching between generations—such as reverting to a previous state in case of issues—without partial failures or dependency conflicts disrupting the system. The mechanism ensures that changes are applied transactionally, maintaining consistency throughout the process. Multi-version coexistence is a fundamental principle in Nix, enabling multiple versions of the same package to be installed and used concurrently without interference. Packages are stored in the Nix store, a centralized directory using hash-based paths to isolate them uniquely based on their build dependencies. This isolation allows users and applications to reference specific versions independently, supporting diverse workflows such as testing or maintaining legacy software alongside the latest releases.

Key Features

Nix's key features provide practical benefits for developers and system administrators, emphasizing reliability, efficiency, and portability in package management. These features build on its declarative approach by enabling consistent environments across diverse setups, reducing deployment errors, and optimizing resource use. Central to Nix is its support for reproducible builds, where every package derivation, defined through Nix expressions, produces identical binary outputs given the same inputs, ensuring bit-for-bit reproducibility across different machines and over time. This determinism is achieved by hashing all inputs, including source code, dependencies, and build configurations, stored uniquely in the /nix/store directory. Another core feature is isolated dependencies, which prevents conflicts by building packages in sandboxed environments such as chroots on Linux or similar mechanisms on other platforms. This isolation ensures that packages do not rely on undeclared host system components, allowing multiple versions of the same software to coexist without interference—for instance, different variants of Python or GCC can be installed side-by-side for various projects. As a result, users avoid the "DLL hell" common in traditional package managers, promoting safer and more predictable software installations. Nix also implements garbage collection to manage storage efficiently, automatically identifying and removing unused packages from the Nix store based on references in user profiles and running processes. Commands like nix-collect-garbage scan for paths not reachable from active profiles, reclaiming disk space without manual intervention, which is particularly valuable in environments with frequent package updates or experimentation. To enhance performance, Nix supports binary caches, public repositories like cache.nixos.org that distribute pre-compiled binaries for verified derivations. When installing or building a package, Nix first checks the cache for a matching hash; if found, it downloads the binary instead of compiling from source, significantly reducing build times—often from hours to minutes for complex software like web browsers or compilers. This feature is enabled by default in channels and can be extended with custom caches for private or enterprise use. Finally, Nix offers cross-platform support, running natively on Unix-like systems such as Linux distributions and macOS, with support for Windows via the Windows Subsystem for Linux (WSL). This portability allows developers to maintain consistent package environments across operating systems, facilitating workflows in heterogeneous teams or cloud setups.

History

Origins and Early Development

Nix was invented in 2003 by Eelco Dolstra as part of his PhD research at Utrecht University in the Netherlands. The project emerged from Dolstra's exploration of purely functional models for software deployment, aiming to resolve longstanding problems in traditional package management systems, such as "dependency hell"—where conflicting library versions or inconsistent installations lead to brittle and unpredictable software environments. Traditional managers like those in Debian or RPM-based distributions often modify shared system resources in place, making it difficult to maintain multiple versions of packages or roll back changes without risking system instability. Dolstra's approach drew inspiration from functional programming principles to treat packages as immutable values, ensuring isolated and verifiable deployments. The initial implementation focused on Linux systems, serving as a proof-of-concept for reproducible builds through cryptographic hashing of inputs and outputs. This allowed Nix to guarantee that identical source code and dependencies would always produce the same binary, regardless of build environment variations—a stark contrast to conventional tools prone to nondeterminism from timestamps or compiler differences. The first public presentation and release occurred in 2004 at the Large Installation System Administration (LISA) conference, where Dolstra and collaborators detailed Nix's architecture for safe, policy-free deployment on Unix-like systems. Early versions emphasized command-line tools for building and managing packages, with support for atomic upgrades and side-by-side installations of variants, but remained experimental and tied to academic validation. By 2015, as community involvement grew, the NixOS Foundation was established as a Dutch non-profit to steward the project, marking a transition from Dolstra's academic origins to broader, community-driven development. This shift provided legal and financial structure for infrastructure maintenance, funding, and governance, enabling sustained evolution beyond university resources. However, early adoption faced hurdles, including a steep learning curve due to the novel Nix expression language and the absence of graphical user interfaces, which limited accessibility for non-expert users accustomed to simpler, imperative package managers. These challenges contributed to modest initial uptake, primarily among researchers and developers interested in reproducible systems.

Major Milestones

The initial release of NixOS version 1.0 in May 2012 marked a significant milestone, with the first stable branch, version 13.10, arriving in December 2013. NixOS became the first major Linux distribution fully built around the Nix package manager, introducing declarative configuration for entire systems including the kernel, services, and user environments. This enabled atomic upgrades, rollbacks, and reproducible system states, extending Nix's principles from package management to holistic OS deployment. Stable channels, introduced with the first stable NixOS release in 2013, provided a reliable mechanism for delivering verified updates to Nixpkgs and NixOS configurations, enhancing end-user accessibility by allowing subscription to curated, binary-cached package sets without manual tracking of Git revisions. Channels distinguished between stable branches, updated biannually, and unstable ones for cutting-edge features, streamlining adoption across diverse environments. Nix 2.0, released on February 22, 2018, brought key enhancements, including improved multi-user support and the nix copy command for efficient binary distribution. These changes addressed scalability issues in large deployments. Flakes, an advanced reproducibility tool, were first proposed at NixCon 2019. Flakes were implemented as an experimental feature in Nix 2.4, released on November 1, 2021, enabling locked dependencies and standardized project outputs to boost reproducibility in development and CI/CD pipelines. Subsequent releases from 2023 to 2025, including Nix 2.20 (January 2024) and Nix 2.24 (July 2024), refined flake handling with faster evaluation and better integration for non-NixOS systems via tools like devshells and home-manager, reducing friction for users on distributions like Ubuntu or macOS. In May 2024, Lix was announced as an independent fork of Nix (based on version 2.18), developed by community members in response to concerns over governance, contributor experience, and project direction under the core team. Lix aims to maintain compatibility with nixpkgs while prioritizing stability and usability. A pivotal 2025 development was the Fedora Engineering and Steering Committee's approval of the /nix top-level directory on October 14, facilitating official Nix packaging in Fedora repositories and broadening accessibility for non-NixOS Linux users without custom installations. This integration resolved longstanding filesystem policy hurdles, promoting Nix as a cross-distribution tool for reproducible builds.

Technical Implementation

Core Components

The Nix store serves as the central, immutable repository for all packages and their dependencies in the Nix package manager. By default located at /nix/store, it organizes content into unique subdirectories identified by cryptographic hashes followed by the package name, such as /nix/store/b6gvzjyb2pg0kjfwrjmg1vfhh54ad73z-firefox-33.1. These hashes are derived from the build inputs and dependencies, ensuring that identical builds produce the same path and enabling reproducibility and isolation across multiple package versions. Profiles provide a mechanism for managing user or system-wide environments by creating directories of symbolic links to paths in the Nix store. These profiles, often referred to as user environments, allow users to maintain distinct sets of installed packages without conflicts, supporting atomic upgrades and rollbacks through versioned generations. For instance, the default user profile at ~/.nix-profile or /nix/var/nix/profiles/per-user/<username> points to the active set of symlinks, enabling seamless switching between configurations via commands like nix-env --switch-generation. Channels facilitate the subscription to remote collections of Nix expressions, such as the nixpkgs repository, streamlining access to updated packages without manual downloads. Users subscribe to a channel by adding its URL (e.g., https://nixos.org/channels/nixpkgs-unstable) using nix-channel --add, after which updates are fetched and applied with nix-channel --update, creating a new profile generation that incorporates the latest expressions. This process caches tarballs containing the Nix expressions, with configurable time-to-live settings to balance freshness and performance. The Nix daemon manages build operations in multi-user installations, contrasting with single-user mode where builds execute directly under the invoking user. In multi-user mode, the daemon runs as a privileged service (e.g., under root), receiving build requests via a socket at /nix/var/nix/daemon-socket/socket and executing them under isolated build users (e.g., nixbld1 to nixbld32) to prevent unauthorized modifications to the shared store. Single-user mode, lacking a daemon, grants the installing user full control but limits sharing across users due to direct store access. This daemon-based approach enhances security in shared environments by enforcing build isolation and privilege separation.

Nix Expression Language

The Nix expression language is a domain-specific, purely functional language designed for defining packages and configurations within the Nix package manager. Rooted in lambda calculus, it supports first-class functions via lambda abstractions (e.g., x: x + 1) and beta-reduction for applications, ensuring side-effect-free computations where values remain immutable and outputs are deterministic given the same inputs. Its syntax resembles JSON for data structures like attribute sets (e.g., { name = "example"; version = "1.0"; }), but extends this with functional elements such as anonymous functions and higher-order operations, facilitating composable and declarative definitions. This design promotes reproducibility by isolating dependencies through cryptographic hashing of inputs. Central to the language are key constructs for building and customizing packages. Derivations serve as build recipes, represented as attribute sets with mandatory fields like name (package identifier), version (release number), src (source path or URL), and buildInputs (list of dependencies); for instance:
nix
stdenv.mkDerivation {
  name = "hello-2.10";
  src = fetchurl {
    url = "http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz";
    sha256 = "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i";
  };
  buildInputs = [ gcc ];
}
This produces a store path upon evaluation. Let/in expressions provide scoping for local bindings, equivalent to syntactic sugar over recursive sets, as in let port = 80; in { serverPort = port; }, allowing reuse without global pollution. Overrides customize packages via operators like // for attribute set merging (right-biased union) or function arguments, enabling targeted modifications such as { config = { enableFeature = true; }; } // { config.enableFeature = false; }. The evaluation model relies on lazy evaluation, computing expressions only when required, which efficiently manages large dependency graphs by avoiding evaluation of unused branches and sharing common subexpressions through memoization. This call-by-need strategy, akin to normal-order reduction in lambda calculus, ensures confluent results for finite expressions and supports weak head normal form for partial computations. Recursion is handled via fixed-point combinators, notably the rec keyword for mutually recursive attribute sets (e.g., rec { x = y; y = x + 1; }), allowing self-referential definitions essential for complex configurations without infinite loops in well-formed cases. The type system is informal and dynamically checked, lacking static type inference but enforcing structure through runtime validation and assertions (e.g., assert condition; value). Core types include null, booleans, integers, strings (with interpolation like "path: ${./file.nix}"), lists (e.g., [ 1 2 3 ]), attribute sets, functions, paths (e.g., ./source), and derivations, promoting flexibility while relying on user-defined checks for consistency. This approach balances expressiveness with the language's focus on deployment correctness over compile-time rigor.

Build and Evaluation Process

The evaluation phase of Nix begins with parsing Nix expressions, which are written in the Nix language, into abstract syntax trees (ASTs) represented in ATerm format. This parsing step ensures syntactic correctness before proceeding to evaluation. The evaluator then reduces the AST by applying reduction rules to the head of the expression—its outermost part—recursively simplifying constructs like function applications, attribute selections, and derivations until a normal form is reached, typically producing one or more derivations that describe build tasks. A derivation is the core output of this evaluation, created via the built-in derivation function, which takes an attribute set specifying build details such as the builder script, inputs, outputs, and environment variables. These attributes are serialized into a store derivation file (with a .drv extension) during evaluation, serving as a blueprint for the build without executing it. The process enforces purity by disallowing impure operations like network access during evaluation, ensuring that the same expression always yields identical derivations across environments. Once derivations are produced, Nix computes a unique hash for each to determine its store path in the Nix store, typically under /nix/store. For input-addressed derivations, the hash is a base-32 encoded, 160-bit truncated SHA-256 of a fingerprint derived from the derivation's attributes, including input paths, builder, and arguments; this ensures that identical derivations map to the same path, promoting reproducibility. Fixed-output derivations, often used for fetching sources, employ a content-addressed hash based on the expected output's SHA-256 (e.g., via NAR serialization for file trees), guaranteeing that the store path reflects the actual content without depending on build-time variations. To execute a build, Nix isolates the process in a sandbox, primarily on Linux, by creating private namespaces for PID, mount, network, IPC, and UTS, which restrict the builder to a controlled environment. Essential system paths like /proc, /dev, and /bin/sh are bind-mounted into the sandbox, along with declared inputs from the Nix store, while preventing access to undeclared files, network resources, or other host system elements unless explicitly allowed via configuration. This sandboxing, enabled by default on supported platforms, enforces reproducibility by ensuring builds depend solely on specified inputs, with fallbacks to relaxed modes for certain derivations like fixed-output ones. Prior to initiating a local build, Nix attempts substitution from binary caches to optimize efficiency. It queries configured substituters—such as the default https://cache.nixos.org/—in priority order, downloading pre-built outputs if a valid NAR (Nix Archive) matches the derivation's hash and is signed by a trusted public key. If no suitable substitute is found or verification fails, Nix falls back to performing the build locally within the sandbox; this mechanism reduces build times significantly for common packages while maintaining the option to disable substitution entirely for source-only workflows.

Nixpkgs

Structure and Organization

Nixpkgs serves as the primary package collection for the Nix package manager, structured as a monorepo hosted on GitHub that encompasses Nix expressions for building software packages and NixOS modules. This single Git repository, as of 2025, contains over 120,000 packages, enabling a centralized and version-controlled approach to package management. The repository's pkgs/ directory organizes these packages into a hierarchical structure by categories, such as servers/ for web servers like nginx and apache-httpd, desktops/ for environments like GNOME and KDE, and language-specific subdirectories under development/ for tools like Python, Ruby, and Haskell. This categorization facilitates navigation and maintenance by grouping related software logically within subdirectories, with top-level aggregation handled by pkgs/top-level/all-packages.nix. At the repository's root, the default.nix file acts as the primary entry point, importing and evaluating the entire package set into a large attribute set accessible via Nix expressions such as pkgs.hello or pkgs.python3. This evaluation process constructs derivations—Nix's representation of build specifications—from the organized package definitions in pkgs/. To enable customization without altering core files, Nixpkgs employs an overlay system, where users define Nix functions that layer modifications atop the base package set, such as adding new packages or overriding existing ones. Overlays are applied sequentially in a fixed-point composition, preserving the immutability of the underlying repository while allowing reproducible extensions. Nixpkgs further structures its releases through channels and branches to balance innovation with stability. The nixos-unstable channel tracks the master branch for cutting-edge updates, while stable release branches like nixos-25.05 provide pinned commits that receive only security fixes and bug patches post-release. These channels, built and distributed via the Hydra continuous integration system, pin specific Git revisions to ensure reliable, reproducible package versions across users and deployments.

Maintenance and Contributions

The maintenance of Nixpkgs relies on a structured governance model to manage updates and contributions effectively. Major changes, such as the addition of new packages or significant modifications to existing ones, are handled through the Request for Comments (RFC) process, which fosters community consensus and documentation of decisions. This process begins with a proposal submitted to the NixOS Discourse forum, where it is discussed, refined by assigned shepherds, and potentially escalated to a vote by the RFC Steering Committee if consensus is not reached organically. For instance, RFCs have been used to standardize updater scripts for package maintenance and to enforce formatting standards across the repository. By requiring broad input, the RFC process helps prevent fragmented development and ensures changes align with the project's goals of reproducibility and reliability. The Nixpkgs manual serves as the primary resource for contributors, offering detailed guidelines on writing derivations—the core units that define how packages are built and installed. It emphasizes best practices such as using stdenv.mkDerivation for standard builds, overriding attributes with overrideAttrs to customize packages without altering upstream sources, and handling dependencies declaratively to maintain purity. For cross-compilation, the manual outlines support for multiple platforms like x86_64-linux and aarch64-linux, recommending the use of cross-compilation toolchains and testing across architectures to ensure portability. Security updates are addressed through protocols for patching vulnerabilities, including the declaration of meta.knownVulnerabilities in package metadata to alert users, and procedures for backporting fixes to stable branches while minimizing rebuilds. These guidelines promote consistent, secure, and efficient contributions, with maintainers encouraged to review and merge pull requests via the GitHub repository. Automated testing is integral to Nixpkgs maintenance, primarily facilitated by the Hydra continuous integration system, which builds and tests packages across diverse platforms and configurations. Hydra evaluates Nix expressions to produce derivations, executing builds in isolated environments to verify correctness and generate binary caches for efficient distribution. Key jobsets, such as nixos:trunk-combined for the master branch, perform comprehensive stability checks, including NixOS module tests and package evaluations on Linux architectures, flagging failures to prevent regressions from merging. This setup ensures that contributions are vetted for reproducibility before inclusion, with Hydra's declarative job definitions allowing for scalable testing of the entire repository. Nixpkgs follows a bi-annual release cadence for stable channels, typically branching off in late April or May and late October or November, culminating in releases like 25.05 on May 23, 2025. Stable releases receive ongoing support for six to seven months, focusing on bug fixes and security backports to affected packages without introducing new features. This schedule balances innovation in the unstable branch with reliability for production users, with the Nixpkgs release team coordinating branch-offs, freeze periods, and final validations through Hydra to maintain quality.

Usage

Installation and Setup

Nix can be installed in single-user or multi-user mode, with the binary distribution providing the most straightforward approach on supported platforms. The single-user installation runs Nix without requiring root privileges, setting up the /nix/store directory for immutable packages and managing user environments via profiles in /nix/var/nix/profiles. This mode is suitable for individual users and is the default on systems without systemd or when explicitly requested. To perform a single-user installation on Linux or macOS, execute the following command in a terminal:
sh <(curl -L https://nixos.org/nix/install) --no-daemon
This script downloads the latest Nix release, extracts it to /nix, configures the shell profile (e.g., adding source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh to .bashrc or .zshrc), and makes Nix available immediately. On Linux, it supports both glibc-based distributions (e.g., Ubuntu, Fedora) and musl-based ones (e.g., Alpine), though SELinux-enabled systems like Fedora may require additional policy adjustments for single-user mode. On macOS, it works on current versions including macOS 26 Tahoe as of November 2025, but users may encounter a group creation error during setup on versions like 15 Sequoia, which can be resolved by manually creating the nixbld group and users as outlined in the official issue tracker. For Windows, Nix is not natively supported but can be installed via Windows Subsystem for Linux (WSL), using the single-user mode if systemd is disabled in the WSL distribution. The multi-user installation requires root privileges and sets up a shared Nix daemon for concurrent builds, improving efficiency on multi-user systems. It creates a system-wide /nix/store, daemon users (nixbld1 through nixbld30), and integrates with the system's init system—systemd on Linux or launchd on macOS—for managing the nix-daemon service. This mode is recommended for servers or shared environments and is auto-detected on Linux with systemd or on macOS. To install in multi-user mode, run:
sh <(curl -L https://nixos.org/nix/install) --daemon
If sudo access is needed to create /nix, the script will prompt for it; on read-only root filesystems like macOS APFS volumes, it handles mounting a writable /nix automatically. Platform support mirrors single-user mode, with glibc/musl on Linux and full compatibility on current macOS versions including 26 Tahoe as of November 2025 (with the same group fix if needed for earlier versions like 15 Sequoia); for WSL on Windows, enable systemd in the WSL config (e.g., via .wslconfig) before using multi-user mode. After installation, verify Nix by running nix --version, which outputs the installed version (e.g., nix (Nix) 2.32.4 as of November 2025). To set up initial channels for accessing packages, add the unstable channel with nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs followed by nix-channel --update, enabling subsequent package installations. The shell profile is automatically sourced on new terminals, linking the user's environment to the Nix profile. Uninstallation involves removing the /nix directory and cleaning up shell configurations. As root (or with sudo), execute rm -rf /nix to delete the store and all related files; for multi-user setups, also stop and disable the daemon service (e.g., systemctl stop nix-daemon on Linux or launchctl unload on macOS). Then, edit the user's shell profile files (e.g., ~/.bashrc, ~/.zshrc) to remove Nix-related lines, such as the source command for the profile script, and restart the shell or log out and back in to apply changes. This process fully removes Nix without affecting the host system.

Basic Commands

The nix-env command provides imperative package management for user environments in Nix, allowing users to install, query, and manage software packages directly from the command line without declarative configurations. User environments are synthesized views of packages stored in the Nix store, organized into versioned profiles that enable rollbacks and multiple generations. For installation, the -iA flag specifies packages by attribute path from a Nix expression, such as nix-env -iA nixpkgs.hello to add the Hello package from the nixpkgs channel, which creates a new profile generation with symlinks to the built store paths. Querying installed packages uses -q, as in nix-env -q, listing all items in the current profile along with their names and versions. Rollbacks are handled via -r or --rollback, reverting to the previous profile generation, e.g., nix-env --rollback, which switches the active symlink without altering the store. The nix-shell command facilitates creating temporary, isolated shell environments with specific dependencies, ideal for development workflows where a reproducible build context is needed without permanent installation. It evaluates a Nix expression to build its dependencies—such as libraries and tools—but skips building the target derivation itself, then launches an interactive shell with environment variables set accordingly, sourcing the standard environment setup from the store. A common usage is nix-shell -p hello to enter a shell with the Hello package available in $PATH, or providing a shell.nix file defining dependencies like nix-shell for a project-specific setup. For purity, the --pure flag clears inherited environment variables, ensuring a clean slate, while --packages or -p allows listing multiple packages, e.g., nix-shell --packages sqlite xorg.libX11. Building derivations from Nix expressions is performed with the nix-build command, which instantiates the expression into store derivations, realizes them by building or substituting from a binary cache, and outputs the results to unique paths in the Nix store, creating a result symlink in the current directory for easy access. If no expression path is provided, it defaults to default.nix in the working directory; for example, nix-build '<nixpkgs>' -A hello builds the Hello package from the nixpkgs channel, linking /nix/store/...-hello as result. Multiple outputs or derivations produce numbered symlinks like result-2, and the command supports remote tarballs via URLs, such as nix-build https://github.com/NixOS/nixpkgs/archive/master.tar.gz -A hello, ensuring the symlink acts as a garbage collection root until removed. Channels, which provide access to remote Nix expressions like the nixpkgs repository, are managed using the nix-channel command to fetch updates and maintain subscribed sources. The --add operation subscribes to a new channel, e.g., nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixpkgs, followed by --update to download the latest tarball and update the channel profile symlink in $NIX_PATH. Listing channels uses --list, displaying subscribed URLs and names, while --remove unsubscribes, as in nix-channel --remove nixpkgs. Updating specific or all channels with --update [names] pulls revisions, enabling access to new package versions via subsequent nix-env or nix-build commands; rollbacks to prior generations are possible with --rollback. Several flags enhance usability across these commands, such as --dry-run to simulate operations without executing builds or profile changes, allowing preview of impacts like nix-env -iA nixpkgs.hello --dry-run. Parallelization is controlled by -j or --max-jobs, specifying the number of concurrent build jobs, e.g., nix-build -j4 '<nixpkgs>' -A hello to utilize four cores for faster realization of store paths.

Declarative Configurations

Declarative configurations in Nix enable users to define reproducible package environments through Nix expressions, typically stored in files like default.nix or manifest.nix, which can be applied atomically to user profiles. This approach contrasts with imperative commands by allowing version-controlled specifications that ensure consistency across machines and over time. By specifying packages and their dependencies in a declarative manner, users can generate environments that are isolated and rollback-capable, leveraging Nix's store for immutability. Profile manifests provide a foundational method for declarative user environments. A manifest file, such as manifest.nix, lists desired packages in a Nix expression, for example:
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
buildEnv {
  name = "my-profile";
  paths = [ hello curl ];
}
To apply this to the default user profile, the command nix-env -p /nix/var/nix/profiles/per-user/$USER/profile -f manifest.nix -r installs or updates the environment by replacing the existing profile, ensuring all specified packages are present while removing others. This process creates a new profile generation, allowing rollbacks via nix-env --rollback if needed. Manifests can be generated from existing profiles using nix-env --query --json | nix-instantiate --expr '{ ... }', facilitating migration from imperative setups. Home Manager extends declarative configurations to comprehensive user environments, integrating seamlessly with Nix to manage not only packages but also dotfiles, programs, and services. Users define their setup in a home.nix file using Nix expressions, such as:
{ config, pkgs, ... }:
{
  home.username = "user";
  home.packages = [ pkgs.htop pkgs.git ];
  programs.git = {
    enable = true;
    userName = "User Name";
    userEmail = "[email protected]";
  };
}
Activating the configuration with home-manager switch builds and symlinks the environment to ~/.nix-profile, handling dotfiles like .gitconfig and services such as GPG agents declaratively. This tool supports reproducibility across hosts and includes rollback features, making it suitable for multi-user or cross-system setups without requiring a full NixOS installation. To achieve reproducibility in declarative setups, especially for CI/CD pipelines, Nix users pin specific versions of Nixpkgs by importing a fixed revision via fetchTarball. For instance:
let
  pinnedPkgs = import (fetchTarball {
    url = "https://github.com/NixOS/nixpkgs/archive/06278c77b5d162e62df170fec307e83f1812d94b.tar.gz";
    sha256 = "sha256-...";  # Computed hash
  }) {};
in
pinnedPkgs.hello
This locks the package set to a known commit, verifiable via status.nixos.org, preventing drift from the unstable channel and ensuring identical builds across environments. Fixed-output derivations complement pinning by guaranteeing that fetches (e.g., source tarballs) produce the same hash, further bolstering pipeline reliability. For system-wide declarations on non-NixOS systems, Nix supports distribution of environments using nix-copy-closure, which transfers store paths and their dependency closures to remote machines over SSH. After installing Nix on the target system, a declarative profile built locally (e.g., via a manifest) can be copied with nix-copy-closure --to user@remote-host /nix/store/...-user-environment, enabling shared access to the configuration without rebuilding. This method requires SSH key authentication and a configured Nix store on the remote, allowing basic system-level package deployment while maintaining Nix's isolation principles.

Ecosystem

NixOS Integration

NixOS, a Linux distribution built around the Nix package manager, extends Nix's declarative and reproducible principles to full-system configuration and management. The core of this integration is the file /etc/nixos/configuration.nix, which serves as the root declarative specification for the entire operating system, encompassing hardware configurations, user accounts, enabled services, and installed packages. This file is written in the Nix expression language and evaluates to an attribute set that defines the system's state, allowing administrators to specify components such as file systems (e.g., fileSystems."/".device = "/dev/sda1";), user definitions (e.g., users.users.example = { isNormalUser = true; };), service activations (e.g., services.sshd.enable = true;), and global packages (e.g., environment.systemPackages = [ pkgs.vim ];). The NixOS modules system provides a modular framework for composing complex configurations from reusable components, enabling fine-grained control over system features without monolithic files. Each module is a Nix expression that declares options (e.g., options.services.httpd.enable = mkEnableOption "Apache HTTP server";) and defines their implications, such as generating configuration files or starting services upon enabling. For instance, enabling Apache involves setting services.httpd.enable = true;, which imports the relevant module and automatically handles dependencies like package installation and firewall rules, while PostgreSQL can be activated similarly via services.postgresql.enable = true;. Modules support imports for extensibility (e.g., imports = [ ./custom-module.nix ];) and merging of overlapping definitions, with tools like mkForce resolving conflicts to ensure consistent evaluation. System activation in NixOS is atomic, ensuring that changes are applied as a cohesive unit to maintain system integrity. The command nixos-rebuild switch evaluates the configuration, builds necessary derivations, activates the new system generation by updating symlinks, restarting affected services, and integrating with the boot loader—all without partial states that could lead to inconsistencies. This process preserves previous generations in the Nix store, allowing seamless rollbacks by selecting an earlier boot entry. Boot loader support, such as GRUB (configured via boot.loader.grub.enable = true; boot.loader.grub.device = "/dev/sda";) or systemd-boot for UEFI systems (boot.loader.systemd-boot.enable = true;), automatically generates menu entries for each generation, facilitating recovery from failed updates via the boot menu. NixOS installation leverages declarative principles through live ISO images that boot into a minimal environment for generating and applying an initial configuration.nix. Official graphical and minimal ISO images, available for download, support deployment on bare metal or virtual machines by partitioning disks, mounting file systems, and executing nixos-install to build and activate the configuration from the live session. This process ensures reproducibility, as the installer uses Nix derivations to construct the target system identically across environments. As of 2025, NixOS has seen enhancements in container support and hybrid integration capabilities. The 25.05 release introduced improved OCI container modules, allowing declarative management of containerized services via options like containers.myapp = { image = "docker.io/example/app"; autoStart = true; };, which integrate with systemd for lightweight, isolated environments without external runtimes like Docker in many cases. Additionally, hybrid setups with other distributions are facilitated through tools like nixos-container for running NixOS guests on non-NixOS hosts or vice versa, enabling gradual adoption in mixed environments.

Flakes and Advanced Modules

Flakes represent an experimental extension to the Nix package manager, introduced in version 2.4 on November 1, 2021, designed to enhance reproducibility and modularity in Nix projects. A flake consists of a directory containing a flake.nix file at its root, which defines the project's structure using the Nix expression language. This file specifies inputs—dependencies such as other flakes or Nixpkgs versions—and outputs, such as packages, applications, or development shells, enabling self-contained and discoverable Nix code. By enforcing a standardized schema, flakes address challenges in traditional Nix usage, like implicit dependency resolution, promoting portable and version-controlled projects. Central to flakes are inputs and the accompanying flake.lock file, which pins exact versions of dependencies to ensure builds are reproducible across machines and over time. When evaluating a flake, Nix generates or updates the flake.lock based on the flake.nix inputs, locking them to specific revisions or hashes. This mechanism supports reproducible development environments, such as devShells for isolated shells with project-specific tools, and apps for executable binaries, without relying on mutable channels or overlays. Advanced modules in Nix extend this modularity by allowing users to create reusable, importable Nix expressions that define configurable options. These modules use the Nixpkgs library to declare options via functions like lib.mkOption, specifying types, defaults, and descriptions for parameters such as paths, booleans, or strings. For instance, a module might define an option for a custom package path, which can be imported into a flake's outputs for tailored configurations, fostering composable setups without hardcoding values. This system, implemented in lib/modules.nix, supports merging multiple module definitions while resolving conflicts through priorities. The nix flake subcommand provides dedicated tools for managing flakes, streamlining workflows beyond basic Nix operations. nix flake init creates a new flake in the current directory by copying from a template, avoiding overwrites of existing files. nix flake update refreshes the flake.lock by updating all or specified inputs to their latest compatible versions, generating the lock file if absent. Additionally, nix flake check validates a flake by evaluating its outputs and executing any defined checks, ensuring derivations build successfully and tests pass. As of 2025, enhancements to flakes emphasize performance and usability, particularly in caching and environment management. Tools like nix-direnv integrate with flakes to cache nix develop environments persistently, reducing startup times after initial runs by symlinking dependencies and preventing garbage collection of build artifacts. This pairs with direnv for automatic activation of flake-based project shells upon directory entry, enabling seamless, reproducible workflows without manual invocation. Nix release 2.30, dated July 7, 2025, further refines build processes, indirectly benefiting flake evaluation through optimized temporary directory handling.

Forks and Alternatives

One prominent fork of the Nix package manager is GNU Guix, developed by the GNU Project to emphasize exclusively free software in its core distribution. Guix originated as a fork of Nix but has since replaced most original Nix code with its own implementations, while retaining core concepts like a functional package store and build purity. It uses Scheme (via GNU Guile) for package definitions and configurations, diverging from Nix's domain-specific language to leverage a more general-purpose Lisp dialect for expressiveness and extensibility. Like Nix, Guix employs an immutable store—located at /gnu/store/—where packages reside in directories hashed from their inputs, ensuring reproducibility and isolation through containerized builds that prevent external influences. This design supports transactional operations, such as atomic upgrades and rollbacks, mirroring Nix's purity guarantees but aligned with GNU's free software principles, excluding non-free components from the main repository. Guix differs from Nix in licensing, adopting the GNU General Public License version 3 or later (GPL-3.0+), which imposes stricter copyleft requirements compared to Nix's GNU Lesser General Public License version 2.1 (LGPL-2.1). The language choice—Scheme versus Nix's custom syntax—affects usability; Scheme enables higher-level abstractions but may introduce a steeper learning curve for non-Lisp users, while Nix's language prioritizes simplicity for build specifications. In terms of ecosystem size, Nix maintains a larger collection with over 120,000 packages in nixpkgs as of 2025, benefiting from broader community contributions, whereas Guix's repository is smaller and more curated for consistency, focusing on free software with around 25,000 packages as of recent counts. Beyond full forks, several tools extend Nix concepts for alternative workflows, particularly in monorepo management. Niv provides straightforward dependency handling for Nix projects by maintaining a nix/sources.json file to track and update external sources, simplifying integration in large repositories without altering core Nix mechanics. Complementing this, Nixago serves as a flake-based library for dynamically generating configuration files from Nix expressions, reducing repository root clutter and facilitating modular setups in monorepos by automating outputs like shell scripts or deployment configs. These are not forks but enhance Nix's declarative paradigm for complex project structures, enabling reproducible builds across polyglot codebases without forking the underlying package manager. Experimental adaptations of Nix include nix-on-droid, which ports the Nix environment to Android devices via a standalone app, granting access to nixpkgs' packages without root privileges or full NixOS emulation. It relies on proot for user-space emulation and a modified Termux base, allowing isolated Nix operations on mobile hardware while preserving store purity and reproducibility. Such projects demonstrate Nix's portability but highlight platform-specific challenges, like limited hardware isolation on non-Linux kernels. As of 2025, interest in Nix-compatible tools for non-Nix systems continues to grow, with efforts like flake-compat enabling legacy flake support on systems without native flake activation, bridging gaps for hybrid environments. This reflects broader adoption of Nix principles outside dedicated setups, though full interoperability remains constrained by store and daemon dependencies.

Adoption

Notable Projects and Use Cases

Nix has been widely adopted in development environments to ensure reproducibility and isolation, particularly through tools like Cachix, which provides private binary caches for sharing pre-built derivations across teams and machines. Companies such as Tweag and Serokell, specializing in functional programming and systems engineering, leverage Nix for client projects, including Haskell-based applications where it manages complex dependencies without conflicts. Similarly, Shopify utilizes Nix to standardize developer setups across its engineering teams, enabling consistent environments for web-scale services regardless of the underlying operating system. In continuous integration and continuous deployment (CI/CD) pipelines, Nix integrates seamlessly with platforms like GitHub Actions to automate reproducible builds. By installing Nix via dedicated actions and caching outputs with services like Cachix, workflows can substitute pre-built binaries, reducing build times and ensuring identical results across runs. For Haskell projects, Nix complements Stack by handling non-Haskell dependencies, such as system libraries, while Stack manages GHC and packages, allowing for cross-platform reproducible builds in open-source ecosystems. Nix supports scientific computing by facilitating reproducible machine learning workflows, notably through isolated environments for tools like Jupyter notebooks. Researchers can define exact versions of Python, TensorFlow, and supporting libraries in a nix-shell, ensuring experiments yield consistent results across collaborators and hardware. In quantum chemistry, Nix enables sustainable packaging of over 26 specialized tools, such as ORCA and Psi4, via overlays like NixOS-QChem, which supports both interactive sessions and non-interactive HPC calculations while maintaining bit-for-bit reproducibility. In cloud-native environments, Nix enhances Kubernetes deployments by generating OCI-compliant container images from declarative configurations, ensuring uniform application behavior from development to production clusters. Organizations use Nix to provision reproducible infrastructure for Kubernetes operators, such as those managing stateful services, by deriving images and configurations that avoid dependency drift in multi-node setups.

Community and Challenges

The Nix community is supported by dedicated hubs that facilitate discussion, collaboration, and knowledge sharing. The official Discourse forums serve as the primary platform for announcements, help requests, and in-depth conversations, while Matrix channels, including #nix:nixos.org, enable real-time communication and topic-specific rooms for developers and users. Complementing these, the annual NixCon conference brings the community together for presentations, workshops, and networking; NixCon 2025 took place in Rapperswil-Jona, Switzerland, from September 5 to 7, drawing over 400 participants focused on advancing Nix and NixOS technologies. Community growth has been robust, with nixpkgs—the core repository of packages—sustained by thousands of contributors worldwide. The NixOS 25.05 release, for example, was driven by 2,857 contributors who submitted 57,054 commits, reflecting ongoing expansion in participation. Corporate involvement has bolstered this momentum through increased sponsorships via Open Collective, funding essential infrastructure like build servers and bandwidth to support the ecosystem's scalability. Despite these strengths, the community grapples with notable challenges that hinder broader adoption. Nix's distinctive domain-specific language imposes a steep learning curve, demanding proficiency in functional programming paradigms and declarative syntax that differ markedly from conventional package managers. Performance bottlenecks emerge in large-scale evaluations, where computing dependencies for extensive package graphs can consume significant time and resources, exacerbating delays in development workflows. On macOS, compatibility issues persist, including regressions in installation processes and runtime behaviors that frustrate users seeking cross-platform reproducibility. Criticisms also center on systemic risks and design debates. The centralization of binary caches, primarily through services like cache.nixos.org, raises security concerns, as compromised caches could enable remote code execution or supply chain attacks without robust verification mechanisms. Furthermore, multi-user security models spark contention, with challenges in credential propagation, daemon privileges, and isolation leading to vulnerabilities in shared or enterprise setups. To address these hurdles and ensure long-term sustainability, community efforts are prioritizing enhanced onboarding and accessibility. Initiatives include graphical tools like Nix-GUI, which simplifies configuration management for users avoiding the Nix language, and comprehensive documentation overhauls to clarify concepts and reduce entry barriers for newcomers.

References

  1. [1]
    How Nix Works | Nix & NixOS
    Nix is a purely functional package manager. This means that it treats packages like values in purely functional programming languages such as Haskell.
  2. [2]
    [PDF] Nix: A Safe and Policy-Free System for Software Deployment
    Nix: A Safe and Policy-Free System for Software Deployment. Eelco Dolstra, Merijn de Jonge, and Eelco Visser – Utrecht University. ABSTRACT. Existing systems ...
  3. [3]
    NixOS/nix: Nix, the purely functional package manager - GitHub
    Nix was created by Eelco Dolstra and developed as the subject of his PhD thesis The Purely Functional Software Deployment Model, published 2006.
  4. [4]
    Nix & NixOS | Declarative builds and deployments
    Nix is a tool that takes a unique approach to package management and system configuration. Learn how to make reproducible, declarative and reliable systems.Packages · Explore · Download · Learn Nix
  5. [5]
    Learn Nix - NixOS
    Nix is a package manager which comes in a form of many command line tools. Packages that Nix can build are defined with the Nix Expression Language.
  6. [6]
    NixOS/nixpkgs: Nix Packages collection & NixOS - GitHub
    Nixpkgs is a collection of over 120,000 software packages that can be installed with the Nix package manager. ... Continuous package builds for the NixOS 25.05 ...
  7. [7]
    Research and Scientific Publications | Nix & NixOS
    Nix started as a research project by Eelco Dolstra and his collaborators at Utrecht University around 2003. Since then, scientists from multiple ...
  8. [8]
    multi-user install fails on WSL · Issue #4999 · NixOS/nix - GitHub
    Jul 9, 2021 · Describe the bug the website clearly states that I can install nix on wsl via the multi-user install: Install Nix on any Linux distribution, ...
  9. [9]
    [PDF] The Purely Functional Software Deployment Model - Eelco Dolstra
    He shared my eventual interest in configuration management- related issues, and package management in particular. His insights have improved this research and ...
  10. [10]
    [PDF] Nix: A Safe and Policy-Free System for Software Deployment
    Nix: A Safe and Policy-Free System for Software Deployment. Eelco Dolstra, Merijn de Jonge, and Eelco Visser – Utrecht University. ABSTRACT. Existing systems ...Missing: PhD | Show results with:PhD
  11. [11]
    NixOS Foundation | Blog | Nix & NixOS
    Aug 9, 2015 · The NixOS Foundation was started to improve our ability to maintain and extend the infrastructure used by the Nix related projects.Missing: founded | Show results with:founded
  12. [12]
    On community in Nix - Determinate Systems
    Apr 26, 2024 · I co-created and assumed leadership of the NixOS Foundation in 2015 out of a sense of duty to further facilitate the rapid growth of the ...
  13. [13]
    2022 Summer of Nix documentation stream - NGI Zero
    Jul 15, 2022 · Documentation and the steep learning curve have always been a sore point in the Nix community. We will change some of that to the better in the ...Missing: early challenges
  14. [14]
    Nix 1.0 released | Blog - NixOS
    Jun 11, 2012 · Nix 1.0 released. Published on Mon Jun 11 2012. Nix 1.0 released. After almost two years of development, Nix 1.0 has been released. See the ...
  15. [15]
    [PDF] Nix flakes - Eelco Dolstra
    Flakes: If two users evaluate the same attribute from the same revision of the same flake, they will get the same result. Allows persistent evaluation caching.
  16. [16]
    Path Cleared For Nix Package Manager On Fedora With /nix Approved
    Oct 14, 2025 · Now though the Fedora Engineering and Steering Committee (FESCo) has granted permission for using the /nix directory hierarchy. The past few ...
  17. [17]
    Changes/Nix package tool - Fedora Project Wiki
    Oct 25, 2025 · We have received an exception approval from FESCO to allow the nix package to use /nix toplevel directory at runtime, as it is needed to ...
  18. [18]
  19. [19]
  20. [20]
  21. [21]
  22. [22]
    NixOS/rfcs: The Nix community RFCs - GitHub
    [See more info on the Nix RFC process here](https://github.com/NixOS ... process should live outside of the RFC document, mostly in documentation and code.
  23. [23]
    Improving our RFC process - RFCs - NixOS Discourse
    May 29, 2023 · The RFC process acts as a check on teams, where they might be making decisions that are not in the wider community's best interest.
  24. [24]
    New RFC draft: Standardize updater scripts (successor of RFC 109)
    Oct 13, 2024 · This means that this RFC tries to create a single library for all updaters, mainly to improve the maintainability of hundreds of random scripts.
  25. [25]
    Enforcing Nix formatting in Nixpkgs - Development - NixOS Discourse
    Jul 23, 2024 · The Nix formatting team is happy to announce the next big step towards the implementation of accepted RFC 166: Enforcing the official formatter ...
  26. [26]
  27. [27]
  28. [28]
  29. [29]
  30. [30]
    Hydra - NixOS Wiki
    Sep 28, 2025 · Hydra is a tool for continuous integration testing and software release that uses a purely functional language to describe build jobs and their dependencies.Missing: CI | Show results with:CI
  31. [31]
    NixOS/hydra: Hydra, the Nix-based continuous build system - GitHub
    Hydra is a Continuous Integration service for Nix based projects. Installation And Setup Note: The instructions provided below are intended to enable new users.
  32. [32]
  33. [33]
    Nixpkgs - NixOS Wiki
    Aug 30, 2025 · Stable channel branches are released bi-annually at the end of May and the end of November. Using stable channels on NixOS is comparable to ...
  34. [34]
    NixOS 24.11 released | Blog
    Nov 30, 2024 · This release will receive bugfixes and security updates for seven months (up until 2025-06-31). The 24.11 release was made possible due to the efforts of 2669 ...Missing: bi- | Show results with:bi-
  35. [35]
    Appendix B. Release Notes - NixOS
    This section lists the release notes for each stable version of NixOS and current unstable revision.
  36. [36]
    Release Schedule for 24.11 · Issue #339153 · NixOS/nixpkgs - GitHub
    Sep 2, 2024 · Saturday, Nov 30th, might end up being the day we get the release out. But that doesn't stop anyone from using it right now, we have the ...
  37. [37]
  38. [38]
    Profiles - Nix Reference Manual
    Profiles and user environments are Nix's mechanism for implementing the ability to allow different users to have different configurations, and to do atomic ...Missing: components | Show results with:components
  39. [39]
    Home Manager Manual - Nix community homepage
    This manual will eventually describe how to install, use, and extend Home Manager. If you encounter problems then please reach out on the IRC channel ...Configuration Options · Appendix B. NixOS... · Appendix D. Release NotesMissing: core principles<|control11|><|separator|>
  40. [40]
    Towards reproducibility: pinning Nixpkgs — nix.dev documentation
    To create fully reproducible Nix expressions, we can pin an exact version of Nixpkgs. The simplest way to do this is to fetch the required Nixpkgs version as a ...
  41. [41]
    nix-copy-closure - Nix Reference Manual - nix.dev
    nix-copy-closure computes the closure of those paths (ie all their dependencies in the Nix store), and copies store objects in that closure to another machine ...Missing: wide | Show results with:wide
  42. [42]
  43. [43]
  44. [44]
    Module system — nix.dev documentation
    The module system is a Nix library that allows declaring attribute sets, imposing type constraints, and merging values automatically from different Nix ...
  45. [45]
  46. [46]
  47. [47]
  48. [48]
  49. [49]
    NixOS 25.05 released | Blog | Nix & NixOS
    May 23, 2025 · NixOS 25.05 includes 7840 new packages, 28054 updated packages, 137 new modules, GNOME 48, and kernel update to 6.12.
  50. [50]
    Flakes - NixOS Wiki
    Nix flakes is an experimental feature of the Nix package manager. Flakes was introduced with Nix 2.4 on 2021-11-01 (see release notes).
  51. [51]
    Flakes — nix.dev documentation
    Flake references allow for easier handling of version upgrades for existing packages or project dependencies. The flake schema helps with composing Nix projects ...
  52. [52]
    nix flake - Nix Reference Manual - nix.dev
    nix flake provides subcommands for creating, modifying and querying Nix flakes. Flakes are the unit for packaging Nix code in a reproducible and discoverable ...
  53. [53]
    Nix flakes
    Nix flakes are currently an experimental feature in Nix and there is currently no specific timeline for making flakes official. While the user interface around ...
  54. [54]
    NixOS modules
    A module is a file containing a Nix expression with a specific structure. It declares options for other modules to define (give a value).Structure · Full Example · Advanced Use Cases · Using external NixOS modules
  55. [55]
    Module System and Custom Options - NixOS & Flakes Book
    Sep 8, 2025 · A universal module system implemented in Nixpkgs, found in lib/modules.nix. The official documentation for this module system is provided below.What is the Purpose of the... · Basic Structure and Usage · Assignment and Lazy...
  56. [56]
    nix flake init - Nix Reference Manual - nix.dev
    This command creates a flake in the current directory by copying the files of a template. It will not overwrite existing files.
  57. [57]
    nix flake update - Nix Reference Manual
    This command updates the inputs in a lock file ( flake.lock ). By default, all inputs are updated. If the lock file doesn't exist yet, it will be created.
  58. [58]
    nix flake check - Nix Reference Manual
    The `nix flake check` command checks if a flake evaluates and runs its tests, verifying that the specified flake can be evaluated and its derivations built ...
  59. [59]
    nix-community/nix-direnv: A fast, persistent use_nix ... - GitHub
    nix-direnv · significantly faster after the first run by caching the nix-shell environment · prevents garbage collection of build dependencies by symlinking the ...Missing: enhancements | Show results with:enhancements
  60. [60]
    Setting up a Nix Development Environment with Flakes and direnv
    May 28, 2025 · Complete guide to a Nix development environment using flakes and direnv. Build reproducible, auto-activating environments that work on any.Missing: enhancements | Show results with:enhancements
  61. [61]
    Release 2.30 (2025-07-07) - Nix 2.31.3 Reference Manual
    Release 2.30.0 (2025-07-07). Backward-incompatible changes and deprecations. build-dir no longer defaults to $TMPDIR. The directory in which temporary build ...
  62. [62]
    GNU Guix Reference Manual
    GNU Guix is a package management tool for and distribution of the GNU system. Guix makes it easy for unprivileged users to install, upgrade, or remove software ...
  63. [63]
    Guix started as a fork of Nix, but I believe all original ... - Hacker News
    Mar 13, 2024 · Guix started as a fork of Nix, but I believe all original Nix code has been replaced with Guix specific code at this point.
  64. [64]
    A look at Nix and Guix - LWN.net
    Feb 28, 2024 · I think that is the main difference with Nix: a completely free core named GNU Guix that you can extend for your needs; you or a group of people ...
  65. [65]
    guix - GNU Guix packages
    Licenses: GPL 3+; Package source: gnu/packages/package-management.scm; Builds: See build status; Issues: See known issues. Installation. Install the latest ...
  66. [66]
    Can anyone explain to me the appeal of guix over nix? Is the ...
    Sep 21, 2022 · I think the main difference is that Guix uses an actual language and writing things for it seems pretty reasonable, while Nix language is ...
  67. [67]
    nix vs guix.org - gist/GitHub
    Nix has much more packaged. Guix has only free software in main repo, definitions looks more consistent and less hacky.
  68. [68]
    Trying Guix: A Nixer's Impressions - tazjin's blog
    Jul 6, 2025 · A quick note before we begin: Technically, Guix uses a fork of the Nix daemon for the low-level primitives of functional package management (the ...
  69. [69]
    nmattia/niv: Easy dependency management for Nix projects - GitHub
    niv simplifies adding and updating dependencies in Nix projects. It uses a single file, nix/sources.json, where it stores the data necessary for fetching and ...Missing: monorepo | Show results with:monorepo
  70. [70]
    nix-community/nixago: Generate configuration files using ... - GitHub
    Jun 17, 2022 · Ready to dynamically generate configuration files in your flake-based setup? Nixago is a flake library for generating configuration files using Nix expressions ...Missing: monorepo | Show results with:monorepo
  71. [71]
    nix-community/nix-on-droid: Nix-enabled environment for ... - GitHub
    Nix package manager on Android, in a single-click installable package. This is not full NixOS running inside Android, but you get easy access to nixpkgs' vast ...
  72. [72]
    Nix-on-Droid - Free and Open Source Android App Repository
    Nix-on-Droid brings Nix package manager of NixOS fame to your mobile device. If you're not after its advanced features, you might still be interested in ...
  73. [73]
    Flake-compat as alternative to flakes or npins - NixOS Discourse
    May 9, 2025 · I looked into flake-compat as a way of getting around flakes and it was really close to doing what I wanted straight away.
  74. [74]
    Solve compatibility problems at NixOS vs non-Nix builds space
    Jun 10, 2022 · Nix language is a functional programming language designed for building software. Each program defines its exact dependencies during the build, ...
  75. [75]
    Cachix - Nix binary cache hosting
    Cachix is a Nix binary cache hosting service that allows sharing binaries between environments, avoiding the need to rebuild software.Pushing to Cachix · Pricing · Documentation · BlogMissing: private adoption Tweag Serokell
  76. [76]
  77. [77]
    Corporate adoption list - Marketing - NixOS Discourse
    Jun 24, 2024 · (EDIT: “Nix is getting early use at legitimate companies like Shopify, Replit, Anduril, Target, GCHQ, and others.”)
  78. [78]
    Continuous integration with GitHub Actions — nix.dev documentation
    In this guide, we'll show you a few short steps to get started using GitHub Actions as your continuous integration (CI) workflow for commits and pull requests.
  79. [79]
    Nix integration - Haskell Stack
    When integrated with Nix, Stack handles Haskell dependencies as it usually does and the Nix package manager handles the non-Haskell dependencies needed by the ...
  80. [80]
    Reproducible Python projects using Nix :: PyData Global 2024
    This talk will explore how Nix can be leveraged to create reproducible work environments ... Avik is a seasoned data scientist who has worked in multiple domains ...
  81. [81]
    Sustainable packaging of quantum chemistry software with the Nix ...
    Jan 4, 2022 · In this paper, we present an approach that allows for an easy installation of quantum chemistry software packages, which is also independent of operating ...
  82. [82]
    Deploying Nix-built containers to Kubernetes - Determinate Systems
    Nov 21, 2022 · To create cross-platform development environments for both local machines and the continuous integration level (which runs on GitHub Actions).Missing: cases | Show results with:cases
  83. [83]
    Nix: Hypervisor, Kubernetes, and Containers - joshrosso
    Containers will be run in the cluster via a Pod. Nix can be used to create OCI-compliant container images, which then run via a container runtime such as ...
  84. [84]
    Matrix - NixOS Wiki
    Matrix defines open APIs for decentralized communication, used for IM, VoIP, IoT, and bridging communication silos.Missing: manager | Show results with:manager
  85. [85]
    How to get help — nix.dev documentation
    A room related to your question in the NixOS Matrix space. The Help category on Discourse. The general #nix room on Matrix.
  86. [86]
    NixCon 2025 - Switzerland, September 5-7, 2025
    NixCon 2025 is a community-organized conference about Nix and NixOS taking place in Rapperswil-Jona, Switzerland on September 5-7, 2025.Accommodation · Meet the Organizers · Schedule · Live
  87. [87]
    NixCon 2025: Nix professionalizes itself | heise online
    Sep 10, 2025 · Over 400 participants gathered in Switzerland from September 5 to 7 for NixCon 2025. The ninth annual European conference on the package ...
  88. [88]
    The NixOS Foundation - Open Collective
    Supporting the Nix ecosystem's infrastructure, and projects implementing the purely functional deployment model.Missing: 2018 | Show results with:2018
  89. [89]
    I Think It's Time to Give Nix a Chance | Chinmay D. Pai
    May 26, 2025 · First, let's get this out of the way: Nix still does have a steep learning curve. It requires learning a new functional programming language, ...
  90. [90]
    Nix is my favorite package manager to use on macOS
    Oct 7, 2024 · Nix provides a lot more functionality than just using Homebrew by itself, but there is a catch: Nix has somewhat of a steep learning curve, and ...
  91. [91]
    Nix Package Manager performance on Mac - Help - NixOS Discourse
    Jul 17, 2024 · The first time as it is installing the packages its takes 49 seconds, then subsequente times take around 9 seconds. This seems too much for a simple command.Why is NixOS considered difficult if you've never used it? - HelpHow well does nix[pkgs] run on macOS 12 Monterey?More results from discourse.nixos.orgMissing: challenges learning curve compatibility
  92. [92]
    I have a lot of regret installing this on my Mac : r/Nix - Reddit
    Dec 29, 2024 · I have heard so much good about Nix, and maybe it is when it works, but it shouldn't take this much obscure configuration to install a few packages.A use case where NixOS is more trouble than worth - RedditA middle ground between the nix way and the rest? (RANT) : r/NixOSMore results from www.reddit.comMissing: performance compatibility
  93. [93]
    Nix on MacOS - The Good, the Bad and the Ugly
    Jul 10, 2024 · Nix is the worst package manager on MacOS except for all the other package managers that have been tried from time to time.Missing: performance compatibility
  94. [94]
    Garnix Blog: Stop trusting Nix caches - Links - NixOS Discourse
    Oct 1, 2025 · Summary of the blog post: Nix caches are a quite significant attack vector (leading to potential RCE and privilege escalation), ...A common public nix cache?Best practices for Nix at work - LinksMore results from discourse.nixos.orgMissing: criticisms centralization
  95. [95]
    Stop Trusting Nix Caches | Lobsters
    Oct 1, 2025 · Unfortunately, Nix alone can't promise binary reproducibility. What Nix promises is that it sets a sandbox where the builds have access to ...Missing: criticisms | Show results with:criticisms
  96. [96]
    Nix S3 multi-user woes | Farid Zakaria's Blog
    Jul 2, 2025 · Multi-user Nix S3 issues include needing to pass AWS credentials to the daemon, mixed local/daemon credential usage, and issues with `nixConfig ...Missing: criticisms | Show results with:criticisms
  97. [97]
    Untrusted CI: Using Nix to get automatic trusted caching of ... - Tweag
    Nov 21, 2019 · In this post, we show an approach based on multi-user Nix and post-build hooks that solves these security issues and more.Missing: criticisms centralization
  98. [98]
    nix-gui/nix-gui: Use NixOS Without Coding - GitHub
    Nix-Gui is a configuration management tool designed for those who haven't mastered the (arguably difficult) nix language.
  99. [99]
    The right words in the right place - Tweag
    May 2, 2024 · The Nix manual and nix.dev are actively maintained since October 2022. Since 2024 we also have two people actively working on Nixpkgs ...
  100. [100]
    Improving Nix documentation - YouTube
    Nov 10, 2022 · Documentation has always been a sore point for Nix, and the 2022 community survey results have clearly shown demand for improvement.Missing: onboarding graphical tools