{
  inputs.home-manager.inputs.nixpkgs.follows = "nixpkgs";
  inputs.home-manager.url = "github:nix-community/home-manager";
  inputs.neovim-nightly.url = "github:nix-community/neovim-nightly-overlay";
  inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";

  outputs =
    inputs@{ flake-parts, home-manager, neovim-nightly, nixpkgs, self, ... }:
    let
      overlays = [ neovim-nightly.overlay ];
    in
    flake-parts.lib.mkFlake { inherit inputs; } {
      systems = [ "x86_64-linux" ];

      perSystem = { pkgs, self', nixpkgs, ... }: {
        packages.default = self'.packages.activate;

        formatter = pkgs.nixpkgs-fmt;
      };

      flake = {
        nixosConfigurations = {
          apollo = nixpkgs.lib.nixosSystem {
            modules = [
              { nixpkgs.overlays = overlays; }

              ./system/nixos/apollo/configuration.nix

              home-manager.nixosModules.home-manager
              {
                home-manager.useGlobalPkgs = true;
                home-manager.useUserPackages = true;
                home-manager.users.opdavies = import ./home-manager/apollo.nix;
              }
            ];
          };

          nixedo = nixpkgs.lib.nixosSystem {
            modules = [
              { nixpkgs.overlays = overlays; }

              ./system/nixos/nixedo/configuration.nix

              home-manager.nixosModules.home-manager
              {
                home-manager.useGlobalPkgs = true;
                home-manager.useUserPackages = true;
                home-manager.users.opdavies = import ./home-manager/nixedo.nix;
              }
            ];
          };
        };

        homeConfigurations = {
          wsl2 = home-manager.lib.homeManagerConfiguration {
            modules = [{ nixpkgs.overlays = overlays; } ./system/wsl2.nix];
            pkgs = nixpkgs.legacyPackages.x86_64-linux;
          };
        };
      };
    };
}