{
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  outputs = { self, nixpkgs }: rec {
    overlay = final: prev: {
      gitit = prev.callPackage ./gitit {};
    };

    # Provide module for gitit
    nixosModules = builtins.listToAttrs (map (x: {
      name = x;
      value = import (./modules + "/${x}");
    }) (builtins.attrNames (builtins.readDir ./modules)));

    # Provide the gitit binary. nixpkgs does provide the binary as well, but
    # it's built from a version that has a critical bug, login doesn't work
    packages.x86_64-linux.gitit = with nixpkgs.legacyPackages.x86_64-linux;
      callPackage ./gitit {};
    defaultPackage.x86_64-linux = packages.x86_64-linux.gitit;

    # Nixos integration tests for basic functionality
    checks.x86_64-linux.gitit =
      nixpkgs.legacyPackages.x86_64-linux.nixosTest (
        import ./test.nix { modules = builtins.attrValues self.nixosModules; }
        );

    # For playing around in a container
    # sudo nixos-container create gitit --flake .
    nixosConfigurations.container = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules =
        [ ({ pkgs, ... }: {
          imports = builtins.attrValues self.nixosModules ++ [];
          boot.isContainer = true;
          environment.systemPackages = [
          ];


          # Let 'nixos-version --json' know about the Git revision
          # of this flake.
          system.configurationRevision = nixpkgs.lib.mkIf (self ? rev) self.rev;

          # Network configuration.
          networking.useDHCP = false;
          networking.firewall.allowedTCPPorts = [ 5001 ];

          services.gitit = {
            enable = true;
          };
        })
      ];
    };

  };
}