{
  description = "tlater.net host configuration";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05-small";
    nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable-small";
    disko = {
      url = "github:nix-community/disko";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    deploy-rs.url = "github:serokell/deploy-rs";
    sops-nix = {
      url = "github:Mic92/sops-nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    nvfetcher = {
      url = "github:berberman/nvfetcher";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    tlaternet-webserver = {
      url = "git+https://gitea.tlater.net/tlaternet/tlaternet.git";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    foundryvtt = {
      url = "github:reckenrode/nix-foundryvtt";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    sonnenshift = {
      url = "git+ssh://git@github.com/sonnenshift/battery-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs =
    {
      self,
      nixpkgs,
      sops-nix,
      nvfetcher,
      deploy-rs,
      ...
    }@inputs:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};

      vm = nixpkgs.lib.nixosSystem {
        inherit system;
        specialArgs.flake-inputs = inputs;

        modules = [
          ./configuration
          ./configuration/hardware-specific/vm.nix
        ];
      };
    in
    {
      ##################
      # Configurations #
      ##################
      nixosConfigurations = {
        # The actual system definition
        hetzner-1 = nixpkgs.lib.nixosSystem {
          inherit system;
          specialArgs.flake-inputs = inputs;

          modules = [
            ./configuration
            ./configuration/hardware-specific/hetzner
          ];
        };
      };

      ############################
      # Deployment configuration #
      ############################
      deploy.nodes = {
        hetzner-1 = {
          hostname = "116.202.158.55";

          profiles.system = {
            user = "root";
            path = deploy-rs.lib.${system}.activate.nixos self.nixosConfigurations.hetzner-1;
          };

          sshUser = "tlater";
          sshOpts = [
            "-p"
            "2222"
            "-o"
            "ForwardAgent=yes"
          ];
        };
      };

      #########
      # Tests #
      #########
      checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib;

      ###########################
      # Garbage collection root #
      ###########################

      packages.${system}.default = vm.config.system.build.vm;

      ###################
      # Utility scripts #
      ###################
      apps.${system} = {
        default = self.apps.${system}.run-vm;

        run-vm = {
          type = "app";
          program =
            let
            in
            (pkgs.writeShellScript "" ''
              ${vm.config.system.build.vm.outPath}/bin/run-testvm-vm
            '').outPath;
        };

        update-pkgs = {
          type = "app";
          program =
            let
              nvfetcher-bin = "${nvfetcher.packages.${system}.default}/bin/nvfetcher";
            in
            (pkgs.writeShellScript "update-pkgs" ''
              cd "$(git rev-parse --show-toplevel)/pkgs"
              ${nvfetcher-bin} -o _sources_pkgs -c nvfetcher.toml
            '').outPath;
        };

        update-nextcloud-apps = {
          type = "app";
          program =
            let
              nvfetcher-bin = "${nvfetcher.packages.${system}.default}/bin/nvfetcher";
            in
            (pkgs.writeShellScript "update-nextcloud-apps" ''
              cd "$(git rev-parse --show-toplevel)/pkgs"
              ${nvfetcher-bin} -o _sources_nextcloud -c nextcloud-apps.toml
            '').outPath;
        };
      };

      ###########################
      # Development environment #
      ###########################
      devShells.${system}.default = nixpkgs.legacyPackages.${system}.mkShell {
        sopsPGPKeyDirs = [
          "./keys/hosts/"
          "./keys/users/"
        ];
        nativeBuildInputs = [ sops-nix.packages.${system}.sops-import-keys-hook ];

        packages = with pkgs; [
          sops-nix.packages.${system}.sops-init-gpg-key
          deploy-rs.packages.${system}.default

          nixpkgs-fmt

          cargo
          clippy
          rustc
          rustfmt
          rust-analyzer
          pkg-config
          openssl
        ];
      };
    };
}