{
  description = "podcasting-rs - types and utilities for the PC 2.0 namespace";

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

  inputs.rust-overlay = {
    url = "github:oxalica/rust-overlay";
    inputs.nixpkgs.follows = "nixpkgs";
    inputs.flake-utils.follows = "flake-utils";
  };

  inputs.namespace = {
    url = "github:Podcastindex-org/podcast-namespace";
    flake = false;
  };

  outputs =
    {
      self,
      nixpkgs,
      flake-utils,
      rust-overlay,
      namespace,
    }:
    flake-utils.lib.eachDefaultSystem (
      system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
        stdenv =
          if pkgs.stdenv.isLinux then
            pkgs.stdenvAdapters.useMoldLinker pkgs.stdenv
          else
            pkgs.stdenv
        ;
        overlays = [ (import rust-overlay) ];
        rustPkgs = import nixpkgs { inherit system overlays; };
        src = self;
        name = "podcasting";
        RUST_TOOLCHAIN = src + "/rust-toolchain.toml";
        rustToolchainTOML = rustPkgs.rust-bin.fromRustupToolchainFile RUST_TOOLCHAIN;
        rustToolchainDevTOML = rustToolchainTOML.override {
          extensions = [
            "rustfmt"
            "clippy"
            "rust-analysis"
            "rust-docs"
          ];
          targets = [ ];
        };

        buildInputs = [
          pkgs.installShellFiles
          pkgs.sqlite
          pkgs.openssl
        ];
        nativeBuildInputs = [ pkgs.pkg-config ];
        devInputs = [
          rustToolchainDevTOML
          pkgs.just

          pkgs.cargo-bloat
          pkgs.cargo-deny
          pkgs.cargo-diet
          pkgs.cargo-dist
          pkgs.cargo-flamegraph
          pkgs.cargo-modules
          pkgs.cargo-nextest
          pkgs.cargo-outdated
          pkgs.cargo-public-api
          pkgs.cargo-unused-features
          pkgs.cargo-watch

          # snapshot testing
          pkgs.cargo-insta

          pkgs.openssl # for `cargo xtask`

          pkgs.reuse
          pkgs.lychee

          (pkgs.symlinkJoin {
            name = "cargo-udeps-wrapped";
            paths = [ pkgs.cargo-udeps ];
            nativeBuildInputs = [ pkgs.makeWrapper ];
            postBuild = ''
              wrapProgram $out/bin/cargo-udeps \
                --prefix PATH : ${
                  pkgs.lib.makeBinPath [
                    (rustPkgs.rust-bin.selectLatestNightlyWith (toolchain: toolchain.default))
                  ]
                }
            '';
          })
          (pkgs.symlinkJoin {
            name = "cargo-careful-wrapped";
            paths = [ pkgs.cargo-careful ];
            nativeBuildInputs = [ pkgs.makeWrapper ];
            postBuild = ''
              wrapProgram $out/bin/cargo-careful \
                --prefix PATH : ${
                  pkgs.lib.makeBinPath [
                    (rustPkgs.rust-bin.selectLatestNightlyWith (
                      toolchain: toolchain.default.override { extensions = [ "rust-src" ]; }
                    ))
                  ]
                }
            '';
          })
          #alternative linker
          pkgs.llvmPackages.bintools
          pkgs.mold
          pkgs.clang
        ];
        shellInputs = [
          pkgs.shellcheck
          pkgs.actionlint
        ];
        fmtInputs = [
          pkgs.alejandra
          pkgs.treefmt
          pkgs.typos
        ];
        editorConfigInputs = [ pkgs.editorconfig-checker ];
        actionlintInputs = [ pkgs.actionlint ];
      in
      {
        devShells = {
          default = (pkgs.mkShell.override { inherit stdenv; }) {
            buildInputs =
              shellInputs ++ fmtInputs ++ devInputs ++ buildInputs ++ nativeBuildInputs;
            inherit name;
            RUST_BACKTRACE = true;
            NAMESPACE_SCHEMA = namespace + "/docs/schema/podcast.xsd";
          };
          editorConfigShell = pkgs.mkShell { buildInputs = editorConfigInputs; };
          actionlintShell = pkgs.mkShell { buildInputs = actionlintInputs; };
          fmtShell = pkgs.mkShell { buildInputs = fmtInputs; };
        };
        formatter = pkgs.alejandra;
      }
    );
}
