{
  description = "A highly structured configuration database.";

  inputs =
    {
      stable.url = "github:nixos/nixpkgs/release-21.11";
      unstable.url = "github:nixos/nixpkgs/nixos-unstable";

      nur.url = "github:nix-community/NUR";

      digga.url = "github:divnix/digga";
      digga.inputs.nixpkgs.follows = "stable";
      digga.inputs.nixlib.follows = "stable";
      digga.inputs.home-manager.follows = "unstable";

      bud.url = "github:divnix/bud";
      bud.inputs.nixpkgs.follows = "unstable";
      bud.inputs.devshell.follows = "digga/devshell";

      home.url = "github:nix-community/home-manager/release-21.11";
      home.inputs.nixpkgs.follows = "unstable";

      darwin.url = "github:LnL7/nix-darwin";
      darwin.inputs.nixpkgs.follows = "unstable";

      deploy.follows = "digga/deploy";

      nvfetcher.url = "github:berberman/nvfetcher";
      nvfetcher.inputs.nixpkgs.follows = "unstable";
      nvfetcher.inputs.flake-compat.follows = "digga/deploy/flake-compat";
      nvfetcher.inputs.flake-utils.follows = "digga/flake-utils-plus/flake-utils";

      emacs-overlay.url = github:nix-community/emacs-overlay;

      nixos-hardware.url = "github:nixos/nixos-hardware";

      pinebook-pro = {
        url = "github:samueldr/wip-pinebook-pro/7df87f4f3baecccba79807c291b3bbd62ac61e0f";
        flake = false;
      };
      pinebook-pro-kernel-latest.url = github:nixos/nixpkgs/755db9a1e9a35c185f7d6c0463025e94ef44622e;

      nixpkgs-wayland.url = "github:nix-community/nixpkgs-wayland";
      nixpkgs-wayland.inputs.nixpkgs.follows = "unstable";
      nixpkgs-wayland.inputs.cachix.follows = "unstable";
    };

  outputs =
    { self
    , digga
    , bud
    , nixos
    , home
    , nixos-hardware
    , darwin
    , pinebook-pro
    , pinebook-pro-kernel-latest
    , nixpkgs-wayland
    , emacs-overlay
    , nur
    , nvfetcher
    , deploy
    , ...
    } @ inputs:

    digga.lib.mkFlake
      {
        inherit self inputs;

        channelsConfig = { allowUnfree = true; };

        channels =
          let
            commonOverlays = [
              nur.overlay
              emacs-overlay.overlay
              nvfetcher.overlay
              deploy.overlay
              #nixpkgs-wayland.overlay
              ./pkgs/default.nix
            ];
          in
          {
            stable = {
              imports = [ (digga.lib.importOverlays ./overlays) ];
              overlays = commonOverlays;
            };
            unstable = {
              imports = [ (digga.lib.importOverlays ./overlays) ];
              overlays = commonOverlays;
            };
          };

        lib = import ./lib { lib = digga.lib // nixos.lib; };

        sharedOverlays = [
          (
            final: prev: {
              __dontExport = true;
              lib = prev.lib.extend (
                lfinal: lprev: {
                  our = self.lib;
                }
              );
            }
          )
        ];

        nixos = {
          hostDefaults = {
            channelName = "unstable";
            imports = [ (digga.lib.importExportableModules ./modules) ];
            modules = [
              { lib.our = self.lib; }
              digga.nixosModules.bootstrapIso
              digga.nixosModules.nixConfig
              home.nixosModules.home-manager
              bud.nixosModules.bud
            ];
          };
          hosts = {
            # mbp is added bypassing Digga's mkFlake and adding a specific output to this flake
            pc = {
              system = "x86_64-linux";
              imports = [{ modules = ./hosts/pc; }];
            };
            hs = {
              system = "x86_64-linux";
              imports = [{ modules = ./hosts/hs; }];
            };
            pbp = {
              system = "aarch64-linux";
              imports = [{ modules = ./hosts/pbp; }];
              modules = [
                "${pinebook-pro}/pinebook_pro.nix"
              ];
            };
          };
          # imports = [ (digga.lib.importHosts ./hosts) ]; # same reason as above
          importables = rec {
            profiles = digga.lib.rakeLeaves ./profiles // {
              users = digga.lib.rakeLeaves ./users;
            };
            suites = with profiles; rec {
              base = [ core users.ccr users.root ];
            };
            pbpKernelLatest = (
              import pinebook-pro-kernel-latest {
                system = "aarch64-linux";
                overlays = [
                  (import "${pinebook-pro}/overlay.nix")
                ];
                config.allowUnfree = true;
              }
            ).pkgs.linuxPackages_pinebookpro_latest;
          };
        };

        home = {
          imports = [ (digga.lib.importExportableModules ./users/modules) ];
          modules = [ ];
          importables = rec {
            profiles = digga.lib.rakeLeaves ./users/profiles;
            suites = with profiles; rec {
              base = [ direnv git zsh gpg password-store ];
              emails = [ mails ];
              shell = [ zsh exa fzf ];
              gui = [ sway xdg gtk foot bat ];
              browser = [ firefox chromium qutebrowser tor-browser ];
              multimedia = [ mpv zathura ];
              dev = [ vim emacs vscode lorri direnv ];
              modelling = [ blender cura ];
            };
          };
        };

        devshell = ./shell;

        homeConfigurations = digga.lib.mkHomeConfigurations self.nixosConfigurations;

        deploy.nodes = digga.lib.mkDeployNodes self.nixosConfigurations { };

        defaultTemplate = self.templates.bud;
        templates.bud.path = ./.;
        templates.bud.description = "bud template";

      }
    // {
      budModules = { devos = import ./bud; };

      # checks.aarch64-linux = { }; # ga-uncomment
      # checks.x86_64-darwin = { }; # ga-uncomment
      # packages.x86_64-darwin = { }; # ga-uncomment

      darwinConfigurations."mbp" = darwin.lib.darwinSystem {
        system = "x86_64-darwin";
        modules = [ home.darwinModules.home-manager ./hosts/mbp ];
        inputs = { inherit darwin; };
        specialArgs = { inherit emacs-overlay; };
      };
    };
}