From Flake to Den
Suppose you have a flake like this with a nixosConfigurations.igloo:
{ inputs.nixpkgs = "github:nixos/nixpkgs/nixpkgs-unstable"; inputs.darwin = "github:nix-darwin/nix-darwin";
outputs = inputs: { # all your config, most importantly a NixOS like `igloo`: nixosConfigurations.igloo = lib.nixosSystem { modules = [ <all your curent NixOS modules> ]; }; darwinConfigurations.iceberg = darwinSystem { modules = [ <all your current nix-Darwin modules> ]; }; };}Step 1. A basic modules/den.nix
Section titled “Step 1. A basic modules/den.nix”{ inputs, den, lib, ... }: { imports = [ inputs.den.flakeModule ];
den.schema.user.classes = lib.mkDefault [ "homeManager" ];
den.hosts.x86_64-linux.igloo.users.tux = {};
den.hosts.aarch64-darwin.iceberg.users.tux = {};
den.aspects.igloo = { includes = [ den.provides.hostname ]; nixos = { pkgs, ... }: { environment.systemPackages = [ pkgs.hello ]; }; };
den.aspects.tux = { includes = [ den.provides.define-user den.provides.primary-user ]; homeManager = { pkgs, ... }: { packages = [ pkgs.vim ]; }; };}Den batteries like den.provides.define-user and den.provides.primary-user work cross-platform, on NixOS, Darwin and WSL.
Step 2. Use igloo NixOS module in your current flake
Section titled “Step 2. Use igloo NixOS module in your current flake”{ inputs.nixpkgs = "github:nixos/nixpkgs/nixpkgs-unstable"; inputs.darwin = "github:nix-darwin/nix-darwin"; inputs.import-tree.url = "github:vic/import-tree"; inputs.den.url = "github:vic/den";
outputs = inputs: let den = (inputs.nixpkgs.lib.evalModules { modules = [ (inputs.import-tree ./modules) ]; specialArgs.inputs = inputs; }).config;
inherit (den.den.hosts.x86_64-linux) igloo; inherit (den.den.hosts.aarch64-darwin) iceberg; in { # all your config, most importantly a NixOS like `igloo`: nixosConfigurations.igloo = nixosSystem { modules = [ <all your curent NixOS modules> igloo.mainModule ]; }; darwinConfigurations.iceberg = darwinSystem { modules = [ <all your current nix-Darwin modules> iceberg.mainModule ]; }; };}Migrating with flake-parts.
Section titled “Migrating with flake-parts.”If you are using flake-parts on your current configuration,
you will also need the following at the previous step:
den = (inputs.nixpkgs.lib.evalModules { modules = [ (inputs.import-tree ./modules) inputs.den.flakeOutputs.flake ]; specialArgs.inputs = inputs;}).config;The flakeOutputs.flake module defines a flake-parts
compatible top-level flake output to be used by Den.
See output reference for more on this.
Once Migration Completed
Section titled “Once Migration Completed”Once you have moved all your host configurations into modules/,
and no longer have a need for mixin modules into nixosConfigurations,
you can have a flake like this:
{ inputs.nixpkgs = "github:nixos/nixpkgs/nixpkgs-unstable"; inputs.darwin = "github:nix-darwin/nix-darwin"; inputs.import-tree.url = "github:vic/import-tree"; inputs.den.url = "github:vic/den";
outputs = inputs: let den = (inputs.nixpkgs.lib.evalModules { modules = [ (inputs.import-tree ./modules) ]; specialArgs.inputs = inputs; }).config; in { inherit (den.flake) nixosConfigurations darwinConfigurations;
# all other flake outputs and stuff };}Den-only flake outputs
Section titled “Den-only flake outputs”Even more, if you have defined all flake outputs as Dendritic
flake outputs inside modules/ your final flake.nix becomes:
{ inputs.nixpkgs = "github:nixos/nixpkgs/nixpkgs-unstable"; inputs.darwin = "github:nix-darwin/nix-darwin"; inputs.import-tree.url = "github:vic/import-tree"; inputs.den.url = "github:vic/den";
outputs = inputs: (inputs.nixpkgs.lib.evalModules { modules = [ (inputs.import-tree ./modules) ]; specialArgs.inputs = inputs; }).config.flake;}Next Steps
Section titled “Next Steps”You can now head over to other guides or the reference: