Sponsor Vic Dendritic Nix License CI Status

den - an aspect-oriented approach to Dendritic Nix configurations.

den and vic's dendritic libs made for you with Love++ and AI--. If you like my work, consider sponsoring

den
  • Dendritic: each module configures same concern over different Nix classes.

  • Create DRY & class-generic modules.

  • Parametric over host/home/user.

  • Share aspects across systems & repos.

  • Context-aware dependencies: user/host contributions.

  • Routable configurations.

  • Custom factories for any Nix class.

  • Use stable/unstable channels per config.

  • Freeform host/user/home schemas (no specialArgs).

  • Multi-platform, multi-tenant hosts.

  • Batteries: Opt-in, replaceable aspects.

  • Opt-in <angle/brackets> aspect resolution.

  • Templates tested along examples.

  • Concepts documented.

Need more batteries? See vic/denful.

For real-world examples, see vic/vix or this GH search.

❄️ Try it now!

Launch our template VM:

nix run github:vic/den

Or, initialize a project:

nix flake init -t github:vic/den
nix flake update den
nix run .#vm

Our default template provides an annotated quick-start.

🏠 Define Hosts, Users & Homes concisely.

See schema in _types.nix.

# modules/hosts.nix
{
  # same home-manager vic configuration
  # over laptop, macbook and standalone-hm
  den.hosts.x86-64-linux.lap.users.vic = {};
  den.hosts.aarch64-darwin.mac.users.vic = {};
  den.homes.aarch64-darwin.vic = {};
}
$ nixos-rebuild  switch --flake .#lap
$ darwin-rebuild switch --flake .#mac
$ home-manager   switch --flake .#vic

🧩 Aspect-oriented incremental features. (example)

Any module can contribute configurations to aspects.

# modules/my-laptop.nix
{ den, inputs, ... }: {

  # Example: enhance the my-laptop aspect.
  # This can be done from any file, multiple times.
  den.aspects.my-laptop = {

    # this aspect includes configurations
    # available from other aspects
    includes = [
      # your own parametric aspects
      den.aspects.workplace-vpn
      # den's opt-in batteries includes.
      den.provides.home-manager
    ];

    # any file can contribute to this aspect, so
    # best practice is to keep concerns separated,
    # each on their own file, instead of having huge
    # modules in a single file:

    # any NixOS configuration
    nixos  = { 
      # A nixos class module, see NixOS options.
      # import third-party NixOS modules
      imports = [ 
        inputs.disko.nixosModules.disko
      ];
      disko.devices = { /* ... */ };
    };
    # any nix-darwin configuration
    darwin = { 
      # import third-party Darwin modules
      imports = [ 
        inputs.nix-homebrew.darwinModules.nix-homebrew 
      ];
      nix-homebrew.enableRosetta = true;
    };
    # For all users of my-laptop
    homeManager.programs.vim.enable = true;

  };
}

# modules/vic.nix
{ den, ... }: {
  den.aspects.vic = {
    homeManager = { /* ... */ };
    # User contribs to host
    nixos.users.users = {
      vic.description = "oeiuwq";
    };
    includes = [ 
      den.aspects.tiling-wm 
      den._.primary-user 
    ];
  };
}

You are done! You know everything to start creating configurations with den.

Feel free to to explore the codebase, particularly our included batteries and tests.

Learn more at our documentation website

Join our community discussion.