{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-parts.url = "github:hercules-ci/flake-parts";

    crane.url = "github:ipetkov/crane";

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

  outputs =
    {
      self,
      crane,
      flake-parts,
      fenix,
      ...
    }@inputs:
    flake-parts.lib.mkFlake { inherit inputs; } {
      systems = [ "x86_64-linux" ];

      flake = {
        nixosModules = import ./nix/nixos.nix self.packages;
      };

      perSystem =
        { pkgs, ... }@pinputs:
        let
          rs = import ./nix/rust.nix { inherit pkgs crane fenix; };
        in
        {
          packages = import ./nix/packages.nix pinputs rs;
          devShells = import ./nix/devshells.nix pinputs rs;
        };
    };
}