{
  description = "NixOS configuration";

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

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

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

    zremap = {
      url = "git+https://git.project-cloud.net/asmir/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/release-24.11";
      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,
      project-cloud,
      simple-nixos-mailserver,
      sops-nix,
      swaysw,
      zremap,
      ...
    }:
    let
      pkgs = nixpkgs.legacyPackages.x86_64-linux.pkgs;
    in
    {
      nixosConfigurations = rec {
        nixy = nixpkgs.lib.nixosSystem rec {
          system = "x86_64-linux";
          modules = [
            { _module.args = inputs; }
            { _module.args.system = system; }
            { 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 system; };
              home-manager.backupFileExtension = "home_backup";
            }
            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 rec {
          system = "x86_64-linux";
          modules = [
            { _module.args = inputs; }
            { _module.args.system = system; }
            { 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 system; };
            }
            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 rec {
          system = "x86_64-linux";
          modules = [
            { _module.args = inputs; }
            { _module.args.system = system; }
            { 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;
              home-manager.extraSpecialArgs = { inherit inputs system; };
            }
          ];
        };
        magpie = nixpkgs.lib.nixosSystem rec {
          system = "aarch64-linux";
          modules = [
            { _module.args = inputs; }
            { _module.args.system = system; }
            { nix.registry.nixpkgs.flake = nixpkgs; }
            ./magpie/configuration.nix
            ./magpie/hardware-configuration.nix
            simple-nixos-mailserver.nixosModule
            sops-nix.nixosModules.sops
            (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;
    };
}