{
  description = "RocketCar is an online training tool for Rocket League car control";

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

    crane = {
      url = "github:ipetkov/crane";
      inputs.nixpkgs.follows = "nixpkgs";
    };

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

    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, crane, flake-utils, fenix, ... }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = import nixpkgs {
          inherit system;

          overlays = [
            fenix.overlays.default
          ];
        };

        craneLib = crane.lib.${system}.overrideToolchain
          fenix.packages.${system}.stable.toolchain;

        windowsToolchain = with fenix.packages.${system};
          combine [
            stable.rustc
            stable.cargo
            targets.x86_64-pc-windows-gnu.stable.rust-std
          ];

        windowsCraneLib = (crane.mkLib pkgs).overrideToolchain windowsToolchain;

        buildInputs = with pkgs; [
          # Add additional build inputs here
          alsa-lib
          udev
          libxkbcommon
          wayland
          vulkan-loader
        ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [
          # Additional darwin specific inputs can be set here
          pkgs.libiconv
        ];

        nativeBuildInputs = with pkgs; [
          pkg-config
        ];

        commonArgs = {
          inherit buildInputs nativeBuildInputs;

          src = ./.;
        };

        # Build *just* the cargo dependencies, so we can reuse
        # all of that work (e.g. via cachix) when running in CI
        cargoArtifacts = craneLib.buildDepsOnly (commonArgs // {
          # Additional arguments specific to this derivation can be added here.
          # Be warned that using `//` will not do a deep copy of nested
          # structures
          pname = "rocketcar";
        });

        rocketcar = craneLib.buildPackage (commonArgs // {
          inherit cargoArtifacts;
          postInstall = ''
            cp -r assets $out/bin
          '';
        });

        rocketcar-windows = windowsCraneLib.buildPackage {
          src = ./.;

          strictDeps = true;
          doCheck = false;

          CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu";

          depsBuildBuild = with pkgs; [
            pkgsCross.mingwW64.stdenv.cc
            pkgsCross.mingwW64.windows.pthreads
          ];

          installPhase = ''
            cp -r assets $out/bin
          '';
        };

      in
      {
        checks = {
          inherit rocketcar;
        };

        packages.default = rocketcar;

        packages.rocketcar-windows = rocketcar-windows;
        
        apps.default = flake-utils.lib.mkApp {
          drv = rocketcar;
        };

        devShells.default = pkgs.mkShell {
          inherit buildInputs;
          nativeBuildInputs = nativeBuildInputs ++ [
            (fenix.packages.${system}.stable.withComponents [
              "cargo"
              "clippy"
              "rust-src"
              "rustc"
              "rustfmt"
            ])
          ];

          inputsFrom = builtins.attrValues self.checks;

          LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs;
        };
      });
}