{
  description = "Flake providing Veloren, a multiplayer voxel RPG written in Rust.";

  inputs = {
    naersk = {
      url = "github:yusdacra/naersk/veloren";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    flakeUtils.url = "github:numtide/flake-utils";
    rustOverlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  };

  outputs = inputs: with inputs; with flakeUtils.lib;
    eachSystem [ "x86_64-linux" ] (system:
      let
        common = import ./nix/common.nix {
          sources = {
            inherit
              naersk
              nixpkgs
              rustOverlay
              ;
          };
          inherit system;
        };

        mkPackage = crateName: import ./nix/build.nix {
          inherit common;
          crateToBuild = crateName;
          sourceInfo =
            if self.sourceInfo ? rev
            then self.sourceInfo // {
              # Tag would have to be set manually for stable releases flake
              # because there's currently no way to get the tag via the interface.
              # tag = v0.8.0;
            }
            else (throw "Can't get revision because the git tree is dirty");
        };

        cratesToPackage = [ "veloren-voxygen" "veloren-server-cli" ];

        genAttrs = names: f:
          builtins.listToAttrs (map (n: { name = n; value = f n; }) names);
      in
      rec {
        packages = genAttrs cratesToPackage mkPackage;
        defaultPackage = packages.veloren-voxygen;

        apps = builtins.mapAttrs (n: v: mkApp { name = n; drv = v; }) packages;
        defaultApp = apps.veloren-voxygen;

        devShell = import ./nix/devShell.nix {
          inherit common;
        };
      }
    );
}