{
  lib,
  pageSpecs,
  indentSize ? "  ",
}:
let
  pageToLines =
    indent: parentName:
    {
      name,
      outFile ? "",
      pages ? { },
      ...
    }:
    let
      menuName = lib.strings.removePrefix (parentName + ".") name;
      children = builtins.attrValues pages;
      # Only add node to the menu if it has content or multiple children
      useNodeInMenu = outFile != "" || builtins.length children > 1;
      parentOfChildren = if useNodeInMenu then name else parentName;
    in
    lib.optional useNodeInMenu "${indent}- [${menuName}](${outFile})"
    ++ lib.optionals (children != [ ]) (
      builtins.concatMap (pageToLines (indent + indentSize) parentOfChildren) children
    );
in
lib.pipe pageSpecs [
  builtins.attrValues
  (builtins.concatMap (pageToLines "" ""))
  lib.concatLines
]