Added more notes as I developed the Guix overlay for NixOS over time. It does have a nice experience, overall (albeit clunky one due to the documentation).
39 KiB
Nix flakes
- Exploring a Nix flake
- Selected list of attributes for outputs
- Flake templates
- Nix flake registry
- Flake lockfile
nix --version
nix (Nix) 2.11.0
What are Nix flakes?
A self-contained Nix module that takes inputs (can be from other flakes) and create outputs. It is comparable to Guix channels (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.
So, why use flakes?
- Since it is self-contained, it is easier to compose and develop environments for projects.
- It is more declarative compared to Nix channels.
- Provides a structure for discoverability through exploring the output.
- In case you're using NixOS, it also provides an easier way to extend it with third-party custom modules.
Exploring a Nix flake
To get started with a flake, you can quickly create one with nix flake init
.
This will create flake.nix
which is also required for Nix to recognize the project as a flake.
Here's the skeleton of a flake.
{
description = "A basic flake.";
inputs = {};
outputs = {};
}
It is really just an attribute set that mainly deals with three attributes:
description
which is self-descriptive enough to see what's it for. ;pinputs
which contains inputs (that are other flakes) to be used for…- …the
outputs
which is a set or a function that returns an attribute set to be exported.
Here's a real example of a basic flake.
{
description = "A basic flake with some real inputs this time.";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs";
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = attrs@{ self, nixpkgs, home-manager, ... }: {
homeManagerConfiguration = import ./hmUsers;
packages.x86_64-linux = {
hello = nixpkgs.pkgs.hello;
};
};
}
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.
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., nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.11"
, home-manager.url = "github:nix-community/home-manager/781d25b315def05cd7ede3765226c54216f0b1fe"
), this isn't really necessary for the most part as we have lockfiles to secure our dependencies version.
These lockfiles can be found at flake.lock
where complete metadata for the flakes are found.
Selected list of attributes for outputs
While you can export attributes of any type, there are common attributes you'll mostly see.
As an example, here's the flake of my NixOS configuration.
nix flake show github:foo-dogsquared/nixos-config --no-write-lock-file | nix run nixpkgs#gnused -- 's/\x1b\[[0-9;]*m//g'
github:foo-dogsquared/nixos-config/a545a20880888a88b7d5217f3906c4740313f0c1 ├───devShells │ └───x86_64-linux │ ├───default: development environment 'nix-shell' │ ├───flatpak: development environment 'nix-shell' │ ├───gnome: development environment 'nix-shell' │ ├───gnu: development environment 'nix-shell' │ ├───guile: development environment 'nix-shell' │ ├───guile3: development environment 'nix-shell' │ ├───hugo: development environment 'nix-shell' │ ├───nix: development environment 'nix-shell' │ ├───rust: development environment 'nix-shell' │ └───tic-80: development environment 'nix-shell' ├───formatter │ └───x86_64-linux: package 'nixpkgs-fmt-1.3.0' ├───homeManagerConfigurations: unknown ├───homeManagerModules: unknown ├───lib: unknown ├───nixosConfigurations │ ├───bootstrap: NixOS configuration │ ├───graphical-installer: NixOS configuration │ └───ni: NixOS configuration ├───nixosModules │ ├───programs: NixOS module │ ├───services: NixOS module │ └───workflows: NixOS module ├───overlays │ └───default: Nixpkgs overlay ├───packages │ └───x86_64-linux │ ├───artem: package 'artem-1.1.5' │ ├───auto-editor: package 'auto-editor-22w32a' │ ├───awesome-cli: package 'awesome-cli-0.7.2' │ ├───clidle: package 'clidle-unstable-2022-07-07' │ ├───cosmic-launcher: package 'cosmic-launcher-2022-08-12' │ ├───cursedgl: package 'cursedgl-0.4.0' │ ├───distant: package 'distant-0.16.4' │ ├───doggo: package 'doggo-0.5.4' │ ├───domterm: package 'domterm-unstable-2022-07-22' │ ├───freerct: package 'freerct-0.1' │ ├───furtherance: package 'furtherance-1.5.3' │ ├───gnome-extension-manager: package 'gnome-extension-manager-2022-07-20' │ ├───gnome-info-collect: package 'gnome-info-collect-1.0-7' │ ├───gnome-search-provider-recoll: package 'python3.10-gnome-search-provider-recoll-1.1.1' │ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-16' │ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2022-06-25' │ ├───gol-c: package 'GOL-C-unstable-2022-03-25' │ ├───gradience: package 'gradience-0.2.2' │ ├───guile-config: package 'guile-config-0.5.0' │ ├───guile-hall: package 'guile-hall-0.4.1' │ ├───hush-shell: package 'hush-0.1.4-alpha' │ ├───ictree: package 'ictree-1.0.1' │ ├───libadwaita-latest: package 'libadwaita-2022-07-27' │ ├───libcs50: package 'libcs50-11.0.1' │ ├───license-cli: package 'license-cli-2.6.1' │ ├───moac: package 'moac-2.0.2' │ ├───mopidy-beets: package 'mopidy-beets-4.0.1' │ ├───mopidy-funkwhale: package 'mopidy-funkwhale-1.0' │ ├───mopidy-internetarchive: package 'mopidy-internetarchive-3.0.1' │ ├───nautilus-annotations: package 'nautilus-annotations-0.8.4' │ ├───neuwaita-icon-theme: package 'neuwaita-icon-theme-unstable-2022-05-22' │ ├───onagre: package 'onagre-1.0.0-alpha.0' │ ├───pop-launcher: package 'pop-launcher-1.2.1' │ ├───pop-launcher-plugin-brightness: package 'python3.10-pop-launcher-plugin-brightness-2022-08-07' │ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0' │ ├───pop-launcher-plugin-jetbrains: package 'pop-launcher-plugin-jetbrains-2022-08-07' │ ├───python-material-color-utilities: package 'material-color-utilities-python-0.1.3' │ ├───segno: package 'python3.10-segno-1.4.1' │ ├───smile: package 'smile-1.7.0' │ ├───"swh/aiohttp-utils": package 'python3.10-aiohttp-utils-3.1.1' │ ├───"swh/attrs-strict": package 'python3.10-attrs_strict-1.0.0' │ ├───"swh/swh-auth": package 'python3.10-swh-auth-0.6.6' │ ├───"swh/swh-core": package 'python3.10-swh-core-2.13.1' │ ├───"swh/swh-fuse": package 'python3.10-swh-fuse-1.0.5' │ ├───"swh/swh-model": package 'python3.10-swh-model-6.3.1' │ ├───"swh/swh-web-client": package 'python3.10-swh-web-client-0.5.0' │ ├───text-engine: package 'text-engine-0.1.0' │ ├───thokr: package 'thokr-0.4.1' │ ├───tic-80: package 'tic-80-unstable-2022-01-18' │ ├───vgc: package 'vgc-unstable-2022-08-27' │ ├───vipsdisp: package 'vipsdisp-2.4.1' │ ├───vpaint: package 'vpaint-2022-01-11' │ ├───watc: package 'watc-0.1.2' │ ├───wayback: package 'wayback-0.17.0' │ └───wzmach: package 'wzmach-1.0.0' └───templates ├───basic-devshell: template: Basic development shell template ├───basic-overlay-flake: template: Basic overlay as a flake └───default: template: Basic development shell template
packages.${system}.${package}
(orpackages.${system}.${package}
) is mainly expected for packages. This allows for easy building — e.g.,nix build nixpkgs#hello
will refer todefaultPackage.${system}.hello
. Another command that expects this isnix run ${PACKAGE}
(e.g.,nix run nixpkgs#hello
).nixosConfigurations.${host}
is a NixOS host configuration. Each attribute contain a set similar to the traditional set from/etc/nixos/configuration.nix
. This is very beneficial for quickly installing only with flakes — e.g.,nixos-install --flake github:foo-dogsquared/nixos-config#zilch
will install withnixosConfigurations.zilch
. However, attributes should be created withlib.nixosSystem
fromnixpkgs
flake.nixosModules.${module}
is a roam:NixOS modules, allowing you to extend NixOS further. These are expected to be similar NixOS modules from nixpkgs.templates.${name}
is a template that has the attributepath
anddescription
. See /foodogsquared/wiki/src/branch/master/notebook/Flake%20templates for more details about how it's used.devShells.${system}.${name}
is an attribute set of derivations intended for development shells which are mainly consumed bynix develop
subcommand. The subcommand will also set up some things such as the build environment containing the build inputs and environment variables.
Flake templates
Flakes can have templates to get started with.
They can be used with nix flake init ${TEMPLATE}
.
You can export it in your flakes through the templates
attribute.
templates
is expected to be an attribute set with each attribute representing a template.
By default, we have the templates
flake from the global registry pointed to NixOS/templates Git repo which can be a starting example.
Take note templates are only static with no templating capabilities whatsoever unlike something like Cookiecutter.
Nix flake registry
Per the Nix manual:
Flake registries are a convenience feature that allows you to refer to flakes using symbolic identifiers such as
nixpkgs
, rather than full URLs such asgit://github.com/NixOS/nixpkgs
.
Here's an example of the registry list with some overriden flakes such as the nixpkgs
flake following from my NixOS configuration.
nix registry list
user flake:custom-nixpkgs path:/home/foo-dogsquared/library/projects/packages/nixpkgs system flake:config path:/nix/store/azabk9fimqymv1wz4j2lb8jrygffvyfq-source?lastModified=1662173618&narHash=sha256-FrfrZvej2oneAvaLCJ5QB0DsA4ObDxVwyfWEmgmx+kY= system flake:devshell path:/nix/store/g1y1jdcjb0fvz2dgw1mbkz84d8g8j18v-source?lastModified=1660811669&narHash=sha256-V6lmsaLNFz41myppL0yxglta92ijkSvpZ+XVygAh+bU=&rev=c2feacb46ee69949124c835419861143c4016fb5 system flake:dotfiles path:/nix/store/x0rsi5lvqzzpris4z8sh52r0qin25p6h-source?lastModified=1662114691&narHash=sha256-JvRY4qlXHuo4t7kEPD5DLbCsJqQMNJ2Lfi8Bslt5Q08=&rev=7725082138516476fa48f2b0a827bc62b3699332 system flake:emacs-overlay path:/nix/store/37fzz6za5nqnw20ickl57wp14jb1cnfq-source?lastModified=1662144623&narHash=sha256-LhtXgXW4Ez0fiiDTZcaTbosS8KMiEm6HKJMnTxyIbq8=&rev=8707d84ec67b39d5655929fc974055bcb9a160fb system flake:flake-utils path:/nix/store/nbkbs33bkw54f60kv5c5y48714l00dpw-source?lastModified=1659877975&narHash=sha256-zllb8aq3YO3h8B%2fU0%2fJ1WBgAL8EX5yWf5pMj3G0NAmc=&rev=c0e246b9b83f637f4681389ecabcb2681b4f3af0 system flake:guix-overlay path:/nix/store/warpn1k8fxl9i90ylzm59qa7479q6ka5-source?lastModified=1662119991&narHash=sha256-tzIblYhiammRfGXoXsyoPUX9iDDqYMnz1b0lJY9DloA= system flake:helix-editor path:/nix/store/3vik1l2ihdkx6d0jg390b41app4g0ika-source?lastModified=1662159247&narHash=sha256-D+UirTzF4gqOnSyPpd9MOrQyRV9iaK4ktY514HtlhPo=&rev=e917a8e0be29aa3f8aaa537e0aa88e6df8ce974e system flake:home-manager path:/nix/store/3ngcv9lamdaqsxw0bixnc3zjwbr6068z-source?lastModified=1661824092&narHash=sha256-nSWLWytlXbeLrx5A+r5Pso7CvVrX5EgmIIXW%2fEXvPHQ=&rev=5bd66dc6cd967033489c69d486402b75d338eeb6 system flake:neovim-nightly-overlay path:/nix/store/awbf898silibkrdrslj5wg4al85873df-source?lastModified=1662106618&narHash=sha256-fawP7iB5o3ZD%2fVFcfv8gsB6lzGzxR1bfURikuVCpsMM=&rev=d3262c72f00252e00fc93ad2021f446450cc735e system flake:nix-alien path:/nix/store/xx9hqbq4pzcg97syqfql86g2nbh1llax-source?lastModified=1657876248&narHash=sha256-UkcXnWq9ukTFgLhxafg3cnQZmWL%2fjNgLbJbE1Geo4k4=&rev=897f10267138748956b7720c5a82bba8a90a832e system flake:nix-colors path:/nix/store/07zfr4blpnyxn697byahlb7znz8rm9xm-source?lastModified=1661006226&narHash=sha256-OytVjY%2fW1ASw+N+xrCRaKhcs76ZIcrVRf9xXhOnWzno=&rev=861546e123ef13c480338edbad8c6f2e7baf0777 system flake:nix-ld path:/nix/store/53hfjz1qjg0k7w29z0c57lxjmqkimpsv-source?lastModified=1652641841&narHash=sha256-TTBz20XR2vmvOSDu8hXcbHbOEI0t%2fIWq8vZuRKyep1E=&rev=c25cc4b5ec65f03c2bb96f927ae724a59c51d7ee system flake:nixos-generators path:/nix/store/dawikzqa2bhnp5pqf0yiy3jiw6c8jhj0-source?lastModified=1660727616&narHash=sha256-zYTIvdPMYMx%2fEYqXODAwIIU30RiEHqNHdgarIHuEYZc=&rev=adccd191a0e83039d537e021f19495b7bad546a1 system flake:nixpkgs path:/nix/store/8x9s4zv7dzmwxmm8lhsxk3nf8lxlh52q-source?lastModified=1662019588&narHash=sha256-oPEjHKGGVbBXqwwL+UjsveJzghWiWV0n9ogo1X6l4cw=&rev=2da64a81275b68fdad38af669afeda43d401e94b system flake:nur path:/nix/store/f6d0qa1pn9cljmc8xxa0bply4im4b7jj-source?lastModified=1662170849&narHash=sha256-bIY4zURNsvaUK2eVoMz02lBDZPLwXP2KzinNvEWtlsw=&rev=258028926ec1a0976a6f9ec1c106e7cc1345f0c0 system flake:rust-overlay path:/nix/store/8pzvk34qgr1nm150g328gcd4qzrnx8vq-source?lastModified=1662173844&narHash=sha256-+ZgW98Y8fZkgFSylE+Mzalumw+kw3SVivZznbJqQaj8=&rev=8ac6d40380dc4ec86f1ff591d5c14c8ae1d77a18 system flake:sops-nix path:/nix/store/8vk2k07z2kr8r9hhls0fgv828na4fpr7-source?lastModified=1661660105&narHash=sha256-3ITdkYwsNDh2DRqi7FZOJ92ui92NmcO6Nhj49u+JjWY=&rev=d92fba1bfc9f64e4ccb533701ddd8590c0d8c74a global flake:agda github:agda/agda global flake:arion github:hercules-ci/arion 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:emacs-overlay github:nix-community/emacs-overlay global flake:fenix github:nix-community/fenix global flake:flake-parts github:hercules-ci/flake-parts global flake:flake-utils github:numtide/flake-utils global flake:gemini github:nix-community/flake-gemini global flake:hercules-ci-effects github:hercules-ci/hercules-ci-effects global flake:hercules-ci-agent github:hercules-ci/hercules-ci-agent 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:nix-darwin github:LnL7/nix-darwin global flake:nixops github:NixOS/nixops global flake:nixos-hardware github:NixOS/nixos-hardware global flake:nixos-homepage github:NixOS/nixos-homepage global flake:nixos-search github:NixOS/nixos-search 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:poetry2nix github:nix-community/poetry2nix global flake:nix-serve github:edolstra/nix-serve global flake:nickel github:tweag/nickel global flake:bundlers github:NixOS/bundlers global flake:pridefetch github:SpyHoodle/pridefetch global flake:helix github:helix-editor/helix global flake:sops-nix github:Mic92/sops-nix
So how does a flake registry work?
- It is managed through
nix registry
subcommand or setnix.registry
in your system configuration. - Registries are primarily written as JSON files in certain files (e.g.,
$XDG_CONFIG_HOME/nix/registry
,/etc/nix/registry.json
). For more information, see the registry format from the manual. Unlike the traditional Nix channels, the inclusion of arbitrary files and their locations doesn't seem to affect the reproducibility since it is mostly used as a convenience feature after all. - 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.,
nix registry pin
, throughnix.registry
while setting the NixOS systems inflake.nix
). - There are primarily three registries to worry about: user, system, and global.
This is also the reason it downloads something why each time you invoke a Nix-related command (e.g., nix search
, nix edit
). 1
If you're using Nix flakes for your NixOS configuration, it is recommended to set the nixpkgs
registry item to the nixpkgs input (e.g., nix.registry.nixpkgs.url = nixpkgs;
).
Flake lockfile
It is unreproducible to make our inputs to only set like the following list.
- github:NixOS/nixpkgs/nixos-unstable
- github:foo-dogsquared/nix-overlay-guix
- github:nix-community/NUR
- git+/home/user/projects/NUR
That's because Nix resolves the previous list of inputs to their latest revisions each time Nix refers to the input. You could see this effect by making use of Nix commands that takes a flake as an input.
Let's take the most common and frustrating use case that many will encounter.
nix search nixpkgs hello
Assuming nixpkgs
from the flake registry points to github:NixOS/nixpkgs
(which you can just replace nixpkgs
with the URL, if you've pinned it already), this will resolve to the latest revision from the given URL.
If you're using the above command often, you'll know this will run slow since you're fetching and evaluating a new version of the whole nixpkgs repo each time.
To mitigate, we could accurately describe the inputs by including the revision hash.
- github:NixOS/nixpkgs/nixos-unstable/2da64a81275b68fdad38af669afeda43d401e94b
- github:foo-dogsquared/nix-overlay-guix/e35a7caf5b49fd32864027ecc644bd21a6bd8838
- github:nix-community/NUR/d8f45eb686d855bbbaca3b39c1215675e2a5ed7a
- git+/home/user/projects/NUR/thisisnotmadeupatalldontworryaboutit
However, it can make for a pretty tedious user experience. If you want to update, you'll have to manually change the revision hash each time. Why don't we automate it in some way?
Fortunately, Nix already does this by capturing the resolved versions and dependencies of a list of inputs (this list of flake inputs as an example) and storing them in a file.
The file is specifically referred to as a lockfile.
This is usually stored in a file called flake.lock
alongside your flake definition file (i.e., flake.nix
).
With the lockfile present, Nix will now use the captured versions from the lockfile as the inputs defined in flake.nix
.
Interacting with the lock file
Most of the interaction with the lockfile is done with the nix flake
subcommand.
This subcommand encompasses other operations with the flake but to list some of them…
nix flake update
will resolve the inputs from the flake definition and capture the updated versions to the lockfile. One of the nicer features with the current experimental version of the Nix CLI is--commit-lock-file
which creates a commit with a formatted message of updated inputs. 2nix flake lock
will store missing inputs in the lockfile. This command also has fine-grained control in controlling the lockfile in some ways. For example, you can update a specific inputa
withnix flake --update-input a
.
Lockfile format
The flake lockfile format can vary especially that it has different versions. But for the most part, exploring a lockfile is pretty similar as a lockfile is simply a JSON file containing metadata regarding the flake inputs. For example, this is the whole flake lockfile of this notebook which is a simple flake intended to deliver the environment needed for this notebook including a bunch of language interpreters and programs for Org mode: Babel.
jq --raw-output '.' flake.lock
{ "nodes": { "nixpkgs": { "locked": { "lastModified": 1653936696, "narHash": "sha256-M6bJShji9AIDZ7Kh7CPwPBPb/T7RiVev2PAcOi4fxDQ=", "owner": "NixOS", "repo": "nixpkgs", "rev": "ce6aa13369b667ac2542593170993504932eb836", "type": "github" }, "original": { "owner": "NixOS", "ref": "22.05", "repo": "nixpkgs", "type": "github" } }, "root": { "inputs": { "nixpkgs": "nixpkgs" } } }, "root": "root", "version": 7 }
At least for this example, the format itself is simple as it only contains 3 keys:
nodes
contains the graph of the inputs (and its dependencies). In theroot
contains the name of the root node (fromnodes
).version
is the revision number for the lockfile format.
There are more complex examples such as my NixOS configuration.
{ "nodes": { "base16-schemes": { "flake": false, "locked": { "lastModified": 1654895891, "narHash": "sha256-xYYmZkHnyLCUBAkqkZ7v1Lc5m39857MukQLMRtGuvdk=", "owner": "base16-project", "repo": "base16-schemes", "rev": "7c247f734eac7f04518c6e28d098635ee8dcabf5", "type": "github" }, "original": { "owner": "base16-project", "repo": "base16-schemes", "type": "github" } }, "crane": { "flake": false, "locked": { "lastModified": 1661875961, "narHash": "sha256-f1h/2c6Teeu1ofAHWzrS8TwBPcnN+EEu+z1sRVmMQTk=", "owner": "ipetkov", "repo": "crane", "rev": "d9f394e4e20e97c2a60c3ad82c2b6ef99be19e24", "type": "github" }, "original": { "owner": "ipetkov", "repo": "crane", "type": "github" } }, "devshell": { "inputs": { "flake-utils": [ "flake-utils" ], "nixpkgs": [ "nixpkgs" ] }, "locked": { "lastModified": 1660811669, "narHash": "sha256-V6lmsaLNFz41myppL0yxglta92ijkSvpZ+XVygAh+bU=", "owner": "numtide", "repo": "devshell", "rev": "c2feacb46ee69949124c835419861143c4016fb5", "type": "github" }, "original": { "owner": "numtide", "repo": "devshell", "type": "github" } }, "devshell_2": { "flake": false, "locked": { "lastModified": 1660811669, "narHash": "sha256-V6lmsaLNFz41myppL0yxglta92ijkSvpZ+XVygAh+bU=", "owner": "numtide", "repo": "devshell", "rev": "c2feacb46ee69949124c835419861143c4016fb5", "type": "github" }, "original": { "owner": "numtide", "repo": "devshell", "type": "github" } }, "dotfiles": { "flake": false, "locked": { "lastModified": 1662114691, "narHash": "sha256-JvRY4qlXHuo4t7kEPD5DLbCsJqQMNJ2Lfi8Bslt5Q08=", "owner": "foo-dogsquared", "repo": "dotfiles", "rev": "7725082138516476fa48f2b0a827bc62b3699332", "type": "github" }, "original": { "owner": "foo-dogsquared", "repo": "dotfiles", "type": "github" } }, "dream2nix": { "inputs": { "alejandra": [ "helix-editor", "nci", "nixpkgs" ], "crane": "crane", "devshell": [ "helix-editor", "nci", "devshell" ], "flake-utils-pre-commit": [ "helix-editor", "nci", "nixpkgs" ], "gomod2nix": [ "helix-editor", "nci", "nixpkgs" ], "mach-nix": [ "helix-editor", "nci", "nixpkgs" ], "nixpkgs": [ "helix-editor", "nci", "nixpkgs" ], "poetry2nix": [ "helix-editor", "nci", "nixpkgs" ], "pre-commit-hooks": [ "helix-editor", "nci", "nixpkgs" ] }, "locked": { "lastModified": 1662083074, "narHash": "sha256-GL4/CLKPYUzkKD1l7oi2XB+vi3z4xGpCVLDdG3tRqvs=", "owner": "nix-community", "repo": "dream2nix", "rev": "c6c039fcc6abdf4d828b940b576944a224cf8622", "type": "github" }, "original": { "owner": "nix-community", "repo": "dream2nix", "type": "github" } }, "emacs-overlay": { "inputs": { "flake-utils": [ "flake-utils" ], "nixpkgs": [ "nixpkgs" ] }, "locked": { "lastModified": 1662144623, "narHash": "sha256-LhtXgXW4Ez0fiiDTZcaTbosS8KMiEm6HKJMnTxyIbq8=", "owner": "nix-community", "repo": "emacs-overlay", "rev": "8707d84ec67b39d5655929fc974055bcb9a160fb", "type": "github" }, "original": { "owner": "nix-community", "repo": "emacs-overlay", "type": "github" } }, "flake-compat": { "flake": false, "locked": { "lastModified": 1650374568, "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=", "owner": "edolstra", "repo": "flake-compat", "rev": "b4a34015c698c7793d592d66adbab377907a2be8", "type": "github" }, "original": { "owner": "edolstra", "repo": "flake-compat", "type": "github" } }, "flake-utils": { "locked": { "lastModified": 1659877975, "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=", "owner": "numtide", "repo": "flake-utils", "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0", "type": "github" }, "original": { "owner": "numtide", "repo": "flake-utils", "type": "github" } }, "flake-utils_2": { "locked": { "lastModified": 1656928814, "narHash": "sha256-RIFfgBuKz6Hp89yRr7+NR5tzIAbn52h8vT6vXkYjZoM=", "owner": "numtide", "repo": "flake-utils", "rev": "7e2a3b3dfd9af950a856d66b0a7d01e3c18aa249", "type": "github" }, "original": { "owner": "numtide", "repo": "flake-utils", "type": "github" } }, "flake-utils_3": { "locked": { "lastModified": 1644229661, "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", "owner": "numtide", "repo": "flake-utils", "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "type": "github" }, "original": { "owner": "numtide", "repo": "flake-utils", "type": "github" } }, "guix-overlay": { "inputs": { "nixpkgs": [ "nixpkgs" ] }, "locked": { "lastModified": 1662119991, "narHash": "sha256-kpkxJioBNZm73Haob0yGJsZ+fQs0fdmBzy3Ojhcx7Ik=", "owner": "foo-dogsquared", "repo": "nix-overlay-guix", "rev": "e35a7caf5b49fd32864027ecc644bd21a6bd8838", "type": "github" }, "original": { "type": "git", "url": "file:///home/foo-dogsquared/library/projects/software/nix-overlay-guix" } }, "helix-editor": { "inputs": { "nci": "nci", "nixpkgs": [ "nixpkgs" ], "rust-overlay": "rust-overlay" }, "locked": { "lastModified": 1662159247, "narHash": "sha256-D+UirTzF4gqOnSyPpd9MOrQyRV9iaK4ktY514HtlhPo=", "owner": "helix-editor", "repo": "helix", "rev": "e917a8e0be29aa3f8aaa537e0aa88e6df8ce974e", "type": "github" }, "original": { "owner": "helix-editor", "repo": "helix", "type": "github" } }, "home-manager": { "inputs": { "nixpkgs": [ "nixpkgs" ], "utils": [ "flake-utils" ] }, "locked": { "lastModified": 1661824092, "narHash": "sha256-nSWLWytlXbeLrx5A+r5Pso7CvVrX5EgmIIXW/EXvPHQ=", "owner": "nix-community", "repo": "home-manager", "rev": "5bd66dc6cd967033489c69d486402b75d338eeb6", "type": "github" }, "original": { "owner": "nix-community", "repo": "home-manager", "type": "github" } }, "nci": { "inputs": { "devshell": "devshell_2", "dream2nix": "dream2nix", "nixpkgs": [ "helix-editor", "nixpkgs" ], "rust-overlay": [ "helix-editor", "rust-overlay" ] }, "locked": { "lastModified": 1662143940, "narHash": "sha256-3eJfehnZLWJGXylfpAMeLR0Q3sx8pAjGiHBQPqOH9+U=", "owner": "yusdacra", "repo": "nix-cargo-integration", "rev": "e83f2598aecbe1114783ff9bdae0b85939de35a3", "type": "github" }, "original": { "owner": "yusdacra", "repo": "nix-cargo-integration", "type": "github" } }, "neovim-flake": { "inputs": { "flake-utils": "flake-utils_3", "nixpkgs": [ "neovim-nightly-overlay", "nixpkgs" ] }, "locked": { "dir": "contrib", "lastModified": 1662099377, "narHash": "sha256-RJ3lwhDotzKO0u94/Qj93CeQ1KmPtlohUpdMYKbBjnM=", "owner": "neovim", "repo": "neovim", "rev": "ce80b8f50d7d56ac12aa06a64a65799ec18b69af", "type": "github" }, "original": { "dir": "contrib", "owner": "neovim", "repo": "neovim", "type": "github" } }, "neovim-nightly-overlay": { "inputs": { "flake-compat": "flake-compat", "neovim-flake": "neovim-flake", "nixpkgs": [ "nixpkgs" ] }, "locked": { "lastModified": 1662106618, "narHash": "sha256-fawP7iB5o3ZD/VFcfv8gsB6lzGzxR1bfURikuVCpsMM=", "owner": "nix-community", "repo": "neovim-nightly-overlay", "rev": "d3262c72f00252e00fc93ad2021f446450cc735e", "type": "github" }, "original": { "owner": "nix-community", "repo": "neovim-nightly-overlay", "type": "github" } }, "nix-alien": { "inputs": { "flake-utils": [ "flake-utils" ], "nixpkgs": [ "nixpkgs" ], "poetry2nix": "poetry2nix" }, "locked": { "lastModified": 1657876248, "narHash": "sha256-UkcXnWq9ukTFgLhxafg3cnQZmWL/jNgLbJbE1Geo4k4=", "owner": "thiagokokada", "repo": "nix-alien", "rev": "897f10267138748956b7720c5a82bba8a90a832e", "type": "github" }, "original": { "owner": "thiagokokada", "repo": "nix-alien", "type": "github" } }, "nix-colors": { "inputs": { "base16-schemes": "base16-schemes", "nixpkgs-lib": "nixpkgs-lib" }, "locked": { "lastModified": 1661006226, "narHash": "sha256-OytVjY/W1ASw+N+xrCRaKhcs76ZIcrVRf9xXhOnWzno=", "owner": "misterio77", "repo": "nix-colors", "rev": "861546e123ef13c480338edbad8c6f2e7baf0777", "type": "github" }, "original": { "owner": "misterio77", "repo": "nix-colors", "type": "github" } }, "nix-ld": { "inputs": { "nixpkgs": [ "nixpkgs" ], "utils": "utils" }, "locked": { "lastModified": 1652641841, "narHash": "sha256-TTBz20XR2vmvOSDu8hXcbHbOEI0t/IWq8vZuRKyep1E=", "owner": "Mic92", "repo": "nix-ld", "rev": "c25cc4b5ec65f03c2bb96f927ae724a59c51d7ee", "type": "github" }, "original": { "owner": "Mic92", "repo": "nix-ld", "type": "github" } }, "nixlib": { "locked": { "lastModified": 1636849918, "narHash": "sha256-nzUK6dPcTmNVrgTAC1EOybSMsrcx+QrVPyqRdyKLkjA=", "owner": "nix-community", "repo": "nixpkgs.lib", "rev": "28a5b0557f14124608db68d3ee1f77e9329e9dd5", "type": "github" }, "original": { "owner": "nix-community", "repo": "nixpkgs.lib", "type": "github" } }, "nixos-generators": { "inputs": { "nixlib": "nixlib", "nixpkgs": [ "nixpkgs" ] }, "locked": { "lastModified": 1660727616, "narHash": "sha256-zYTIvdPMYMx/EYqXODAwIIU30RiEHqNHdgarIHuEYZc=", "owner": "nix-community", "repo": "nixos-generators", "rev": "adccd191a0e83039d537e021f19495b7bad546a1", "type": "github" }, "original": { "owner": "nix-community", "repo": "nixos-generators", "type": "github" } }, "nixpkgs": { "locked": { "lastModified": 1662019588, "narHash": "sha256-oPEjHKGGVbBXqwwL+UjsveJzghWiWV0n9ogo1X6l4cw=", "owner": "NixOS", "repo": "nixpkgs", "rev": "2da64a81275b68fdad38af669afeda43d401e94b", "type": "github" }, "original": { "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs-22_05": { "locked": { "lastModified": 1661656705, "narHash": "sha256-1ujNuL1Tx1dt8dC/kuYS329ZZgiXXmD96axwrqsUY7w=", "owner": "NixOS", "repo": "nixpkgs", "rev": "290dbaacc1f0b783fd8e271b585ec2c8c3b03954", "type": "github" }, "original": { "owner": "NixOS", "ref": "release-22.05", "repo": "nixpkgs", "type": "github" } }, "nixpkgs-lib": { "locked": { "lastModified": 1655599917, "narHash": "sha256-kjZbt5WdTrnjMxL79okg9TCoRUdADG50x/TWozbyTsE=", "owner": "nix-community", "repo": "nixpkgs.lib", "rev": "5fb55578aa2f1a502d636a8ac71aece57cb730bb", "type": "github" }, "original": { "owner": "nix-community", "repo": "nixpkgs.lib", "type": "github" } }, "nur": { "locked": { "lastModified": 1662170849, "narHash": "sha256-bIY4zURNsvaUK2eVoMz02lBDZPLwXP2KzinNvEWtlsw=", "owner": "nix-community", "repo": "NUR", "rev": "258028926ec1a0976a6f9ec1c106e7cc1345f0c0", "type": "github" }, "original": { "owner": "nix-community", "repo": "NUR", "type": "github" } }, "poetry2nix": { "inputs": { "flake-utils": [ "nix-alien", "flake-utils" ], "nixpkgs": [ "nix-alien", "nixpkgs" ] }, "locked": { "lastModified": 1657626303, "narHash": "sha256-O/JJ0hSBCmlx0oP8QGAlRrWn0BvlC5cj7/EZ0CCWHTU=", "owner": "nix-community", "repo": "poetry2nix", "rev": "920ba682377d5c0d87945c5eb6141ab8447ca509", "type": "github" }, "original": { "owner": "nix-community", "repo": "poetry2nix", "type": "github" } }, "root": { "inputs": { "devshell": "devshell", "dotfiles": "dotfiles", "emacs-overlay": "emacs-overlay", "flake-utils": "flake-utils", "guix-overlay": "guix-overlay", "helix-editor": "helix-editor", "home-manager": "home-manager", "neovim-nightly-overlay": "neovim-nightly-overlay", "nix-alien": "nix-alien", "nix-colors": "nix-colors", "nix-ld": "nix-ld", "nixos-generators": "nixos-generators", "nixpkgs": "nixpkgs", "nur": "nur", "rust-overlay": "rust-overlay_2", "sops-nix": "sops-nix" } }, "rust-overlay": { "inputs": { "flake-utils": "flake-utils_2", "nixpkgs": [ "helix-editor", "nixpkgs" ] }, "locked": { "lastModified": 1662087605, "narHash": "sha256-Gpf2gp2JenKGf+TylX/YJpttY2bzsnvAMLdLaxoZRyU=", "owner": "oxalica", "repo": "rust-overlay", "rev": "60c2cfaa8b90ed8cebd18b214fac8682dcf222dd", "type": "github" }, "original": { "owner": "oxalica", "repo": "rust-overlay", "type": "github" } }, "rust-overlay_2": { "inputs": { "flake-utils": [ "flake-utils" ], "nixpkgs": [ "nixpkgs" ] }, "locked": { "lastModified": 1662087605, "narHash": "sha256-Gpf2gp2JenKGf+TylX/YJpttY2bzsnvAMLdLaxoZRyU=", "owner": "oxalica", "repo": "rust-overlay", "rev": "60c2cfaa8b90ed8cebd18b214fac8682dcf222dd", "type": "github" }, "original": { "owner": "oxalica", "repo": "rust-overlay", "type": "github" } }, "sops-nix": { "inputs": { "nixpkgs": [ "nixpkgs" ], "nixpkgs-22_05": "nixpkgs-22_05" }, "locked": { "lastModified": 1661660105, "narHash": "sha256-3ITdkYwsNDh2DRqi7FZOJ92ui92NmcO6Nhj49u+JjWY=", "owner": "Mic92", "repo": "sops-nix", "rev": "d92fba1bfc9f64e4ccb533701ddd8590c0d8c74a", "type": "github" }, "original": { "owner": "Mic92", "repo": "sops-nix", "type": "github" } }, "utils": { "locked": { "lastModified": 1652372896, "narHash": "sha256-lURGussfF3mGrFPQT3zgW7+RC0pBhbHzco0C7I+ilow=", "owner": "numtide", "repo": "flake-utils", "rev": "0d347c56f6f41de822a4f4c7ff5072f3382db121", "type": "github" }, "original": { "owner": "numtide", "repo": "flake-utils", "type": "github" } } }, "root": "root", "version": 7 }