Skip to content

From Flake to Den

Suppose you have a flake like this with a nixosConfigurations.igloo:

flake.nix
{
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>
];
};
};
}
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”
flake.nix
{
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 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:

flake.nix
{
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
};
}

Even more, if you have defined all flake outputs as Dendritic flake outputs inside modules/ your final flake.nix becomes:

flake.nix
{
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;
}

You can now head over to other guides or the reference:

Contribute Community Sponsor