{ writeShellScriptBin, makeDesktopItem, symlinkJoin }:
{ html, pathName ? "home-manager", projectName ? pathName
, name ? "${pathName}-help" }:
let
  helpScript = writeShellScriptBin name ''
    set -euo pipefail

    if [[ ! -v BROWSER || -z $BROWSER ]]; then
      for candidate in xdg-open open w3m; do
        BROWSER="$(type -P $candidate || true)"
        if [[ -x $BROWSER ]]; then
          break;
        fi
      done
    fi

    if [[ ! -v BROWSER || -z $BROWSER ]]; then
      echo "$0: unable to start a web browser; please set \$BROWSER"
      exit 1
    else
      exec "$BROWSER" "${html}/share/doc/${pathName}/index.xhtml"
    fi
  '';

  desktopItem = makeDesktopItem {
    name = "${pathName}-manual";
    desktopName = "${projectName} Manual";
    genericName = "View ${projectName} documentation in a web browser";
    icon = "nix-snowflake";
    exec = "${helpScript}/bin/${name}";
    categories = [ "System" ];
  };
in symlinkJoin {
  inherit name;
  paths = [ helpScript desktopItem ];
}