The overlay(s) are mostly a convention right now that are supposed to contain either a single or a list of overlays. They are useful when a flake wants to extend nixpkgs with their own overrides.
Then on the consumer side you would do something like this:
{
description = "Flake utils demo";
inputs.flake-utils.url = "github:numtide/flake-utils";
# assuming that this flake exports an overlay attribute
inputs.someflake.url = "foo.com/bar";
outputs = { self, nixpkgs, flake-utils, someflake }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
overlays = [ someflake.overlay ];
};
in
# and here is the core of the consumer flake
{
defaultPackage = pkgs.hello;
}
);
}