Nix is good at packing software but historically is bad at packing nix expressions.
Nix flakes is a standardized way to distribute nix expressions.
All nix flakes use hermetic evaluation: they cannot access any source of impurities:
they don’t accept arguments
cannot accept environment variables
cannot access arbitrary filesystem locations
cannot fetchgit/fetchurl without specifying rev or sha
A flake has some meta information, inputs (other flakes), and outputs (packages, nixos modules, hydra configurations)