Skip to content

How Templates work

Clan offers the ability to use templates for creating different resources. It comes with some <builtin> templates and discovers all exposed templates from its flake's inputs

For example one can list all current templates like this:

$ clan templates list
Available 'clan' templates
├── <builtin>
│   ├── default: Initialize a new clan flake
│   ├── flake-parts: Flake-parts
│   └── minimal: for clans managed via (G)UI
└── inputs.self:
    ├── default: Initialize a new clan flake
    ├── flake-parts: Flake-parts
    └── minimal: for clans managed via (G)UI
Available 'disko' templates
├── <builtin>
│   └── single-disk: A simple ext4 disk with a single partition
└── inputs.self:
    └── single-disk: A simple ext4 disk with a single partition
Available 'machine' templates
├── <builtin>
│   ├── demo-template: Demo machine for the CLAN project
│   ├── flash-installer: Initialize a new flash-installer machine
│   ├── new-machine: Initialize a new machine
│   └── test-morph-template: Morph a machine
└── inputs.self:
    ├── demo-template: Demo machine for the CLAN project
    ├── flash-installer: Initialize a new flash-installer machine
    ├── new-machine: Initialize a new machine
    └── test-morph-template: Morph a machine

Using <builtin> Templates

Templates are referenced via the --template selector

clan-core ships its native/builtin templates. Those are referenced if the selector is a plain string ( without # or ./. )

For example:

clan flakes create --template=flake-parts

would use the native <builtin>.flake-parts template

Selectors follow nix flake reference#attribute syntax

Selectors follow a very similar pattern as Nix's native attribute selection behavior.

Just like nix build . would build packages.x86-linux.default of the flake in ./.

clan flakes create --template=. would create a clan from your local default clan template (templates.clan.default).

In fact this command would be equivalent, just make it more explicit

clan flakes create --template=.#clan.templates.clan.default (explicit path)

Remote templates

Just like with Nix you could specify a remote url or path to the flake containing the template

clan flakes create --template=github:owner/repo#foo

Implementation Note

Not all features of Nix's attribute selection are currently matched. There are minor differences in case of unexpected behavior please create an issue