Proposed by @Domen Kožar Reviewed and supported by Infinisil, Mic92, zimbatm, Ma27

Problems with the current design

933 out of [1558](https://github.com/search?q=filename%3A%2Fflake.lock+path%3A%2F+filename%3Aflake.lock&type=Code&ref=advsearch&l=&l=](https://github.com/search?q=filename%3A%2Fflake.lock+path%3A%2F+filename%3Aflake.lock&type=Code&ref=advsearch&l=&l=)) repositories using flakes on GitHub uses flake-utils. Since all flake-utils is doing is providing helpers with dealing with system in the outputs, it's a design smell.

system is an input if you observe it from a packaging point of view (rather than an output). It's a required parameter for derivation for example.

Writing flakes is cumbersome due to the cognitive overhead of looking up how outputs have to be structured around the system attribute and all the functions dealing with it.

All of the above makes it harder to start using flakes and harder to maintain a flake.

User requirements

system as an output

An example flake:

{
  description = "A very basic flake";

  inputs.flake-utils.url = "github:numtide/flake-utils";

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
        defaultPackage = nixpkgs.callPackage ./mypkg.nix {};
    );
}

system as an input

An example flake: