wiki/tools.nix.flakes.html

218 lines
54 KiB
HTML
Raw Permalink Normal View History

2022-07-29 15:41:17 +00:00
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width"/><meta charSet="utf-8"/><title>Nix flakes</title><script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script><script id="MathJax-script" async="" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script><script type="text/x-mathjax-config">
MathJax = {
tex: {
inlineMath: [ [&#x27;$&#x27;,&#x27;$&#x27;], [&#x27;\(&#x27;,&#x27;\)&#x27;] ],
displayMath: [ [&#x27;$$&#x27;,&#x27;$$&#x27;], [&#x27;[&#x27;,&#x27;]&#x27;] ]
},
options = {
processHtmlClass = &quot;math&quot;
}
}
</script><meta name="next-head-count" content="6"/><link rel="preload" href="/wiki/_next/static/css/52fc2ba29703df73922c.css" as="style"/><link rel="stylesheet" href="/wiki/_next/static/css/52fc2ba29703df73922c.css" data-n-g=""/><noscript data-n-css=""></noscript><link rel="preload" href="/wiki/_next/static/chunks/main-ae4733327bd95c4ac325.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/webpack-50bee04d1dc61f8adf5b.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/framework.9d524150d48315f49e80.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/commons.0e1c3f9aa780c2dfe9f0.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/pages/_app-8e3d0c58a60ec788aa69.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/940643274e605e7596ecea1f2ff8d83317a3fb76.4841a16762f602a59f00.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/pages/%5B%5B...slug%5D%5D-1aa198f87ede1cd0e1dc.js" as="script"/></head><body><div id="__next"><main><h1>Nix flakes</h1><section class="post-metadata"><span>Date: <!-- -->2021-07-18 22:34:11 +08:00</span><span>Date modified: <!-- -->2022-05-22 21:24:01 +08:00</span></section><nav class="toc"><ol class="toc-level toc-level-1"><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#exploring-a-nix-flake" class="toc-link toc-link-h1">Exploring a Nix flake</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#selected-list-of-attributes-for-outputs" class="toc-link toc-link-h1">Selected list of attributes for outputs</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#flake-templates" class="toc-link toc-link-h1">Flake templates</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#nix-registry" class="toc-link toc-link-h1">Nix registry</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#more-information-about-flakes" class="toc-link toc-link-h1">More information about flakes</a></li></ol></nav><div class="special-block block-note"><p>As of 2021-06-30, the version used for this note is at v2.3 so it needs to be invoked with the unstable version.
</p></div><p>What are Nix flakes?
</p><p>A self-contained Nix module that takes inputs (can be from other flakes) and create outputs.
It is comparable to <a href="https://guix.gnu.org/manual/en/html_node/Channels.html">Guix channels</a> (or the NUR) in the way any arbitrary value can be exported, thus extending a Nix module in any direction the author can make it to.
Also, it supercedes Nix channels as a way to manage your system.
</p><p>So, why use flakes?
</p><ul><li><p>Since it is self-contained, it is easier to compose and develop environments for projects.
</p></li><li><p>It is more declarative compared to Nix channels.
</p></li><li><p>Provides a structure for discoverability through exploring the output.
</p></li><li><p>In case you&#x27;re using <a href="/wiki/linux.distros.nixos">NixOS</a>, it also provides an easier way to extend it with third-party custom modules.
</p></li></ul><h1 id="exploring-a-nix-flake">Exploring a Nix flake</h1><p>To get started with a flake, you can quickly create one with <code class="inline-verbatim">nix flake init</code>.
This will create <code class="inline-verbatim">flake.nix</code> which is also required for Nix to recognize the project as a flake.
</p><p>Here&#x27;s the skeleton of a flake.
</p><pre class="src-block"><code class="language-nix">{
description = &quot;A basic flake.&quot;;
inputs = {};
outputs = {};
}
</code></pre><p>It is really just an attribute set that mainly deals with three attributes:
</p><ul><li><p><code class="inline-verbatim">description</code> which is self-descriptive enough to see what&#x27;s it for. ;p
</p></li><li><p><code class="inline-verbatim">inputs</code> which contains inputs (that are other flakes) to be used for...
</p></li><li><p>...the <code class="inline-verbatim">outputs</code> which is a set or a function that returns an attribute set to be exported.
</p></li></ul><p>Here&#x27;s a real example of a basic flake.
</p><pre class="src-block"><code class="language-nix">{
description = &quot;A basic flake with some real inputs this time.&quot;;
inputs = {
nixpkgs.url = &quot;github:NixOS/nixpkgs&quot;;
home-manager.url = &quot;github:nix-community/home-manager&quot;;
home-manager.inputs.nixpkgs.follows = &quot;nixpkgs&quot;;
};
outputs = attrs@{ self, nixpkgs, home-manager, ... }: {
homeManagerConfiguration = import ./hmUsers;
packages.x86_64-linux = {
hello = nixpkgs.pkgs.hello;
};
};
}
</code></pre><p>The flake requires other flakes from the nixpkgs and home-manager as indicated from the URL.
This will get the latest revision of both inputs.
</p><p>This is not ideal as it will get the latest revisions every time it requests the inputs.
While you can pin the version by adding more information (e.g., <code class="inline-verbatim">nixpkgs.url = &quot;github:NixOS/nixpkgs/nixos-21.11&quot;</code>, <code class="inline-verbatim">home-manager.url = &quot;github:nix-community/home-manager/781d25b315def05cd7ede3765226c54216f0b1fe&quot;</code>), this isn&#x27;t really necessary for the most part as we have lockfiles to secure our dependencies version.
These lockfiles can be found at <code class="inline-verbatim">flake.lock</code> where complete metadata for the flakes are found.
</p><h1 id="selected-list-of-attributes-for-outputs">Selected list of attributes for outputs</h1><p>While you can export attributes of any type, there are common attributes you&#x27;ll mostly see.
</p><p>As an example, here&#x27;s the flake of my NixOS configuration.
</p><pre class="src-block"><code class="language-shell">nix flake show github:foo-dogsquared/nixos-config | nix run nixpkgs#gnused -- &#x27;s/\x1b\[[0-9;]*m//g&#x27;
</code></pre><div class="exampe">github:foo-dogsquared/nixos-config/12077bfc601e5465e343e590a830e8d3cb6a1a59
├───devShells
│ ├───aarch64-darwin
│ │ ├───flatpak: development environment &#x27;nix-shell&#x27;
│ │ ├───hugo: development environment &#x27;nix-shell&#x27;
│ │ └───rust: development environment &#x27;nix-shell&#x27;
│ ├───aarch64-linux
│ │ ├───flatpak: development environment &#x27;nix-shell&#x27;
│ │ ├───hugo: development environment &#x27;nix-shell&#x27;
│ │ └───rust: development environment &#x27;nix-shell&#x27;
│ ├───i686-linux
│ │ ├───flatpak: development environment &#x27;nix-shell&#x27;
│ │ ├───hugo: development environment &#x27;nix-shell&#x27;
│ │ └───rust: development environment &#x27;nix-shell&#x27;
│ ├───x86_64-darwin
│ │ ├───flatpak: development environment &#x27;nix-shell&#x27;
│ │ ├───hugo: development environment &#x27;nix-shell&#x27;
│ │ └───rust: development environment &#x27;nix-shell&#x27;
│ └───x86_64-linux
│ ├───flatpak: development environment &#x27;nix-shell&#x27;
│ ├───hugo: development environment &#x27;nix-shell&#x27;
│ └───rust: development environment &#x27;nix-shell&#x27;
├───homeManagerConfigurations: unknown
├───homeManagerModules: unknown
├───lib: unknown
├───nixosConfigurations
│ └───ni: NixOS configuration
├───nixosModules
│ ├───agenix: NixOS module
│ ├───archiving: NixOS module
│ ├───desktop: NixOS module
│ ├───dev: NixOS module
│ ├───hardware-setup: NixOS module
│ ├───themes: NixOS module
│ └───users: NixOS module
└───packages
├───aarch64-darwin
│ ├───doggo: package &#x27;doggo-0.4.1&#x27;
│ ├───gnome-shell-extension-burn-my-windows: package &#x27;gnome-shell-extension-burn-my-windows-2&#x27;
│ ├───gnome-shell-extension-desktop-cube: package &#x27;gnome-shell-extension-desktop-cube-5&#x27;
│ ├───gnome-shell-extension-fly-pie: package &#x27;gnome-shell-extension-fly-pie-12&#x27;
│ ├───gnome-shell-extension-pop-shell: package &#x27;gnome-shell-extension-pop-shell-unstable-2021-11-30&#x27;
│ ├───libcs50: package &#x27;libcs50-10.1.1&#x27;
│ ├───llama: package &#x27;llama-1.0.2&#x27;
│ ├───neo: package &#x27;neo-0.6&#x27;
│ ├───pop-launcher: package &#x27;pop-launcher-1.1.0&#x27;
│ ├───pop-launcher-plugin-duckduckgo-bangs: package &#x27;pop-launcher-plugin-duckduckgo-bangs-1.3.0&#x27;
│ ├───sioyek: package &#x27;sioyek-1.0.0&#x27;
│ └───tic-80: package &#x27;tic-80-unstable-2021-12-18&#x27;
├───aarch64-linux
│ ├───doggo: package &#x27;doggo-0.4.1&#x27;
│ ├───gnome-shell-extension-burn-my-windows: package &#x27;gnome-shell-extension-burn-my-windows-2&#x27;
│ ├───gnome-shell-extension-desktop-cube: package &#x27;gnome-shell-extension-desktop-cube-5&#x27;
│ ├───gnome-shell-extension-fly-pie: package &#x27;gnome-shell-extension-fly-pie-12&#x27;
│ ├───gnome-shell-extension-pop-shell: package &#x27;gnome-shell-extension-pop-shell-unstable-2021-11-30&#x27;
│ ├───libcs50: package &#x27;libcs50-10.1.1&#x27;
│ ├───llama: package &#x27;llama-1.0.2&#x27;
│ ├───neo: package &#x27;neo-0.6&#x27;
│ ├───pop-launcher: package &#x27;pop-launcher-1.1.0&#x27;
│ ├───pop-launcher-plugin-duckduckgo-bangs: package &#x27;pop-launcher-plugin-duckduckgo-bangs-1.3.0&#x27;
│ ├───sioyek: package &#x27;sioyek-1.0.0&#x27;
│ └───tic-80: package &#x27;tic-80-unstable-2021-12-18&#x27;
├───i686-linux
│ ├───doggo: package &#x27;doggo-0.4.1&#x27;
│ ├───gnome-shell-extension-burn-my-windows: package &#x27;gnome-shell-extension-burn-my-windows-2&#x27;
│ ├───gnome-shell-extension-desktop-cube: package &#x27;gnome-shell-extension-desktop-cube-5&#x27;
│ ├───gnome-shell-extension-fly-pie: package &#x27;gnome-shell-extension-fly-pie-12&#x27;
│ ├───gnome-shell-extension-pop-shell: package &#x27;gnome-shell-extension-pop-shell-unstable-2021-11-30&#x27;
│ ├───libcs50: package &#x27;libcs50-10.1.1&#x27;
│ ├───llama: package &#x27;llama-1.0.2&#x27;
│ ├───neo: package &#x27;neo-0.6&#x27;
│ ├───pop-launcher: package &#x27;pop-launcher-1.1.0&#x27;
│ ├───pop-launcher-plugin-duckduckgo-bangs: package &#x27;pop-launcher-plugin-duckduckgo-bangs-1.3.0&#x27;
│ ├───sioyek: package &#x27;sioyek-1.0.0&#x27;
│ └───tic-80: package &#x27;tic-80-unstable-2021-12-18&#x27;
├───x86_64-darwin
│ ├───doggo: package &#x27;doggo-0.4.1&#x27;
│ ├───gnome-shell-extension-burn-my-windows: package &#x27;gnome-shell-extension-burn-my-windows-2&#x27;
│ ├───gnome-shell-extension-desktop-cube: package &#x27;gnome-shell-extension-desktop-cube-5&#x27;
│ ├───gnome-shell-extension-fly-pie: package &#x27;gnome-shell-extension-fly-pie-12&#x27;
│ ├───gnome-shell-extension-pop-shell: package &#x27;gnome-shell-extension-pop-shell-unstable-2021-11-30&#x27;
│ ├───libcs50: package &#x27;libcs50-10.1.1&#x27;
│ ├───llama: package &#x27;llama-1.0.2&#x27;
│ ├───neo: package &#x27;neo-0.6&#x27;
│ ├───pop-launcher: package &#x27;pop-launcher-1.1.0&#x27;
│ ├───pop-launcher-plugin-duckduckgo-bangs: package &#x27;pop-launcher-plugin-duckduckgo-bangs-1.3.0&#x27;
│ ├───sioyek: package &#x27;sioyek-1.0.0&#x27;
│ └───tic-80: package &#x27;tic-80-unstable-2021-12-18&#x27;
└───x86_64-linux
├───doggo: package &#x27;doggo-0.4.1&#x27;
├───gnome-shell-extension-burn-my-windows: package &#x27;gnome-shell-extension-burn-my-windows-2&#x27;
├───gnome-shell-extension-desktop-cube: package &#x27;gnome-shell-extension-desktop-cube-5&#x27;
├───gnome-shell-extension-fly-pie: package &#x27;gnome-shell-extension-fly-pie-12&#x27;
├───gnome-shell-extension-pop-shell: package &#x27;gnome-shell-extension-pop-shell-unstable-2021-11-30&#x27;
├───libcs50: package &#x27;libcs50-10.1.1&#x27;
├───llama: package &#x27;llama-1.0.2&#x27;
├───neo: package &#x27;neo-0.6&#x27;
├───pop-launcher: package &#x27;pop-launcher-1.1.0&#x27;
├───pop-launcher-plugin-duckduckgo-bangs: package &#x27;pop-launcher-plugin-duckduckgo-bangs-1.3.0&#x27;
├───sioyek: package &#x27;sioyek-1.0.0&#x27;
└───tic-80: package &#x27;tic-80-unstable-2021-12-18&#x27;
</div><ul><li><p><code class="inline-verbatim">defaultPackage.${system}.${package}</code> (or <code class="inline-verbatim">packages.${system}.${package}</code>) is mainly expected for packages.
This allows for easy building — e.g., <code class="inline-verbatim">nix build nixpkgs#hello</code> will refer to <code class="inline-verbatim">defaultPackage.${system}.hello</code>.
Another command that expects this is <code class="inline-verbatim">nix run ${PACKAGE}</code> (e.g., <code class="inline-verbatim">nix run nixpkgs#hello</code>).
</p></li><li><p><code class="inline-verbatim">nixosConfigurations.${host}</code> is a NixOS host configuration.
Each attribute contain a set similar to the traditional set from <code class="inline-verbatim">/etc/nixos/configuration.nix</code>.
This is very beneficial for quickly installing only with flakes — e.g., <code class="inline-verbatim">nixos-install --flake github:foo-dogsquared/nixos-config#zilch</code> will install with <code class="inline-verbatim">nixosConfigurations.zilch</code>.
However, attributes should be created with <code class="inline-verbatim">lib.nixosSystem</code> from <code class="inline-verbatim">nixpkgs</code> flake.
</p></li><li><p><code class="inline-verbatim">nixosModules.${module}</code> is a <a href="roam:NixOS modules">roam:NixOS modules</a>, allowing you to extend NixOS further.
These are expected to be similar NixOS modules from nixpkgs.
</p></li><li><p><code class="inline-verbatim">templates.${name}</code> is a template that has the attribute <code class="inline-verbatim">path</code> and <code class="inline-verbatim">description</code>.
See <a href="/wiki/Flake%20templates">Flake templates</a> for more details about how it&#x27;s used.
</p></li><li><p><code class="inline-verbatim">devShell.${system}</code> is expected to be a derivation (mostly with <code class="inline-verbatim">mkShell</code>).
This is the default development environment to be used.
This is mostly expected for projects providing an easy way to bootstrap for development (e.g., with <code class="inline-verbatim">nix develop ${FLAKE}</code>).
</p></li><li><p><code class="inline-verbatim">devShells.${system}.${name}</code> is an attribute set of derivations (mostly from <code class="inline-verbatim">mkShell</code>).
This is similar to <code class="inline-verbatim">devShell</code> except this is where <code class="inline-verbatim">nix develop</code> subcommand finds if an attribute name is given.
</p></li></ul><h1 id="flake-templates">Flake templates</h1><ul><li><p>Flakes can have templates to get started with.
They can be used with <code class="inline-verbatim">nix flake init ${TEMPLATE}</code>.
</p></li><li><p>You can export it in your flakes through the <code class="inline-verbatim">templates</code> attribute.
<code class="inline-verbatim">templates</code> is expected to be an attribute set with each attribute representing a template.
</p></li><li><p>By default, we have the <code class="inline-verbatim">templates</code> flake from the global registry pointed to <a href="https://github.com/NixOS/templates">NixOS/templates</a> Git repo.
</p></li></ul><h1 id="nix-registry">Nix registry</h1><p>Per the Nix manual:
</p><blockquote><p>Flake registries are a convenience feature that allows you to refer to flakes using symbolic identifiers such as <code class="inline-verbatim">nixpkgs</code>, rather than full URLs such as <code class="inline-verbatim">git://github.com/NixOS/nixpkgs</code>.
</p></blockquote><p>Here&#x27;s an example of the registry list with some overriden flakes such as the <code class="inline-verbatim">nixpkgs</code> flake following from my <a href="https://github.com/foo-dogsquared/nixos-config">NixOS configuration</a>.
</p><pre class="src-block"><code class="language-shell">nix registry list
</code></pre><div class="exampe">system flake:agenix path:/nix/store/yka795vkb7ny5fnybf8dafbypcjfmi9n-source?lastModified=1638837456&amp;narHash=sha256-WHLOxthAGx%2fwXw3QUa%2flFE3mr6cQtnXfFYZ0DNyYwt4=&amp;rev=57806bf7e340f4cae705c91748d4fdf8519293a9
system flake:config path:/nix/store/3nlagaj6748w4ffxx4vp5jss2k571f8i-source?lastModified=1640442672&amp;narHash=sha256-Gkt2On9szrFlOo6QiYMOA90qTp4PICd7STHFhGA4bCs=
system flake:home-manager path:/nix/store/ijh6v700kpssfyw44v4awbm2gmjx26qs-source?lastModified=1640296831&amp;narHash=sha256-Mu32vTcfZru4VrvgnpvQKmwC4uY0oF3vnnC2o9SgnRU=&amp;rev=f15b151ca1c4aea23515c241051d71f1b5cf97c8
system flake:nixpkgs path:/nix/store/lgfhg4n6445yizgf0xjirb4bc4j86fr9-source?lastModified=1640269308&amp;narHash=sha256-vBVwv3+kPrxbNyfo48cB5cc5%2f4tq5zlJGas%2fqw8XNBE=&amp;rev=0c408a087b4751c887e463e3848512c12017be25
global flake:agda github:agda/agda
global flake:blender-bin github:edolstra/nix-warez?dir=blender
global flake:dreampkgs github:nix-community/dreampkgs
global flake:dwarffs github:edolstra/dwarffs
global flake:fenix github:nix-community/fenix
global flake:flake-utils github:flake-utils/numtide
global flake:gemini github:nix-community/flake-gemini
global flake:home-manager github:nix-community/home-manager
global flake:hydra github:NixOS/hydra
global flake:mach-nix github:DavHau/mach-nix
global flake:nimble github:nix-community/flake-nimble
global flake:nix github:NixOS/nix
global flake:nixops github:NixOS/nixops
global flake:nixos-hardware github:NixOS/nixos-hardware
global flake:nixos-homepage github:NixOS/nixos-homepage/flake
global flake:nur github:nix-community/NUR
global flake:nixpkgs github:NixOS/nixpkgs/nixpkgs-unstable
global flake:templates github:NixOS/templates
global flake:patchelf github:NixOS/patchelf
global flake:nix-serve github:edolstra/nix-serve
global flake:nickel github:tweag/nickel
</div><p>So how does a flake registry work?
</p><ul><li><p>It is managed through <code class="inline-verbatim">nix registry</code> subcommand or set <code class="inline-verbatim">nix.registry</code> in your system configuration.
</p></li><li><p>Registries are primarily written as JSON files in certain files (e.g., <code class="inline-verbatim">$XDG_CONFIG_HOME/nix/registry</code>, <code class="inline-verbatim">/etc/nix/registry.json</code>).
For more information, see the <a href="https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-registry.html#registry-format">registry format from the manual</a>.
Unlike the traditional Nix channels, the inclusion of arbitrary files and their locations doesn&#x27;t seem to affect the reproducibility since it is mostly used as a convenience feature after all.
</p></li><li><p>The flakes from default registry are mostly getting the latest revisions of the flake per invocation so it is best practice to pin them (e.g., <code class="inline-verbatim">nix registry pin</code>, through <code class="inline-verbatim">nix.registry</code> while setting the NixOS systems in <code class="inline-verbatim">flake.nix</code>).
</p></li><li><p>There are primarily three registries to worry about: user, system, and global.
</p></li><li><p>This is also the reason it downloads something why each time you invoke a Nix-related command (e.g., <code class="inline-verbatim">nix search</code>, <code class="inline-verbatim">nix edit</code>).
</p></li></ul><h1 id="more-information-about-flakes">More information about flakes</h1><ul><li><p>We can modify our inputs.
In the above example, we made <code class="inline-verbatim">home-manager</code> to use our version of <code class="inline-verbatim">nixpkgs</code> which will make it easier to sync.
</p></li></ul><section><h2>Backlinks</h2><ul><li><a href="/wiki/packages.nix">Nix packages</a></li><li><a href="/wiki/tools.nix">Nix package manager</a></li></ul></section></main></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"metadata":{"date":"2021-07-18 22:34:11 +08:00","date_modified":"2022-05-22 21:24:01 +08:00","language":"en","source":""},"title":"Nix flakes","hast":{"type":"root","children":[{"type":"element","tagName":"nav","properties":{"className":"toc"},"children":[{"type":"element","tagName":"ol","properties":{"className":"toc-level toc-level-1"},"children":[{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"exploring-a-nix-flake"},"children":[{"type":"text","value":"Exploring a Nix flake"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#exploring-a-nix-flake"},"children":[{"type":"text","value":"Exploring a Nix flake"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"selected-list-of-attributes-for-outputs"},"children":[{"type":"text","value":"Selected list of attributes for outputs"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#selected-list-of-attributes-for-outputs"},"children":[{"type":"text","value":"Selected list of attributes for outputs"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"flake-templates"},"children":[{"type":"text","value":"Flake templates"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#flake-templates"},"children":[{"type":"text","value":"Flake templates"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"nix-registry"},"children":[{"type":"text","value":"Nix registry"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#nix-registry"},"children":[{"type":"text","value":"Nix registry"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"more-information-about-flakes"},"children":[{"type":"text","value":"More information about flakes"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#more-information-about-flakes"},"children":[{"type":"text","value":"More information about flakes"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["special-block","block-note"]},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"As of 2021-06-30, the version used for this note is at v2.3 so it needs to be invoked with the unstable version.\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What are Nix flakes?\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A self-contained Nix module that takes inputs (can be from other flakes) and create outputs.\nIt is comparable to "},{"type":"element","tagName":"a","properties":{"href":"https://guix.gnu.org/manual/en/html_node/Channels.html"},"children":[{"type":"text","value":"Guix channels"}]},{"type":"text","value":" (or the NUR) in the way any arbitrary value can be exported, thus extending a Nix module in any direction the author can make it to.\nAlso, it supercedes Nix channels as a way to manage your system.\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"So, why use flakes?\n"}]},{"type":"element","tagName":"ul","properties":{},"child