{
  inputs = {
    flake-utils.url = "github:numtide/flake-utils";
    rainix.url = "github:rainprotocol/rainix";
  };

  outputs = { self, flake-utils, rainix }:

  flake-utils.lib.eachDefaultSystem (system:
    let
      pkgs = rainix.pkgs.${system};

      # cargo-expand is a bin used with macrotest crate for testing macros
      # need to build from source since it errors on macos with current rainix rust version 1.79
      # and the version available on rainix.pkgs is 1.0.100 which is not compatible with rust 1.79,
      # the latest version that works with rust 1.79 is v1.0.95 so we build form source
      cargo-expand = (pkgs.makeRustPlatform{
        rustc = rainix.rust-toolchain.${system};
        cargo = rainix.rust-toolchain.${system};
      }).buildRustPackage rec {
        pname = "cargo-expand";
        version = "1.0.95";
        src = pkgs.fetchFromGitHub {
          executable = true;
          owner = "dtolnay";
          repo = pname;
          tag = version;
          hash = "sha256-VEjgSmZcy/CZ8EO/mJ2nBOpQviF4A/QQ8SpLLF/9x4c=";
        };
        useFetchCargoVendor = true;
        cargoHash = "sha256-ow5Zy0tv9W5w+Pib2yW1nPj2pUZt0HhplHxjIZZZzU8=";
      };
    in rec {
      packages = rec {

        rainix-wasm-artifacts = rainix.mkTask.${system} {
          name = "rainix-wasm-artifacts";
          body = ''
            set -euxo pipefail
            cargo build -r --target wasm32-unknown-unknown
          '';
        };

        rainix-wasm-test = rainix.mkTask.${system} {
          name = "rainix-wasm-test";
          body = ''
            set -euxo pipefail
            CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER='wasm-bindgen-test-runner' cargo test --target wasm32-unknown-unknown --workspace
          '';
        };

        rainix-rs-test = rainix.mkTask.${system} {
          name = "rainix-rs-test";
          body = ''
            set -euxo pipefail
            cargo test --workspace
          '';
        };

        rainix-rs-artifacts = rainix.mkTask.${system} {
          name = "rainix-rs-artifacts";
          body = ''
            set -euxo pipefail
            cargo build --release --workspace
          '';
        };
      };

      # For `nix develop`:
      devShells.default = pkgs.mkShell {
        packages = [
          packages.rainix-wasm-artifacts
          packages.rainix-wasm-test
          packages.rainix-rs-test
          packages.rainix-rs-artifacts
          cargo-expand
        ];
        buildInputs = rainix.devShells.${system}.default.buildInputs;
        nativeBuildInputs = rainix.devShells.${system}.default.nativeBuildInputs;
      };
    }
  );
}