{
  pkgs,
  lib,
  config,
  ...
}:
let
  # TODO ForkAwesome is deprecated, find something else
  fa = pkgs.fetchFromGitHub {
    owner = "ForkAwesome";
    repo = "Fork-Awesome";
    rev = "1.2.0";
    sha256 = "sha256-zG6/0dWjU7/y/oDZuSEv+54Mchng64LVyV8bluskYzc=";
  };
  data = config.frogeye.homepage // {
    sections = builtins.attrValues config.frogeye.homepage.sections;
    css = ./homepage.css;
    fa_css = "${fa}/css/fork-awesome.min.css";
  };
  # Blatantly stolen from https://pablo.tools/blog/computers/nix-mustache-templates/
  homepage = builtins.toString (
    pkgs.stdenv.mkDerivation {

      name = "homepage.html";

      nativeBuildInpts = [ pkgs.mustache-go ];

      passAsFile = [ "jsonData" ];
      jsonData = builtins.toJSON data;

      phases = [
        "buildPhase"
        "installPhase"
      ];

      buildPhase = ''
        ${pkgs.mustache-go}/bin/mustache $jsonDataPath ${./homepage.html.mustache} > homepage.html
      '';

      installPhase = ''
        cp homepage.html $out
      '';
    }
  );
in
{
  config.programs = {
    firefox.profiles.hm.settings."browser.startup.homepage" = homepage;
    qutebrowser.settings.url = {
      start_pages = homepage;
      default_page = homepage;
    };
  };
  options.frogeye.homepage = {
    sections = lib.mkOption {
      default = { };
      description = "Folders used by users";
      # Top-level so Syncthing can work for all users. Also there's no real home-manager syncthing module.
      type = lib.types.attrsOf (
        lib.types.submodule (
          { config, name, ... }:
          {
            options = {
              title = lib.mkOption {
                type = lib.types.str;
                default = "Section title";
              };
              color = lib.mkOption {
                type = lib.types.str;
                default = "#337ab7";
              };
              image = lib.mkOption {
                type = lib.types.nullOr lib.types.path;
                default = null;
              };
              url = lib.mkOption {
                type = lib.types.str;
                default = "about:blank";
              };
              links = lib.mkOption {
                default = [ ];
                type = lib.types.listOf (
                  lib.types.submodule (
                    { config, ... }:
                    {
                      options = {
                        name = lib.mkOption {
                          type = lib.types.str;
                          default = "Link";
                        };
                        url = lib.mkOption {
                          type = lib.types.str;
                          default = "about:blank";
                        };
                        icon = lib.mkOption {
                          type = lib.types.str;
                          default = "question-circle";
                        };
                      };
                    }
                  )
                );
              };
            };
          }
        )
      );
    };
  };
}