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.ctx.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.flake-aspects.url = "github:vic/flake-aspects"; 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 ]; }; };}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.flake-aspects.url = "github:vic/flake-aspects"; 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.flake-aspects.url = "github:vic/flake-aspects"; 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: