{
  inputs,
  lib,
  ...
}: {
  # debug = true;
  # We only define machines config in this flake yet, so we only include
  # the module that builds these. This file might get fuller, if we need to
  # build our own packages, that are not flakes.
  imports = [
    ./nixos/flake-module.nix
    inputs.pre-commit-hooks.flakeModule
    # To import a flake module
    # 1. Add foo to inputs
    # 2. Add foo as a parameter to the outputs function
    # 3. Add here: foo.flakeModule
  ];
  systems = ["x86_64-linux"];
  perSystem = {
    config,
    pkgs,
    system,
    ...
  }: {
    devShells.default = config.pre-commit.devShell;

    pre-commit = let
      generatedFiles = [
        "hardware-configuration\\.nix"
      ];
    in {
      check.enable = true;
      settings = {
        hooks = {
          nil.enable = true;
          statix = {
            enable = true;
            settings = {
              format = "stderr";
              ignore = generatedFiles;
            };
          };
          deadnix = {
            enable = true;
            excludes = generatedFiles;
          };
          alejandra.enable = true;
        };
      };
    };

    formatter = pkgs.alejandra;

    # Per-system attributes can be defined here. The self' and inputs'
    # module parameters provide easy access to attributes of the same
    # system.
    _module.args.pkgs = import inputs.nixpkgs {
      inherit system;
      config.permittedInsecurePackages = ["jitsi-meet-1.0.8043"];

      overlays = [
        (_: prev: {
          alias-to-sieve = inputs.alias-to-sieve.packages.x86_64-linux.default; # add custom package to convert alias files to sieve scripts on the stalwart machine
          stalwart-mail = assert lib.assertMsg (prev.stalwart-mail.version == "0.11.6-unstable-2025-02-04") ''
            1. If the bug https://github.com/stalwartlabs/sieve/issues/11 is resolved to our satisfaction, try to remove this overlay.
            2. Check whether sieve-rs recieved new updates that our patch needs to be rebased upon.
            3. Check whether the sieve-rs patch below that exchanges the dependency needs updates.
            4. Then update the version comparison in this assert statement.
            5. Update the `cargoHash` by setting it to `lib.fakeHash` and then inserting the result.
            6. Check if we can get rid of alias-to-sieve when stalwart-mail has a builtin mail-forwarding feature.
          '';
          # This override encapsulates the buildRustPackage function in a function that takes the arguments given by the nixpkgs-version of stalwart-mail
          # and adds our patch to the arguments before handing the new arguments to buildRustPackage.
            prev.stalwart-mail.override (
              let
                rp = pkgs.rustPlatform;
              in {
                rustPlatform =
                  rp
                  // {
                    buildRustPackage = args:
                      rp.buildRustPackage (
                        args
                        // rec {
                          cargoPatches = [
                            # Let stalwart-mail depend on our own version of the sieve crate that does not have some “loop prevention” that disables redirects to the original sender.
                            # We want to redirect to sender if we simulate alias files and not doing so barely prevents loops in my opinion.
                            ./patches/sieve-rs.patch
                          ];
                          # Replace the string with `lib.fakeHash` after version changes in order to get the new hash value.
                          cargoHash = "sha256-gb2oFlVA/vE6DoWWW8SCFA3l7rtV2RuosPUY+6IcKNM=";
                        }
                      );
                  };
              }
            );
        })
      ];
    };
  };

  # Equivalent to  inputs'.nixpkgs.legacyPackages.hello;
  #      flake = {
  # The usual flake attributes can be defined here, including system-
  # agnostic ones like nixosModule and system-enumerating ones, although
  # those are more easily expressed in perSystem.

  #      };
}