Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Full Flake Structure

Everything together: flake-parts integration, registry, config trees, and input collection.

my-flake/
  flake.nix                     # Auto-generated
  nix/
    flake/
      default.nix
      inputs.nix
    outputs/
      nixosConfigurations/
        server.nix
      homeConfigurations/
        alice@workstation.nix
      perSystem/
        packages.nix
        devShells.nix
        formatter.nix           # Uses __inputs
      overlays.nix
    registry/
      hosts/
        server/
          default.nix
          hardware.nix
          config/...
      modules/
        nixos/
          base.nix
          features/...
        home/
          features/
            shell/...
            devTools/...
      users/
        alice/
          default.nix
          programs/...

flake.nix (auto-generated)

Don't edit this directly. It's regenerated from __inputs declarations:

{
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    flake-parts.url = "github:hercules-ci/flake-parts";
    imp.url = "github:imp-nix/imp.lib";
    home-manager.url = "github:nix-community/home-manager";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";
    # Collected from __inputs
    treefmt-nix.url = "github:numtide/treefmt-nix";
  };
  outputs = inputs: import ./nix/flake inputs;
}

nix/flake/default.nix

The real entry point:

inputs:
flake-parts.lib.mkFlake { inherit inputs; } {
  imports = [ inputs.imp.flakeModules.default ];
  systems = [ "x86_64-linux" "aarch64-linux" ];
  imp = {
    src = ../outputs;
    registry.src = ../registry;
    registry.migratePaths = [ ../outputs ../registry ];
    flakeFile = {
      enable = true;
      coreInputs = import ./inputs.nix;
      outputsFile = "./nix/flake";
    };
  };
}

nix/outputs/perSystem/formatter.nix

Input declared inline, next to the code using it:

{
  __inputs.treefmt-nix.url = "github:numtide/treefmt-nix";

  __functor = _: { pkgs, inputs, ... }:
    inputs.treefmt-nix.lib.evalModule pkgs {
      projectRootFile = "flake.nix";
      programs.nixfmt.enable = true;
    };
}

nix/outputs/nixosConfigurations/server.nix

{ lib, inputs, imp, registry, ... }:
lib.nixosSystem {
  system = "x86_64-linux";
  specialArgs = { inherit inputs imp registry; };
  modules = imp.imports [
    registry.hosts.server
    registry.modules.nixos.base
    registry.modules.nixos.features.ssh
  ];
}

nix/registry/users/alice/default.nix

{ imp, registry, ... }:
{
  imports = [
    registry.modules.home.features.shell
    registry.modules.home.features.devTools
    (imp.configTree ./.)
  ];
  home.username = "alice";
  home.homeDirectory = "/home/alice";
  home.stateVersion = "24.05";
}

Commands

nixos-rebuild build --flake .#server
home-manager build --flake .#alice@workstation
nix run .#imp-flake      # regenerate flake.nix
nix run .#imp-registry   # check for broken refs
nix run .#imp-vis > deps.html
nix flake check
nix fmt