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
};

A schema entry also accepts two list attributes, stripped before the module merge and consumed by the resolution pipeline:

AttributeTypeDescription
includeslistOf rawAspects/policies activated for every entity of this kind
excludeslistOf rawAspects/policies suppressed for every entity of this kind
# Activate a policy for every host
den.schema.host.includes = [ den.policies.host-to-peers ];

See Policy Activation for how includes drives activation.

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. Den pre-registers fleet as an empty kind used by the diagram and fleet-view machinery.

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
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
hostrawparent hostThe host this user belongs to
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. A key of the form user@host binds the home to an existing host’s user; a bare key declares an unbound standalone home.

den.homes.x86_64-linux.vic = {};
OptionTypeDefaultDescription
namestrparsed nameHome configuration name (the part before @ in a user@host key)
userNamestrparsed nameUser account name
hostNamenull | strparsed hostBound host name, or null for unbound standalone homes (the part after @)
hostrawresolved hostBound host entity, or null when standalone
userrawresolved userBound user entity, or null when standalone
systemstrparent keyPlatform system
classstr"homeManager"Home management class
aspectrawden.aspects.<name>Resolved aspect attrset
descriptionstrautohome.name@system
pkgsrawinputs.nixpkgs.legacyPackages.$sysNixpkgs instance
instantiaterawinputs.home-manager.lib.homeManagerConfigurationBuilder
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