{
  description = "NixOS configuration";

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

    nix-xilinx = {
      url = "gitlab:asmir.abdulahovic/nix-xilinx";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    peerix = {
      url = "gitlab:asmir.abdulahovic/peerix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    zremap = {
      url = "gitlab:asmir.abdulahovic/zremap";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    swaysw = {
      url = "git+https://git.project-cloud.net/asmir/swaysw";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    nvim = {
      url = "git+https://git.project-cloud.net/asmir/nvim_flake";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    sops-nix = {
      url = "github:Mic92/sops-nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    simple-nixos-mailserver = {
      url = "gitlab:simple-nixos-mailserver/nixos-mailserver";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    project-cloud = {
      url = "git+https://git.project-cloud.net/asmir/project-cloud";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = inputs @ {
    home-manager,
    nixpkgs,
    nix-xilinx,
    nvim,
    peerix,
    simple-nixos-mailserver,
    sops-nix,
    swaysw,
    zremap,
    project-cloud,
    ...
  }: let
    pkgs = nixpkgs.legacyPackages.x86_64-linux.pkgs;
  in {
    nixosConfigurations = rec {
      nixy = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [
          {_module.args = inputs;}
          {nix.registry.nixpkgs.flake = nixpkgs;}
          ./common/packages.nix
          ./common/suspend.nix
          ./nixy/configuration.nix
          ./nixy/hardware-configuration.nix
          sops-nix.nixosModules.sops
          home-manager.nixosModules.home-manager
          {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.users.akill = import ./home/home.nix;
            home-manager.extraSpecialArgs = {inherit inputs;};
          }
          peerix.nixosModules.peerix
          {
            services.peerix = {
              enable = true;
              globalCacheTTL = 10;
              package = peerix.packages.x86_64-linux.peerix;
              openFirewall = true; # UDP/12304
              privateKeyFile = nixy.config.sops.secrets."peerix/private".path;
              publicKeyFile = ./nixy/peerix-public;
              publicKey = "peerix-mediabox:UDgG3xdQYv7bmx2l4ZPNRPJtp2zMmY++H/fnGeJ9BQw=";
            };
          }
        ];
      };

      mediabox = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [
          {_module.args = inputs;}
          {nix.registry.nixpkgs.flake = nixpkgs;}
          ./common/packages.nix
          ./common/suspend.nix
          ./mediabox/configuration.nix
          ./mediabox/hardware-configuration.nix
          ./modules/qbittorrent.nix
          sops-nix.nixosModules.sops
          home-manager.nixosModules.home-manager
          {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.users.akill = import ./home/home.nix;
            home-manager.extraSpecialArgs = {inherit inputs;};
          }
          peerix.nixosModules.peerix
          {
            services.peerix = {
              enable = true;
              globalCacheTTL = 10;
              package = peerix.packages.x86_64-linux.peerix;
              openFirewall = true; # UDP/12304
              privateKeyFile = mediabox.config.sops.secrets."peerix/private".path;
              publicKeyFile = ./mediabox/peerix-public;
              publicKey = "peerix-nixy:8THqS0R2zWF/47ai0RFmqJnieYTZ1jaWOD9tnzpvA6s=";
            };
          }
        ];
      };

      blue = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [
          {_module.args = inputs;}
          {nix.registry.nixpkgs.flake = nixpkgs;}
          ./blue/configuration.nix
          ./blue/hardware-configuration.nix
          ./common/packages.nix
          home-manager.nixosModules.home-manager
          {
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.users.akill = import ./home/home.nix;
          }
        ];
      };
      magpie = nixpkgs.lib.nixosSystem {
        system = "arm64-linux";
        modules = [
          {_module.args = inputs;}
          {nix.registry.nixpkgs.flake = nixpkgs;}
          ./magpie/configuration.nix
          ./magpie/hardware-configuration.nix
          sops-nix.nixosModules.sops
          simple-nixos-mailserver.nixosModule
          (builtins.toPath "${nixpkgs}/nixos/modules/profiles/qemu-guest.nix")
        ];
      };
    };

    devShell.x86_64-linux = pkgs.mkShell {
      buildInputs = with pkgs; [sops ssh-to-age age];
      shellHook = ''
        echo "Configuring NixOS!"
      '';
    };

    formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.alejandra;
  };
}