Skip to content

Schema

Each of host, user, home configuration objects have freeform-types, meaning you can assign any attribute into them as meta-data.

However, at times you might want to have shared meta-data between all hosts or all users.

The base modules, den.schema.* serve for this purpose. They are not aspects, they are meta-data (the attributes of host) that aspects can later read for providing configuration.

For example, instead of:

den.hosts.x86_64-linux.igloo = {
hardened = true; # custom free-form metadata
# repetitive
users.alice.classes = [ "homeManager" ];
users.bob.classes = [ "homeManager" ];
};

You can do:

# This is not an aspect, it is a meta-configuration of the host capabilities.
den.schema.host = { host, lib, ... }: {
options.hardened = lib.mkEnableOption "Is it secure";
config.hardened = lib.mkDefault true;
};
# The meta-configuration module for all users
den.schema.user = { user, lib, ... }: {
config.classes = lib.mkDefault [ "homeManager" ];
};

All hosts you create will be hardened = true by default. And aspects will be able to read host.hardened value.

Base modules merged into all hosts, users, or homes.

OptionTypeDescription
den.schema.confdeferredModuleApplied to host, user, and home
den.schema.hostdeferredModuleApplied to all hosts (imports conf)
den.schema.userdeferredModuleApplied to all users (imports conf)
den.schema.homedeferredModuleApplied to all homes (imports conf)
den.schema.conf = { lib, ... }: {
# shared across all host/user/home declarations
};
den.schema.host = { ... }: {
# host-specific base config
};

Entity kinds (host, user, home) are derived from the keys of den.schema. The pipeline uses the kind name to dispatch policies and resolve entities. Adding a key to den.schema registers a new entity kind.

Type: attrsOf systemType

Keyed by system string (e.g., "x86_64-linux"). Each system contains host definitions as freeform attribute sets.

den.hosts.x86_64-linux.myhost = {
users.vic = {};
};
OptionTypeDefaultDescription
namestrattr nameConfiguration name
hostNamestrnameNetwork hostname
systemstrparent keyPlatform (e.g., x86_64-linux)
classstrauto"nixos" or "darwin" based on system
aspectrawden.aspects.<name>Resolved aspect attrset for this host
descriptionstrautoclass.hostName@system
resolvedrawautoResolved aspect from context pipeline (see below)
usersattrsOf userType{}User accounts on this host
policieslistOf str[]Additional policies activated for this host. Core policies are always active.
collisionPolicynull | enumnullClass module collision policy for this entity: "error", "den-wins", or "class-wins". See Class Modules.
instantiaterawautoOS builder function
intoAttrlistOf strautoFlake output path
*den.schema.host optionsOptions from base module
*free-form attributes
ClassDefault
nixosinputs.nixpkgs.lib.nixosSystem
darwininputs.darwin.lib.darwinSystem
systemManagerinputs.system-manager.lib.makeSystemConfig
ClassDefault
nixos[ "nixosConfigurations" name ]
darwin[ "darwinConfigurations" name ]
systemManager[ "systemConfigs" name ]

Type: attrsOf userType

OptionTypeDefaultDescription
namestrattr nameUser configuration name
userNamestrnameSystem account name
classeslistOf str[ "user" ]Nix classes this user participates in
aspectrawden.aspects.<name>Resolved aspect attrset
policieslistOf str[]Additional policies activated for this user. Core policies are always active.
collisionPolicynull | enumnullClass module collision policy: "error", "den-wins", or "class-wins". See Class Modules.
resolvedrawautoResolved aspect from context pipeline (see below)
*den.schema.user optionsOptions from base module
*free-form attributes

Freeform: additional attributes pass through to the user module.

Type: attrsOf homeSystemType

Standalone home-manager configurations, keyed by system string.

den.homes.x86_64-linux.vic = {};
OptionTypeDefaultDescription
namestrattr nameHome configuration name
userNamestrnameUser account name
systemstrparent keyPlatform system
classstr"homeManager"Home management class
aspectrawden.aspects.<name>Resolved aspect attrset
descriptionstrautohome.userName@system
pkgsrawinputs.nixpkgs.legacyPackages.$sysNixpkgs instance
instantiaterawinputs.home-manager.lib.homeManagerConfigurationBuilder
policieslistOf str[]Additional policies activated for this home. Core policies are always active.
collisionPolicynull | enumnullClass module collision policy: "error", "den-wins", or "class-wins". See Class Modules.
resolvedrawautoResolved aspect from context pipeline (see below)
intoAttrlistOf str[ "homeConfigurations" name ]Output path
*den.schema.home optionsOptions from base module
*free-form attributes

Every entity (host, user, home) has a resolved attribute — the aspect produced by running the entity through the resolution pipeline. This is auto-derived and used internally by mainModule to produce the entity’s final configuration.

Contribute Community Sponsor